Visão Geral das Bibliotecas do Adaptador RPC

A chamada remota da Web é um padrão que fornece suporte para o código JavaScriptTM ou do lado do cliente para chamar diretamente a lógica do lado do servidor. Esse padrão fornece a possibilidade de chamar os métodos JavaTM a partir do JavaScript. A chamada é feita por meio de uma chamada JSON-RPC. O uso mais comum são chamadas assíncronas com XmlHttpRequest. Os dados são transferidos entre o servidor e o cliente em formato de JSON. Portanto, esse padrão é basicamente um formulário de serviços da Web de JSON.

Apresentando o Adaptador RPC

A implementação IBM® para a chamada remota da Web é referida como um adaptador RPC para IBM. O Adaptador RPC foi projetado para ajudar desenvolvedores a criar serviços baseados em comando de modo rápido e fácil, de uma forma que complementa os estilos de programação para aplicativos Ajax e outros clientes pequenos. Implementado como um servlet genérico, o Adaptador RPC fornece uma interface de HTTP para JavaBeans registrados.

Adaptador RPC
O Adaptador RPC atualmente suporta dois protocolos de RPC:

RPC de HTTP

No RPC de HTTP, as chamadas são feitas utilizando URLs com parâmetros de consulta ou parâmetros de formulário. O adaptador do RPC intercepta e desserializa a URL para obter o nome do serviço, o nome do método e os parâmetros de entrada. Utilizando essas informações, o Adaptador RPC chama o método correspondente de JavaBeans correspondentes.

Por exemplo, os clientes podem chamar test.Example.getEcho("Hello world") nos seguintes JavaBeans:

package test; public class Example { public String getEcho(String message) { return(message); } } Chame o test.Example.getEcho("Hello world") por meio do RPC de HTTP utilizando HTTP GET como segue:

GET /contextRoot/RPCAdapter/httprpc/example/echo?p0=Hello%20world HTTP/1.1

Todas essas chamadas precisam ser feitas depois de você ter configurado corretamente o Adaptador RPC para trabalhar com o seu aplicativo. Para essa configuração correta, você precisa incluir o arquivo JAR (Arquivo de Java) do RPCAdapter no WEB-INF/lib do arquivo WAR e fazer as entradas a seguir no arquivo web.xml. <servlet> <display-name>RPCAdapter</display-name> <servlet-name>RPCAdapter</servlet-name> <servlet-class>com.ibm.websphere.rpcadapter.RPCAdapter</servlet-class> </servlet> <servlet-mapping> <servlet-name>RPCAdapter</servlet-name> <url-pattern>/RPCAdapter</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RPCAdapter</servlet-name> <url-pattern>/RPCAdapter/*</url-pattern> </servlet-mapping> Especifique um arquivo RpcAdapterConfig.xml no diretório WEB-INF. Esse arquivo é utilizado para configurar os serviços que são exportados. Nesse caso, um arquivo RpcAdapterConfig.xml de amostra é semelhante ao seguinte exemplo: <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>Exemplo</name> <implementation>test.pojo.Sample</implementation> </pojo> </services> </rpcAdapter> A API do RPC de HTTP atribui p0 como o nome do primeiro argumento. Esse comportamento padrão é devido a limitações atuais nas APIs de reflexo de Java. Nomes de parâmetros significativos podem ser atribuídos com informações do descritor do bean ou por meio da especificação de nomes de parâmetros no arquivo RpcAdapterConfig.xml. Por exemplo, consulte getEcho() neste bean: package test; import com.ibm.websphere.rpcadapter.SelfBeanInfo; public class Example2 implements SelfBeanInfo { public String getEcho(String message) { return(message); } public static String[][] getBeanDescriptorInfo() { String [][] mds = { {"method", "getEcho", "Echoes the input String.", "GET", "message", "String to be echoed."}, }; return(mds); } } O exemplo acima pode ser chamado como: GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1 package test; public class Example2 { public String getEcho(String message) { return(message); } } O exemplo acima pode ser chamado como: GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1

com o seguinte RpcAdapterConfig.xml. <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>exemplo</name> <implementation>test.pojo.Example2</implementation> <methods filter="whitelisting"> <method> <name>echo</name> <description>faz eco da mensagem</description> <parameters> <parameter> <name>message</name> <description>Contém a mensagem da qual será feito eco.</description> <!--optional--> </parameter> </parameters> </method> </methods> </pojo> </services> </rpcAdapter>

O elemento default-format no arquivo de configuração especifica o formato padrão a ser utilizado quando o formato não for especificado no pedido. Esse formato pode ser XML ou JSON.

JSON-RPC

Em JSON-RPC, a solicitação de método é feita utilizando objetos JSON. A resposta gerada também é um objeto JSON. Os JavaBeans registrados podem ser acessados através da API de JSON-RPC do Dojo: var example = new dojo.rpc.JsonService("/contextRoot/RPCAdapter/jsonrpc/example"); example.getEcho('Hello world').addCallback(exampleCallback); function exampleCallback(result) { // a resposta está disponível como result.getEchoReturn.String }

Especificando as Informações do Descritor do Bean

No adaptador do RPC, utilize as informações do descritor do bean para especificar informações sobre JavaBeans disponíveis. Se você não especificar um descritor do bean, as informações serão obtidas por meio de reflexo. É possível especificar as informações do descritor do bean de duas maneiras. Considere os JavaBeans chamados de Amostra mostrados abaixo: package test.pojo; import java.util.List; import java.util.Vector; /** * Exemplo mostrando acesso de Bean customizado especificado com uma classe BeanInfo separada. * Esta amostra é instrutiva para casos em que a classe Bean não pode ser modificada. * * @see test.pojo.SampleBeanInfo * @see test.pojo.SampleNoBeanInfo * @see test.pojo.SampleSelfBeanInfo */ public class Sample { /** * Repete a Cadeia de entrada. Essa operação sem estado funciona corretamente * independentemente da definição do descritor do bean <code>oneInstancePerUser</code>. * * @param message Cadeia a ser repetida. */ public String echo(String message) { return(message); } public String echoNoArg() { return("Hello World"); } public boolean echoBoolean(boolean b) { return(b); } public boolean echoIntegerBean(boolean b) { return(b); } List _values = new Vector(); /** * Inclui um valor em uma lista que pode ser recuperado com o método <code>getValues</code>. * Esse cenário com estado exige que o descritor do bean <code>oneInstancePerUser</code> * seja definido como true. * * @param value Cadeia incluída na lista. */ public void addValue(String value) { _values.add(value); } /** * Retorna a lista cumulativa de valores incluídos no método <code>addValue</code>. * Esse cenário com estado exige que o descritor do bean <code>oneInstancePerUser</code> * seja definido como true. * * @return Lista de Cadeias anteriormente incluídas na lista. */ public List getValues() { return(_values); } } É possível criar um objeto BeanInfo chamado SampleBeanInfo para descrever a Amostra JavaBeans. Observe como a classe de BeanInfo tem SimplerBeanInfo como seu pai. Observe também que você precisa chamar setBeanClass no construtor com Sample.class como o parâmetro. package test.pojo; import com.ibm.websphere.rpcadapter.SimplerBeanInfo; /** * Classe BeanInfo de exemplo mostrando as informações do descritor de tipo declarativo * suportadas pelo adaptador RPC. * * @see test.pojo.Sample */ public class SampleBeanInfo extends SimplerBeanInfo { /** * SimplerBeanInfo utiliza Reflexo Java; é necessário definir a classe Bean primeiro. */ public SampleBeanInfo() { setBeanClass(Sample.class); } public String[][] getBeanDescriptorInfo() { String [][] mds = { {"bean", "oneInstancePerUser", "true"}, {"method", "echo", "Echoes the input String.", "GET", "message", "String to be echoed."}, {"method", "echoNoArg", "Echoes Hello World.", "GET" }, {"method", "addValue", "Adds a value to a list.", "GET", "value", "value to add"}, {"method", "getValues", "Returns the list.", "GET"}, {"method", "echoBoolean", "Echoes a boolean value.", "GET", "b", "Boolean to be echoed."}, }; return(mds); } } Uma outra maneira de especificar o descritor do bean é incluir as informações dele na própria classe de bean. Observe que a classe de bean implementa a interface SelfBeanInfo. Ele também deve possuir um método estático getBeanDescriptorInfo() que retorna informações sobre JavaBeans. package test.pojo; import java.util.List; import java.util.Vector; import com.ibm.websphere.rpcadapter.SelfBeanInfo; /** * Exemplo mostrando acesso de Bean customizado especificado com informações descritivas * integradas. Essa amostra é instrutiva para casos em que o Bean pode ser * modificado. * * @see test.pojo.SampleNoBeanInfo * @see test.pojo.Sample */ public class SampleSelfBeanInfo implements SelfBeanInfo { /** * Repete a Cadeia de entrada. Essa operação sem estado funciona corretamente * independentemente da definição do descritor do bean <code>oneInstancePerUser</code>. * * @param message Cadeia a ser repetida. */ public String echo(String message) { return(message); } List _values = new Vector(); /** * Inclui um valor em uma lista que pode ser recuperado com o método <code>getValues</code>. * Esse cenário com estado exige que o descritor do bean <code>oneInstancePerUser</code> * seja definido como true. * * @param value Cadeia incluída na lista. */ public void addValue(String value) { _values.add(value); } /** * Retorna a lista cumulativa de valores incluídos no método <code>addValue</code>. * Esse cenário com estado exige que o descritor do bean <code>oneInstancePerUser</code> * seja definido como true. * * @return Lista de Cadeias anteriormente incluídas na lista. */ public List getValues() { return(_values); } public static String[][] getBeanDescriptorInfo() { String [][] mds = { {"bean", "oneInstancePerUser", "true"}, {"method", "echo", "Echoes the input String.", "GET", "message", "String to be echoed."}, {"method", "addValue", "Adds a value to a list.", "GET", "value", "value to add"}, {"method", "getValues", "Returns the list.", "GET"}, }; return(mds); } } Uma situação importante para observar é que não deve haver nenhuma classe de BeanInfo no caminho de classe se você não desejar utilizar BeanInfo. Isso ocorre porque o Adaptador RPC verifica classes de BeanInfo incluindo BeanInfo no nome de classe POJO e, em seguida, tenta carregar essas informações primeiro. Também é necessário registrar os objetos que você precisa expor no RPCAdapterConfig.xml sem considerar se utiliza ou não BeanDescriptors.

Estrutura do Pacote

    Essa biblioteca é distribuída em uma versão independente:
 
    Pacote Independente

        Esse pacote é organizado da seguinte maneira para o WebSphere® Application Server V8.5
<install_root>/optionalLibraries/web2mobile/rpcAdapter/RPCAdapter.jar
Os arquivos de classe Java empacotados em um formato JAR (Java archive) que implementam a API.



Termos de Uso | Feedback