
Panorama completo do cliente de serviço da Web JAX-WS assíncrono
Colaboração e manutenção de Jaroslav Pospisil, Milan Kuchtiak e Geertjan Wielenga
Este documento orienta você nas noções básicas do uso do IDE para desenvolver um cliente de serviço da Web JAX-WS que consome um serviço da Web ao vivo assincronamente. O serviço da Web ao vivo é o serviço eSynaps Web Service Search. Ele retorna URLs que apontam para serviços da Web que contêm uma dada seqüência de pesquisa. Por exemplo, se você enviar a seqüência "tempo" para o serviço da Web, é retornada uma lista de URLs para serviços da Web que fornecem informações sobre o tempo. Neste tutorial, usamos uma classe Java simples em um aplicativo Java SE como o cliente.
Clientes de serviço da Web assíncrono consomem serviços da Web através da abordagem "sondagem" ou da abordagem "retorno de chamada". Na abordagem "sondagem", você chama um método de serviço da Web e solicita os resultados repetidamente. A sondagem é uma operação de bloqueio porque bloqueia o segmento que está realizando a chamada, que é a razão pela qual você não quer usá-la em um aplicativo GUI. Na abordagem "retorno de chamada", você passa por um manipulador de retorno de chamada durante a chamada do método de serviço da Web. O método handleResponse() do manipulador é chamado quando o resultado estiver disponível. Esta abordagem é apropriada para aplicativos GUI porque não é necessário esperar a resposta. Por exemplo, você faz uma chamada a partir de um manipulador de eventos de GUI e retorna o controle imediatamente, mantendo a interface de usuário receptiva. O inconveniente da abordagem de sondagem é que, mesmo que a resposta seja consumida após ser capturada, você tem de sondar para descobrir que foi capturada. Assim, iremos usar a abordagem de retorno de chamada, que continua como normalmente até o retorno da resposta. O manipulador toma a resposta e a manipula. Iremos usar esta abordagem em nosso exemplo para manipular os URLs encontrados pelo serviço da Web. Primeiro iremos analisar os URLs para remover marcas XML e em seguida iremos exibi-las em um JTextArea.
Assim que tivermos um aplicativo em funcionamento, iremos migrá-lo para a plataforma NetBeans, permitindo-nos herdar a arquitetura modular da plataforma NetBeans, assim como os recursos de GUI disponíveis para o desenvolvimento de aplicativos rich-client no IDE.
Duração prevista: 45 minutos
Software necessário para o cenário
Antes de começar, é necessário instalar os seguintes softwares no computador:
Conteúdo
Instalando e configurando o ambiente de trabalho
Instale o NetBeans 5.5 e execute o IDE. Uma vez que este cenário usa um cliente de serviço da Web em um projeto Java SE, não há necessidade de ter instalado o servidor de aplicativos Sun Java System 9.0.
Criando um aplicativo Java SE e um cliente de serviço da Web
Para criar um cliente de serviço da Web, primeiro precisamos de um aplicativo Java SE, de um módulo EJB ou de módulo da Web. Usaremos aqui um aplicativo Java SE.
- Escolha Arquivo > Novo projeto (Ctrl-Shift-N). Selecione Aplicativo Java na categoria Geral. Clique em Próximo.
- Nomeie o projeto AsyncWSClient. Desmarque a caixa de seleção Criar classe principal. Clique em Finalizar.
- Na janela Projetos, clique com o botão direito do mouse no nó do projeto AsyncWSClient e selecione Novo > Arquivo/Pasta (Ctrl+N). No assistente para Novo arquivo, selecione Serviços da Web na lista Categorias e Cliente de serviço da Web na lista Tipos de arquivos. Clique em Próximo.
- Selecione URL de WSDL e digite ou cole o seguinte URL de WSDL:
http://www.esynaps.com/WebServices/SearchWS.asmx?WSDL
- Digite org.me.wsc em Pacote. Clique em Finalizar.
A janela Projetos exibe o novo cliente de serviço da Web, dentro do nó Referências de serviços da Web:
- Clique com o botão direito do mouse em SearchWS e selecione Editar atributos do serviço da Web. Aparece o editor de Editar atributos do serviço da Web.
- No editor, expanda Pesquisar. Marque a caixa de seleção Habilitar cliente assíncrono, como mostrado abaixo:
- Clique em OK.
Agora aparece esta caixa de diálogo:
- Clique em OK.
Observe a janela Saída e note que o IDE está invocando destinos Ant para gerar os necessários artefatos JAX-WS do lado do cliente.
Interação assíncrona com um serviço da Web
Agora que usamos o IDE para gerar o cliente de serviço da Web para consumir o serviço da Web SearchWS, podemos continuar. Oficialmente, o serviço da Web SearchWS tem somente uma operação, Search, que pesquisa URLs na Web, usando a palavra de pesquisa que fornecemos como um parâmetro de solicitação. No entanto, a execução desta operação pode levar tempo. Portanto, se consumirmos o resultado de uma maneira assíncrona padronizada e simplesmente esperarmos, nosso fluxo de trabalho poderá ser interrompido. Assim, consumiremos o resultado assincronamente, que é o propósito deste tutorial.
Já concluímos a primeira etapa — possibilitamos que o cliente de serviço da Web permita a chamada de operação assíncrona. Se expandir o nó SearchWS, você verá que agora há três operações, como mostrado abaixo:
Como discutido na introdução, iremos usar a operação Search [Async Callback] mostrada na tomada de tela acima. Informações mais detalhadas sobre as diferenças entre as duas abordagens assíncronas encontram-se em https://jax-ws.dev.java.net/jax-ws-20-fcs/docs/asynch.html.
Criando a interface de usuário
Para que o usuário possa especificar uma seqüência de pesquisa, enviá-la para o serviço da Web e ver o resultado, precisamos criar uma interface de usuário. O Construtor de GUI do NetBeans, também conhecido como Matisse, facilita bastante a criação desta parte do aplicativo.
- Clique com o botão direito do mouse no projeto AsyncWSClient e selecione Novo > Arquivo/Pasta (Ctrl+N). Na categoria Formulários Java GUI, escolha Formulário JFrame e clique em Próximo. Nomeie o formulário MainForm e digite org.me.forms em Pacote. Clique em Finalizar.
- Adicione estes controles da Paleta de componentes (Ctrl-Shift-8) e altere as propriedades, como listadas no quadro abaixo:
| Componente |
Propriedade |
Valor |
| JLabel |
Texto |
Insira texto de pesquisa: |
| JTextField |
Texto |
|
|
Nome da variável |
tfWord |
| JButton |
Texto |
Pesquisa |
|
Nome da variável |
btSearch |
| JProgressBar |
stringPainted |
Ativado |
|
Nome da variável |
pgProgress |
| JLabel |
Texto |
URLs encontradas: |
| JTextArea |
segundo plano |
[204,204,204] |
|
editável |
Não ativado |
|
lineWrap |
Ativado |
|
Nome da variável |
taResults |
Observação: Use a janela Propriedades (Ctrl-Shift-7) para alterar as propriedades acima. Todas as propriedades acima podem ser alteradas na guia Propriedades da janela Propriedades, exceto o nome da variável, que é definida na guia Código. No entanto, uma maneira mais fácil de modificar o nome da variável é clicar com o botão direito do mouse no componente e usar o item de menu Alterar nome da variável.
Observe também que, embora você coloque um JTextArea diretamente no formulário, o construtor de GUI coloca este JTextArea em um JScrollPane.
- Reordene e redimensione os componentes até a interface de usuário ter esta aparência:
Adicionando lógica empresarial
Iremos interagir com o serviço da Web usando a abordagem de retorno de chamada assíncrona fornecida por JAX-WS no Java EE 5, como discutimos na introdução a este tutorial. Iremos usar um método assíncrono em nosso cenário para manipular os URLs encontrados pelo serviço da Web. Primeiro iremos analisar os URLs para remover marcas XML e em seguida iremos exibi-los em nosso JTextArea.
- Para adicionar código que analise os URLs retornados, clique no botão Fonte no lado esquerdo superior do Editor de fontes e, em seguida, efetue rolagem até o fim do arquivo. Logo acima do parêntese de fechamento que encerra a classe, adicione este método:
private String removeTags(String str){
String text = str;
text = text.replaceAll("<Results><url>","");
text = text.replaceAll("</url><url>","/\n");
text = text.replaceAll("</url></Results>","");
return text;
}
Normalmente você usaria um analisador XML para analisar o resultado, mas para o propósito deste tutorial basta String.replace().
- Em segundo lugar, adicione o código de cliente assíncrono. Abaixo do método que você adicionou na etapa anterior, adicione este:
public void callAsyncCallback(String word){
}
- Na janela Projetos, expanda o nó Referências de serviços da Web > SearchWS > WebSearchWS > WebSearchWSSoap, como mostrado abaixo:
- Arraste o nó Search [Async Callback] da janela Projetos e solte-o no método callAsyncCallback que você criou na etapa 2 acima.
Após soltá-lo, sem qualquer código adicional de sua parte, você deve ver o seguinte:
public void callAsyncCallback(String word) {
try { // Call Web Service Operation(async. callback)
org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
// TODO inicializar argumentos da operação SW aqui
java.lang.String keyWord = "";
javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
public void handleResponse(javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
try {
// TODO processar resposta assíncrona aqui
System.out.println("Result = "+ response.get());
} catch (Exception ex) {
// TODO exceção de manipulação
}
}
};
java.util.concurrent.Future<? extends java.lang.Object> result = port.searchAsync(keyWord, asyncHandler);
while(!result.isDone()) {
// do something
Thread.sleep(100);
}
} catch (Exception ex) {
// TODO manipular exceções personalizadas aqui
}
}
Observação: Há uma maneira alternativa de deixar o IDE gerar o fragmento do código acima para você. No método callAsyncCallback, clique com o botão direito do mouse no Editor de fontes e selecione Recursos do cliente de serviço da Web > Chamar operação de serviço da Web. Na caixa de diálogo que aparece, selecione a operação Search [Async Callback] e clique em OK.
- Agora modifique o fragmento do código gerado para passar a palavra que é inserida no JTextField para o serviço da Web e colocar o resultado no JTextArea. Além disso, certifique-se de agendar as chamadas Swing dentro do segmento de despacho de evento (AWT). O bloco try/catch que foi gerado para você não é necessário neste cenário. A maneira mais fácil de fazer esta alteração é copiar/colar o código abaixo:
public void callAsyncCallback(String word){
org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
public void handleResponse(final javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
String results = "";
try {
results = response.get().getSearchResult();
results = removeTags(results);
taResults.setText(results);
} catch (Exception ex) {
ex.printStackTrace();
}
pgProgress.setIndeterminate(false);
pgProgress.setString("");
btSearch.setEnabled(true);
}
});
}
};
port.searchAsync(word, asyncHandler);
}
- Por fim, precisamos de uma instrução de importação para a classe javax.swing.Utilities. Para que o IDE gere a instrução de importação para você, clique com o botão direito do mouse no Editor de fontes e escolha Corrigir importações (Alft-Shift-F).
Associando a interface de usuário à lógica empresarial
A seguir, associamos a lógica que fornecemos na seção anterior à interface de usuário. A conexão com o serviço da Web é feita quando o usuário clica no JButton. Quando o botão é clicado, a barra de progresso é ativada e o método de retorno de chamada, invocado.
- Na exibição Design, clique com o botão direito do mouse no JButton e selecione Eventos > Ação > ActionPerformed, como mostrado abaixo:
O editor passa para a exibição Fonte e se abre no método btSearchActionPerformed.
- Insira o código realçado, mostrado abaixo:
private void btSearchActionPerformed(java.awt.event.ActionEvent evt) {
String word = tfWord.getText();
pgProgress.setIndeterminate(true);
pgProgress.setString("waiting for server");
btSearch.setEnabled(false);
callAsyncCallback(word);
}
Primeiro definimos a barra de progresso como modo indeterminado, para que seja executada continuamente, e em seguida definimos o texto como "waiting for server" [aguardando servidor]. Em seguida o método de retorno de chamada assíncrono é invocado e a palavra recuperada do JTextField é transferida para ele.
Executando o aplicativo
Nosso aplicativo Swing simples agora está concluído e podemos experimentá-lo.
- Clique com o botão direito do mouse no projeto e escolha Executar projeto. Você é solicitado a definir org.me.forms.MainForm como a classe principal. Clique em OK.
O aplicativo é construído e executado.
- Escreva uma palavra, por exemplo "tempo" no JTextField e clique em Pesquisar. A barra de progresso é ativada, como mostrado abaixo:
Após alguns segundos, a barra de progresso pára e os resultados são exibidos no JTextArea, como mostrado abaixo:
Se JTextArea ficar vazio após a parada da barra de progresso, clique novamente em Pesquisar para repetir a pesquisa. O servidor da Internet, onde o serviço da Web usado neste cenário está armazenado, às vezes fica congestionado pelos pedidos dos clientes.
Observação: Se você estiver protegido por um firewall, o aplicativo terá conhecimento automático do servidor proxy e da porta proxy corretos a serem usados. Quando você criou o cliente de serviço da Web, as configurações do sistema foram gravadas na propriedade run.jvmargs, no arquivo project.properties. Se clicar com o botão direito do mouse no projeto, na janela Projetos, escolher Propriedades e, em seguida, clicar na categoria Executar, você também verá os valores gerados no campo Opções da VM. Se necessário, poderá alterá-los.
Estendendo e distribuindo o aplicativo
Agora que temos um aplicativo concluído e em funcionamento, chegou o momento de pensar em como estendê-lo rápida e eficientemente. Por exemplo, talvez queiramos adicionar uma barra de ferramentas do Google ao aplicativo. Uma abordagem simples que nos permite fazer isso é mover o aplicativo para a plataforma NetBeans. Uma vez que esteja na plataforma NetBeans, o aplicativo poderá ter seu próprio assistente para a Central de atualizações, idêntico ao assistente para a Central de atualizações do IDE no menu Ferramentas, que nos possibilitará adicionar módulos externos, como o módulo da barra de ferramentas do Google.
Precisamos também pensar nas estratégias para distribuir o aplicativo. Quando construímos um projeto do Java, o IDE cria um arquivo JAR na pasta dist do aplicativo. Em vez disso, talvez queiramos fornecer um arquivo executável, ou, além dele, o arquivo JAR. Outra maneira de iniciar o aplicativo é através de um navegador, usando a tecnologia Java Web Start. Quando movemos o aplicativo para a plataforma NetBeans, o IDE está capacitado para oferecer suporte ao aplicativo de várias maneiras, que incluem criar uma distribuição ZIP e um aplicativo iniciável pela Web, através de um clique em um item de menu.
Empacotando a infra-estrutura
O aplicativo Swing simples contém diversos artefatos que podemos disponibilizar para a plataforma NetBeans através de módulos de "empacotador". Um módulo de empacotador é um módulo que não contém código, mas coloca bibliotecas em uma classpath do aplicativo. Precisamos colocar vários arquivos JAR na classpath do aplicativo. Em primeiro lugar, precisamos dos artefatos JAX-WS do lado do cliente que o IDE gerou para nós. Em segundo lugar, precisamos dos arquivos JAR do Java EE 5 aos quais fizemos referência no Formulário JFrame. Assim que esses arquivos JAR estiverem na classpath, poderemos usá-los no aplicativo da plataforma NetBeans.
- Clique com o botão direito do mouse no projeto e escolha Construir projeto. Na janela Arquivos (Ctrl-2), examine a pasta dist e observe que há um arquivo JAR chamado AsyncWSClient.jar. Entre outros arquivos, o arquivo JAR contém os artefados JAX-WS do lado do cliente que usamos para interagir com o serviço da Web nas seções anteriores.
Agora iremos criar um projeto de conjunto de módulos para fornecer a estrutura do novo aplicativo rich-client.
- Escolha Arquivo > Novo projeto (Ctrl-Shift-N) e escolha Projeto de conjunto de módulos na categoria Módulos de plug-in do NetBeans. Clique em Próximo. Crie um projeto de conjunto de módulos chamado WebServiceLocator. Clique em Finalizar.
A janela Projetos mostra a estrutura do projeto para o novo aplicativo WebServiceLocator. A estrutura do projeto representa o esqueleto de um aplicativo construído sobre a plataforma NetBeans.
Agora precisamos adicionar ao aplicativo o arquivo JAR que contém os artefatos do cliente do serviço da Web.
- Na janela Projetos, expanda o projeto WebServiceLocator, clique com o botão direito do mouse em Módulos, escolha Adicionar novas bibliotecas e crie um projeto Módulo de empacotador de bibliotecas. No campo de texto Biblioteca, navegue até a pasta dist, que contém o arquivo JAR discutido na etapa 1, acima. Você deve ver algo semelhante ao seguinte:
Selecione o AsyncWSClient.jar, mostrado na tomada de tela acima. Não se preocupe com o arquivo de licença neste estágio. Clique em Próximo.
- Preserve o nome padrão AsyncWSClient. Clique em Próximo e, em seguida, clique em Finalizar.
Você agora forneceu um empacotador de arquivo JAR e o colocou na classpath do aplicativo, de modo que os artefatos JAX-WS do lado do cliente estão disponíveis para a interação com o serviço da Web.
- Como descrito na etapa anterior, crie outro projeto Módulo de empacotador de bibliotecas. Desta vez, empacote todos os arquivos JAR contidos na pasta lib, mostrada na tomada de tela acima.
Observação: Selecione todos os arquivos JAR que você encontrar na pasta lib usando as teclas Ctrl e Shift juntamente com o mouse.
Os arquivos JAR na pasta lib são necessários porque fornecem a infra-estrutura JAX-WS de que precisa a lógica empresarial que você fornecerá na próxima seção.
Adicionando a interface de usuário e a lógica empresarial
Nesta seção, você recria a interface de usuário que construiu na primeira parte deste tutorial. No entanto, em vez de criá-la em um Formulário JFrame, você irá criá-la em um TopComponent. Um TopComponent é uma classe que pertence às APIs do NetBeans. Ela incorpora um componente visual ao NetBeans IDE, ou a um aplicativo construído na plataforma NetBeans, como o que você está criando agora. Criar a interface de usuário em um TopComponent é tão fácil como fornecê-la em um Formulário JFrame, porque ambos são suportados pelo intuitivo Construtor de GUI, também conhecido como Matisse. Quando tiver o TopComponent, será necessário fornecer a lógica empresarial para se conectar aos artefatos JAX-WS do lado do cliente que você empacotou no início desta seção. Por fim, será necessário unir a interface de usuário à lógica empresarial, exatamente como antes.
- Escolha Arquivo > Novo projeto e escolha Projeto de módulo na categoria Módulos de plug-in do NetBeans. Clique em Próximo. Crie um projeto de módulo chamado AsyncWSClientUI. Deixe que o assistente adicione o novo módulo ao conjunto de módulos e selecione Definir como projeto principal, como mostrado abaixo:
Clique em Próximo.
- No painel Configuração básica de módulos, digite o nome base de código que desejar, como org.netbeans.modules.asyncwsclientui. Clique em Finalizar.
Após clicar em Finalizar no fim do assistente, clique com o botão direito do mouse no nó do projeto AsyncWSClientUI, escolha Propriedades e, na guia Fontes, defina o nível de fonte como 1.5, porque iremos usar genéricos no código. Quando solicitado, escolha ativar avisos, se desejar, embora isso não seja importante para este cenário do tutorial.
- Clique com o botão direito do mouse no nó do projeto AsyncWSClientUI e escolha Novo > Componente de janela. Crie um componente de janela e, na primeira página do assistente, especifique que deve ser localizado na posição da janela "editor" e se abrir quando o aplicativo for iniciado. Especifique AsyncWSClient para o Prefixo do nome da classe. Não é necessário especificar um ícone. Clique em Finalizar.
- No arquivo Bundle.Properties, altere a chave CTL_AsyncWSClientTopComponent como a seguir:
CTL_AsyncWSClientTopComponent=Window
- Consulte as seguintes subseções anteriores para recriar a interface de usuário e a lógica empresarial subjacente:
Observação: Você verá diversas linhas sublinhadas em vermelho. Essas linhas indicam que há dependências de código que não foram declaradas. Nas próximas etapas, você irá declarar as dependências necessárias.
- Clique com o botão direito do mouse no nó do projeto AsyncWSClientUI, escolha Propriedades e, na caixa de diálogo Propriedades do projeto, escolha Bibliotecas. Clique em Adicionar dependência. Adicione as seguintes dependências, se não estiverem adicionadas: AsyncWSClient, JAX-WS-JARS, Integração de extensões de layout Swing, API de utilitários IU, API de utilitários, API do sistema de janelas. Repita esta etapa para o projeto AsyncWSClient, mas desta vez somente adicione JAX-WS-JARS.
- Clique com o botão direito do mouse no projeto WebServiceLocator e escolha Limpar e construir tudo. Isto irá construir o aplicativo inteiro e deverá resultar na mensagem CONSTRUÇÃO BEM-SUCEDIDA na janela Saída.
Aperfeiçando e executando o aplicativo
Agora temos um aplicativo completo, consistindo em três partes — o núcleo do aplicativo, que é a plataforma NetBeans; todos os módulos fornecidos pelo NetBeans IDE; e, finalmente, nossos próprios módulos — os dois módulos de empacotador e o módulo que fornece a interface de usuário e a lógica empresarial. No entanto, não precisamos dos módulos fornecidos pelo NetBeans IDE, e por isso, antes de continuarmos, iremos excluir esses módulos do aplicativo. Em seguida, porque desejamos que o aplicativo se assemelhe ao máximo ao aplicativo original, iremos também remover todos os menus e todas as barras de menu fornecidos por padrão pela plataforma NetBeans. Além disso, iremos definir o título para a barra de títulos do aplicativo. Iremos executar o aplicativo a partir do NetBeans IDE e testá-lo, e constatar que o aplicativo é um cliente de serviço da Web totalmente funcional para o serviço da Web com que trabalhamos na primeira parte deste tutorial.
- Clique com o botão direito do mouse no nó do projeto WebServiceLocator, escolha Propriedades e clique em Aplicativo na caixa de diálogo Propriedades do projeto. Selecione Criar aplicativo independente. Clique em Excluir, como mostrado abaixo:
Altere o Título do aplicativo para "Web Service Locator", adicionando espaços a "WebServiceLocator". Clique em OK.
- Expanda AsyncWSClientUI, expanda Arquivos importantes, expanda Camada XML, expanda <this layer in context>, expanda Barra de menu. Selecione o conteúdo da Barra de menu (Ctrl-mouse no primeiro, Shift-mouse no último). Clique com o botão direito do mouse, escolha Excluir e clique em Sim quando solicitado a confirmar a exclusão. Aguarde alguns momentos enquanto o IDE adiciona marcas ao arquivo layer.xml. Repita o mesmo processo na pasta Barras de ferramentas. Na exibição XML do arquivo Camada XML, observe que as seguintes marcas foram adicionadas:
<folder name="Menu">
<file name="Edit_hidden"/>
<file name="File_hidden"/>
<file name="GoTo_hidden"/>
<file name="Help_hidden"/>
<file name="Tools_hidden"/>
<file name="View_hidden"/>
<file name="Window_hidden"/>
</folder>
<folder name="Toolbars">
<file name="Edit_hidden"/>
<file name="File_hidden"/>
<file name="Memory_hidden"/>
<file name="Standard.xml_hidden"/>
</folder>
Observação: Em vez de usar o item de menu Excluir, como descrito nesta etapa, você pode simplesmente colar as marcas acima diretamente no arquivo layer.xml.
- Clique com o botão direito do mouse no aplicativo Web Service Locator e escolha Executar. O aplicativo é iniciado, mostra a tela de abertura padrão da plataforma NetBeans e em seguida exibe seu novo aplicativo.
Observação: Na primeira vez que você executar o aplicativo, ele será muito grande. Isto porque usa a resolução padrão da plataforma NetBeans. Se você redimensionar o aplicativo enquanto ele estiver em execução, as configurações serão salvas. No entanto, se limpar o projeto, usando os comandos Limpar ou Construir e limpar projeto, as configurações serão perdidas e a resolução do aplicativo retornará às configurações padrão da plataforma NetBeans.
Experimente o aplicativo e observe que ele funciona da mesma forma que o aplicativo original, exceto que agora está sendo executado na plataforma NetBeans, como mostrado abaixo:
Se o componente da janela não se abrir altomaticamente, ou se você a fechar acidentalmente antes de executar as etapas abaixo, basta inserir isto no arquivo layer.xml e reiniciar o aplicativo a partir do IDE, e abrir o componente da janela a partir do recém-criado menu Cliente:
<folder name="Menu">
<folder name="Client">
<file name="org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.shadow">
<attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.instance"/>
</file>
</folder>
</folder>
Em seguida remova as marcas acima do arquivo layer.xml e execute o aplicativo novamente. O menu não estará mais presente, mas o componente da janela irá se abrir, porque seu estado de aberto foi salvo quando você o abriu através do item de menu.
- Na janela Arquivos (Ctrl-2), expanda Web Service Locator, expanda branding e em seguida expanda modules: Expanda org-netbeans-core-windows.jar e continue expandindo até você chegar ao arquivo Bundle.properties. Abra o arquivo e observe estes pares de valor-chave:
CTL_MainWindow_Title=Web Service Locator {0}
CTL_MainWindow_Title_No_Project=Web Service Locator {0}
Agora remova o {0} de cada linha. Ao fazê-lo, você remove o número que aparece na barra de título na tomada de tela na etapa 3, acima. Quando executar o aplicativo novamente, e testá-lo, você verá o seguinte:
Criando uma distribuição
Uma vez concluído o aplicativo básico, você pode fornecer uma distribuição para ele. A distribuição pode ser na forma de um arquivo ZIP, como discutido abaixo, ou como um aplicativo iniciável pela Web.
- Clique com o botão direito do mouse no aplicativo Web Service Locator e escolha Construir distribuição ZIP. O IDE executa um destino Ant. A janela Saída mostra onde o arquivo ZIP é criado.
- No sistema de arquivos, localize o arquivo ZIP e descompacte-o. Na pasta etc da distribuição, há um arquivo CONF. Abra este arquivo e defina o JDK. Por exemplo, defina como a seguir:
jdkhome="C:\Arquivos de programas\Java\jdk1.5.0_06"
- Em seguida, adicione -J-Dnb.tabs.suppressCloseButton=true à variável default_options. Isto ocultará o "x" no canto direito superior do componente da janela para que o usuário não possa fechá-la.
Agora o arquivo CONF tem a aparência abaixo, com as alterações em negrito:
# ${HOME} será substituído pela propriedade de sistema JVM user.home
default_userdir="${HOME}/.${APPNAME}/dev"
default_mac_userdir="${HOME}/Library/Application Support/${APPNAME}/dev"
# opções usadas pelo iniciador por padrão, podem ser substituídas por alternâncias
# de linha de comando explícitas
default_options="-J-Xms24m -J-Xmx64m -J-Dnetbeans.logger.console=true -J-ea -J-Dnb.tabs.suppressCloseButton=true"
# local padrão de JDK/JRE, pode ser substituído usando -- alternância jdkhome <dir>
jdkhome="C:\Arquivos de programas\Java\jdk1.5.0_06"
# caminhos de clusters separados por path.separator (ponto-e-vírgula no Windows, dois pontos em Unices)
#extra_clusters=
- Execute o aplicativo a partir do executável na pasta bin. Observe que agora não há um "x" no canto direito superior da guia:
Adicionando uma barra de ferramentas do Google ao aplicativo
Um dos módulos que o IDE fornece adiciona o item de menu "Update Center" ao menu Ferramentas. Quando o usuário seleciona este item de menu, o assistente para Central de atualizações se abre. Usando este assistente, os módulos podem ser selecionados e instalados em um aplicativo, permitindo que o usuário extenda e enriqueça um aplicativo com facilidade e eficiência.
- Crie a barra de ferramentas do Google.
- Para poder instalá-la, ou qualquer outro módulo, clique com o botão direito do mouse no aplicativo Web Service Locator e escolha Propriedades. Na caixa de diálogo Propriedades do projeto, clique em Bibliotecas. Expanda nb5.5 e selecione Update Centers.
- Em seguida, expanda platform6 e selecione Auto Update. Clique em OK para sair da caixa de diálogo Propriedades do projeto.
- No arquivo layer.xml, exclua a marca que oculta o menu Ferramentas:
<file name="Tools_hidden"/>
- Clique com o botão direito do mouse e escolha Limpar e construir tudo. Clique com o botão direito do mouse e escolha Executar projeto.
- No menu Ferramentas, escolha Central de atualizações e use-a para instalar módulos. Por exemplo, se você instalar a barra de ferramentas do Google, e fornecer ao navegador HTML externo módulos dependentes do aplicativo, o aplicativo poderá ter esta aparência:
|
|