Visión general de las bibliotecas de adaptador RPC

El uso remoto de Web (Web remoting) es un patrón que proporciona soporte de JavaScriptTM o código del lado del cliente para invocar directamente la lógica del lado del servidor. Este patrón proporciona la posibilidad de invocar métodos JavaTM desde JavaScript. La invocación se realiza mediante una llamada JSON-RPC. El uso más común es para las llamadas asíncronas con XmlHttpRequest. Los datos se transfieren entre el servidor y el cliente en formato JSON. Por lo tanto, este patrón es básicamente un formato de servicios Web JSON.

Introducción al adaptador RPC

La implementación IBM® para el uso remoto de Web se denomina adaptador RPC para IBM. El adaptador RPC está diseñado para ayudar a los desarrolladores a crear servicios basados en mandatos de forma rápida y sencilla, para que complemente los estilos de programación de las aplicaciones Ajax y otros clientes ligeros. El adaptador RPC se implementa como un servlet genérico y proporciona una interfaz HTTP para los JavaBeans registrados.

Adaptador RPC
El adaptador RPC actualmente da soporte a dos protocolos RPC:

HTTP RPC

En HTTP RPC, las invocaciones se realizan utilizando los URL con parámetros de consulta o parámetros de formulario. El adaptador RPC intercepta y deserializa el URL para obtener el nombre de servicio, el nombre de método y los parámetros de entrada. Utilizando esta información, el adaptador RPC invoca el método correspondiente de los JavaBeans coincidentes.

Por ejemplo, los clientes pueden invocar test.Example.getEcho("Hello world") en los siguientes JavaBeans:

package test; public class Example { public String getEcho(String message) { return(message); } } Invoque test.Example.getEcho("Hello world") mediante HTTP RPC utilizando HTTP GET de la siguiente manera:

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

Todas estas invocaciones deben realizarse una vez configurado correctamente el adaptador RPC para que funcione con la aplicación. Para esta configuración correcta, tiene que añadir el archivo JAR (archivo Java) de RPCAdapter al directorio WEB-INF/lib del archivo WAR y realizar las siguientes entradas en el archivo 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 un archivo RpcAdapterConfig.xml en el directorio WEB-INF. Este archivo se utiliza para configurar los servicios que se exportan. En este caso, un archivo RpcAdapterConfig.xml de ejemplo es parecido al siguiente ejemplo: <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>Sample</name> <implementation>test.pojo.Sample</implementation> </pojo> </services> </rpcAdapter> La API HTTP RPC derivada asigna p0 como nombre del primer argumento. Este comportamiento predeterminado se debe a las limitaciones actuales en las API de reflejo Java. Pueden asignarse nombres de parámetro significativos con la información del descriptor de beans o especificando nombres de parámetro en el archivo RpcAdapterConfig.xml. Por ejemplo, observe getEcho() en este 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); } } El ejemplo anterior puede invocarse como: GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1 package test; public class Example2 { public String getEcho(String message) { return(message); } } El ejemplo anterior puede invocarse como: GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1

con el siguiente RpcAdapterConfig.xml. <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>ejemplo</name> <implementation>test.pojo.Example2</implementation> <methods filter="whitelisting"> <method> <name>echo</name> <description>Repite el mensaje</description> <parameters> <parameter> <name>mensaje</name> <description>Contiene el mensaje que se va a repetir.</description> <!--optional--> </parameter> </parameters> </method> </methods> </pojo> </services> </rpcAdapter>

El elemento default-format en el archivo de configuración especifica el formato predeterminado que se utilizará cuando no se especifique el formato en la petición. Este formato puede ser XML o JSON.

JSON-RPC

En JSON-RPC, la invocación de método se realiza utilizando objetos JSON. La respuesta generada también es un objeto JSON. Puede acceder a los JavaBeans registrados mediante la API Dojo JSON-RPC: var example = new dojo.rpc.JsonService("/contextRoot/RPCAdapter/jsonrpc/example"); example.getEcho('Hello world').addCallback(exampleCallback); function exampleCallback(result) { // la respuesta está disponible como result.getEchoReturn.String }

Especificación de la información del descriptor de beans

En el adaptador RPC, utilice la información del descriptor de beans para especificar información sobre los JavaBeans que hay disponibles. Si no especifica un descriptor de beans, la información se obtendrá mediante reflejos. Puede especificar información del descriptor de beans de dos formas. Considere los JavaBeans denominados Sample que se muestran a continuación. package test.pojo; import java.util.List; import java.util.Vector; /** * Ejemplo que muestra el acceso de bean personalizado que se especifica con una clase BeanInfo aparte. * Este ejemplo es ilustrativo para aquellos casos en los que no se puede modificar la clase Bean. * * @see test.pojo.SampleBeanInfo * @see test.pojo.SampleNoBeanInfo * @see test.pojo.SampleSelfBeanInfo */ public class Sample { /** * Repite la serie de entrada. Esta operación sin estado funciona correctamente * independientemente del valor del descriptor de bean <code>oneInstancePerUser</code>. * * @param serie de mensaje que se va a repetir. */ 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(); /** * Añade un valor a una lista que se puede recuperar con el método <code>getValues</code>. * Este caso de ejemplo con estado requiere que el descriptor de bean <code>oneInstancePerUser</code> * se establezca en true. * * @param serie de valor que se añade a la lista. */ public void addValue(String value) { _values.add(value); } /** * Devuelve la lista acumulativa de valores añadidos con el método <code>addValue</code>. * Este caso de ejemplo con estado requiere que el descriptor de bean <code>oneInstancePerUser</code> * se establezca en true. * * @return Lista de series añadidas previamente a la lista. */ public List getValues() { return(_values); } } Puede crear un objeto BeanInfo denominado SampleBeanInfo para describir los JavaBeans de tipo Sample. Observe cómo la clase BeanInfo tiene SimplerBeanInfo como padre. Asimismo, tenga en cuenta que deberá invocar setBeanClass en el constructor con Sample.class como parámetro. package test.pojo; import com.ibm.websphere.rpcadapter.SimplerBeanInfo; /** * Clase BeanInfo de ejemplo que muestra información de descriptor de tipo declarativo * soportada por el adaptador RPC. * * @see test.pojo.Sample */ public class SampleBeanInfo extends SimplerBeanInfo { /** * SimplerBeanInfo utiliza el reflejo Java; debe establecer primero la clase Bean. */ 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); } } Otra forma de especificar el descriptor de beans es incluir la información del descriptor de beans en la propia clase de bean. Tenga en cuenta que la clase de bean implementa la interfaz SelfBeanInfo. También debería tener un método estático getBeanDescriptorInfo() que devolviera información sobre los JavaBeans. package test.pojo; import java.util.List; import java.util.Vector; import com.ibm.websphere.rpcadapter.SelfBeanInfo; /** * Ejemplo que muestra el acceso de bean personalizado que se especifica con información * descriptiva incorporada. Este ejemplo es ilustrativo para aquellos casos en los que puede * modificarse el bean. * * @see test.pojo.SampleNoBeanInfo * @see test.pojo.Sample */ public class SampleSelfBeanInfo implements SelfBeanInfo { /** * Repite la serie de entrada. Esta operación sin estado funciona correctamente * independientemente del valor del descriptor de bean <code>oneInstancePerUser</code>. * * @param serie de mensaje que se va a repetir. */ public String echo(String message) { return(message); } List _values = new Vector(); /** * Añade un valor a una lista que se puede recuperar con el método <code>getValues</code>. * Este caso de ejemplo con estado requiere que el descriptor de bean <code>oneInstancePerUser</code> * se establezca en true. * * @param serie de valor que se añade a la lista. */ public void addValue(String value) { _values.add(value); } /** * Devuelve la lista acumulativa de valores añadidos con el método <code>addValue</code>. * Este caso de ejemplo con estado requiere que el descriptor de bean <code>oneInstancePerUser</code> * se establezca en true. * * @return Lista de series añadidas previamente a la 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); } } Es importante tener en cuenta que no debe haber ninguna clase BeanInfo en la classpath si no desea utilizar BeanInfo. Esto se debe a que el adaptador RPC comprueba las clases BeanInfo añadiendo BeanInfo al nombre de clase POJO y, a continuación, intenta cargar esa información primero. También debe registrar los objetos que debe exponer en RPCAdapterConfig.xml, independientemente de si desea utilizar BeanDescriptors o no.

Estructura del paquete

    Esta biblioteca se distribuye en una versión autónoma:
 
    Paquete autónomo

        Este paquete está organizado de la siguiente manera Para WebSphere® Application Server V8.5
<raíz_instalación>/optionalLibraries/web2mobile/rpcAdapter/RPCAdapter.jar
Los archivos de clase Java empaquetados en un formato JAR (archivo Java) que implementan la API.



Condiciones de uso | Comentarios