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.
El adaptador RPC actualmente da soporte a dos protocolos RPC:
- HTTP RPC, que codifica las invocaciones de RPC como URL con parámetros de consulta
para HTTP GET, o parámetros de formulario para HTTP POST.
- JSON-RPC, que da soporte al descriptor de servicio SMD (Simple Method Description) que utiliza la API Dojo dojo.rpc.JsonService.
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.
RPCAdapter
RPCAdapter
com.ibm.websphere.rpcadapter.RPCAdapter
RPCAdapter
/RPCAdapter
RPCAdapter
/RPCAdapter/*
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
Sample
test.pojo.Sample
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
ejemplo
test.pojo.Example2
echo
Repite el mensaje
mensaje
Contiene el mensaje que se va a repetir.
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 oneInstancePerUser
.
*
* @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 getValues
.
* Este caso de ejemplo con estado requiere que el descriptor de bean oneInstancePerUser
* 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 addValue
.
* Este caso de ejemplo con estado requiere que el descriptor de bean oneInstancePerUser
* 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 oneInstancePerUser
.
*
* @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 getValues
.
* Este caso de ejemplo con estado requiere que el descriptor de bean oneInstancePerUser
* 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 addValue
.
* Este caso de ejemplo con estado requiere que el descriptor de bean oneInstancePerUser
* 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. |
|