No projeto web AplicaçãoServidor crie um pacote chamado controle. Dentro desse pacote crie 4 classes cujos nomes são os que seguem:
- ActionClasses
- MyControllerCallBack
- XMLResources
- MyActions
Observe a estrutura na aba de projetos do NetBeans:
O código das classes MyControllerCallBack e XMLResources é um padrão do OpenSwing e não varia, é, portanto, sempre o mesmo para qualquer aplicação.
A interface org.openswing.swing.server.Action é quem recebe diretamente a requisição do cliente. Ela assina dois métodos: executeCommand() e getRequestName(), este último retorna uma string com o nome da implementação, de modo que o cliente use este nome como parâmetro, indicando que a requisição deve ir para esta classe. O desenvolvedor pode criar quantas implementações quiser para Action, de acordo com as regras de negócio estabelecidas.
Para o projeto AplicaçãoServidor, o código das classes deve ser exatamente como que segue:
package controle; import javax.servlet.ServletContext; import org.openswing.swing.server.ControllerCallbacks; /** * * @author OS * * class of type org.openswing.swing.server.ControllerCallbacks , an application specific class that contains additional initialization logic for the web application. * The afterInit() method of this interfacce is automatically invoked by the Controller servlet after its initialization and can be used to add further logic, * that depends on the specific application. */ public class MyControllerCallBack extends ControllerCallbacks{ public MyControllerCallBack() { } @Override public void afterInit(ServletContext context) { } }
XMLResources.java
package controle; import org.openswing.swing.internationalization.java.XMLResourcesFactory; import org.openswing.swing.internationalization.server.ServerResourcesFactory; import java.util.Hashtable; import org.openswing.swing.internationalization.java.Resources; import javax.servlet.ServletContext; /** * Internacionalizacao suporte */ public class XMLResources extends ServerResourcesFactory { private XMLResourcesFactory factory = null; public XMLResources() { } /** * Method called by the server controller (Controller object) to initialize the factory. * @param context */ @Override public void init(ServletContext context) { Hashtable xmlFiles = new Hashtable(); //xmlFiles.put("EN",this.getClass().getResource("/").getPath()+"Resources_en.xml"); //xmlFiles.put("IT",this.getClass().getResource("/").getPath()+"Resources_it.xml"); factory = new XMLResourcesFactory(xmlFiles,true); } /** * Load dictionary, according to the specified language id. * @param langId language id identifier */ @Override public final void setLanguage(String langId) throws UnsupportedOperationException { factory.setLanguage(langId); } /** * @return internationalization settings, according with the current language */ @Override public final Resources getResources() { return factory.getResources(); } /** * @param langId language id identifier * @return internationalization settings, according with the language specified */ @Override public final Resources getResources(String langId) throws UnsupportedOperationException { return factory.getResources(langId); } }A classe org.openswing.swing.server.ActionsCollections estende Hashtable. Cada implementação da interface Action deve ser inserida nesta Collection, onde a chave é definida pelo retorno do método getRequestName(), e o valor é a própria instancia de Action.
ActionClasses.java:
package controle; import org.openswing.swing.server.Action; import org.openswing.swing.server.ActionsCollection; public class ActionClasses extends ActionsCollection { public ActionClasses() { Action action = null; action = new MyActions(); put(action.getRequestName(), action); } }
Como foi dito, você pode criar quantas implementações quiser para a interface Action, de acordo com as regras de negócio da aplicação. Neste exemplo, a regra é retornar ao cliente um objeto do tipo org.openswing.swing.message.receive.java.Response que encapsula a string Hello World From Server!.
MyActions.java
MyActions.java
package controle; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.openswing.swing.message.receive.java.Response; import org.openswing.swing.message.receive.java.TextResponse; import org.openswing.swing.server.Action; import org.openswing.swing.server.UserSessionParameters; public class MyActions implements Action{ @Override public Response executeCommand(Object inputPar, UserSessionParameters userSessionPars, HttpServletRequest request, HttpServletResponse response, HttpSession userSession, ServletContext context) { Object[] clientParams = (Object[]) inputPar; String methodName = (String) clientParams[0]; if(methodName.equals("enviarHelloWorld")){ //sempre uma implementação da classe abstrata Response deve ser retornada ao cliente return new TextResponse("Hello World From Server!"); } return null; } @Override public String getRequestName() { return "MyActions"; } }Agora você deve definir a implementação dessas classes como parêmetros de inicialização da Servlet controller do OpenSwing, adicionando as tags corespondentes ao arquivo web.xml. Veja como fica a versão final do mesmo:
Aplicação Clientecontroller org.openswing.swing.server.Controller sessionIdGenerator org.openswing.swing.server.DefaultSessionIdGenerator logger org.openswing.swing.logger.server.ConsoleLogger objectsReceiver org.openswing.swing.util.server.HessianObjectReceiver connectionSource org.openswing.swing.server.PoolerConnectionSource controllerCallback controle.MyControllerCallBack resourceFactory controle.XMLResources actionClasses controle.ActionClasses 1 50 controller /controller
O projeto AplicacaoCliente envia uma requisição ao servidor, se tudo correr bem, recebe de volta um objeto do tipo org.openswing.swing.message.receive.java.Response que encapsula a mensagem Hello WorldFrom Server! em um painel de diálogo.
No pacote cliente do projeto crie a classe principal ClientApplication. O código é como segue:
package cliente; import java.util.Hashtable; import java.util.Properties; import javax.swing.JOptionPane; import org.openswing.swing.internationalization.java.BrazilianPortugueseOnlyResourceFactory; import org.openswing.swing.message.receive.java.Response; import org.openswing.swing.message.receive.java.TextResponse; import org.openswing.swing.util.client.ClientSettings; import org.openswing.swing.util.client.ClientUtils; import org.openswing.swing.util.client.HessianObjectSender; public class ClientApplication { public static void main(String[] args) throws Exception{ //url do servidor String serverUrl = "http://localhost:8082/AplicacaoServidor/controller"; setConexaoServidor(serverUrl); String serverSideActionClassName = "MyActions"; String methodName = "enviarHelloWorld"; Response serverResponse = ClientUtils.getData(serversideActionClassName, new Object[]{methodName}); if(serverResponse.isError()) throw new Exception("Erro ao conectar o servidor"); //recebe o texto de resposta String serverMessage = ((TextResponse)serverResponse).getMessage(); JOptionPane.showMessageDialog(null, serverMessage); } //configura a conxão remota private static void setConexaoServidor(String serverUrl) { System.setProperty("SERVERURL", serverUrl); ClientUtils.setObjectSender(new HessianObjectSender()); ClientSettings clientSettings = new ClientSettings( new BrazilianPortugueseOnlyResourceFactory(new Properties(), false), new Hashtable() ); } }Execute o projeto AplicacaoCliente para exibir a mensagem recebida: