Übersicht über die RPC-Adapterbibliotheken

Web-Remoting ist ein Muster, mit dem JavaScriptTM oder eine clientseitige Komponente direkt serverseitige Logik aufrufen. Mit diesem Muster können JavaTM-Methoden von JavaScript aufgerufen werden. Der Aufruf erfolgt in Form eines JSON-RPC-Aufrufs. Am häufigsten werden asynchrone Aufrufe mit XmlHttpRequest verwendet. Die Daten zwischen Server und Client werden im JSON-Format übertragen. Deshalb ist dieses Muster im Wesentlichen ein Form von JSON-Web-Services.

Einführung zum RPC-Adapter

Die IBM® Implementierung von Web-Remoting wird als IBM RPC-Adapter bezeichnet. Der RPC-Adapter soll Entwicklern bei der schnellen und einfachen Erstellung befehlsbasierter Services gemäß den Programmierstilen für AJAX-Anwendungen und andere Lightweight-Clients helfen. Als generisches Servlet implementiert stellt der RPC-Adapter eine HTTP-Schnittstelle zu registrierten JavaBeans bereit.

RPC-Adapter
Derzeit unterstützt der RPC-Adapter zwei RPC-Protokolle:

HTTP-RPC

In HTTP-RPC werden für Aufrufe URLs mit Abfrage- oder Formularparametern verwendet. Der RPC-Adapter fängt den URL ab und entserialisiert ihn, um den Servicenamen, den Methodennamen und die Eingabeparameter zu erhalten. Mit diesen Informationen ruft der RPC-Adapter die entsprechende Methode passender JavaBeans auf.

Clients können beispielsweise test.Example.getEcho("Hello world") für die folgenden JavaBeans aufrufen:

package test; public class Example { public String getEcho(String message) { return(message); } } test.Example.getEcho("Hello world") kann wie folgt über HTTP-RPC mit HTTP GET aufgerufen werden:

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

Vor Ausführung dieser Aufrufe müssen Sie den RPC-Adapter ordnungsgemäß für Ihre Anwendung konfiguriert haben. Dazu müssen Sie die RPCAdapter-JAR-Datei zum Verzeichnis WEB-INF/lib Ihrer WAR-Datei hinzufügen und die folgenden Einträge in die Datei "web.xml" aufnehmen. <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> Geben Sie im Verzeichnis WEB-INF eine Datei "RpcAdapterConfig.xml" an. Mit Hilfe dieser Datei werden die Services konfiguriert, die exportiert werden. In diesem Beispiel könnte eine Datei "RpcAdapterConfig.xml" wie folgt aussehen: <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>Beispiel</name> <implementation>test.pojo.Sample</implementation> </pojo> </services> </rpcAdapter> Die abgeleitete HTTP-RPC-API ordnet dem ersten Argument den Namen p0 zu. Dieses Standardverhalten ist auf die derzeitigen Begrenzungen der Java-Reflection-APIs zurückzuführen. Aussagefähige Parameternamen können mit Hilfe von Bean-Deskriptorinformationen oder durch die Angabe von Parameternamen in der Datei "RpcAdapterConfig.xml" zugeordnet werden. Sehen Sie sich beispielsweise getEcho() in der folgenden Bean an: 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); } } Das obige Beispiel kann auch wie folgt aufgerufen werden: GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1 package test; public class Example2 { public String getEcho(String message) { return(message); } } Das obige Beispiel kann unter Verwendung der folgenden Datei RpcAdapterConfig.xml mit GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1 aufgerufen werden: <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>example</name> <implementation>test.pojo.Example2</implementation> <methods filter="whitelisting"> <method> <name>echo</name> <description>Gibt die Nachricht zurück</description> <parameters> <parameter> <name>message</name> <description>Enthält die zurückzugebende Nachricht</description> <!--optional--> </parameter> </parameters> </method> </methods> </pojo> </services> </rpcAdapter>

Das Element default-format in der Konfigurationsdatei gibt das zu verwendende Standardformat an, wenn in der Anforderung kein Format genannt ist. Das Standardformat kann XML oder JSON sein.

JSON-RPC

In JSON-RPC werden Methodenaufrufe mit Hilfe von JSON-Objekten ausgeführt. Die generierte Antwort ist auch ein JSON-Objekt. Auf die registrierten JavaBeans kann wie folgt über die Dojo-API JSON-RPC zugegriffen werden: var example = new dojo.rpc.JsonService("/contextRoot/RPCAdapter/jsonrpc/example"); example.getEcho('Hello world').addCallback(exampleCallback); function exampleCallback(result) { // response is available as result.getEchoReturn.String }

Bean-Deskriptorinformationen angeben

Verwenden Sie die Bean-Deskriptorinformationen des RPC-Adapters, um Angaben über die verfügbaren JavaBeans zu machen. Wenn Sie keinen Bean-Deskriptor angeben, werden die Informationen auf dem Wege der Reflexion abgerufen. Sie haben zwei Möglichkeiten, Bean-Deskriptorinformationen anzugeben. Sehen Sie sich dazu das folgende JavaBeans-Beispiel an. package test.pojo; import java.util.List; import java.util.Vector; /** * Example showing custom Bean access specified with a separate BeanInfo class. * This sample is instructive for cases where the Bean class cannot be modified. * * @see test.pojo.SampleBeanInfo * @see test.pojo.SampleNoBeanInfo * @see test.pojo.SampleSelfBeanInfo */ public class Sample { /** * Echoes the input String. This stateless operation works correctly * regardless of the setting of the bean descriptor <code>oneInstancePerUser</code>. * * @param message String to be echoed. */ 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(); /** * Adds a value to a list that can be retrieve with the <code>getValues</code> method. * This stateful scenario requires that the bean descriptor <code>oneInstancePerUser</code> * be set to true. * * @param value String added to the list. */ public void addValue(String value) { _values.add(value); } /** * Returns the cumulative list of values added with the <code>addValue</code> method. * This stateful scenario requires that the bean descriptor <code>oneInstancePerUser</code> * be set to true. * * @return List of Strings previously added to the list. */ public List getValues() { return(_values); } } Sie können ein BeanInfo-Objekt mit dem Namen SampleBeanInfo erstellen, um das JavaBean-Beispiel zu beschreiben. Wie Sie sehen, ist SimplerBeanInfo der Klasse BeanInfo übergeordnet. Außerdem können Sie sehen, dass setBeanClass im Konstruktor mit Sample.class als Parameter aufgerufen werden muss. package test.pojo; import com.ibm.websphere.rpcadapter.SimplerBeanInfo; /** * Example BeanInfo class showing declarative-type descriptor information * supported by the RPC adapter. * * @see test.pojo.Sample */ public class SampleBeanInfo extends SimplerBeanInfo { /** * SimplerBeanInfo uses Java Reflection; must set the Bean class first. */ 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); } } Eine andere Möglichkeit für die Angabe des Bean-Deskriptors ist die Aufnahme der Bean-Deskriptorinformationen in die Bean-Klasse. Beachten Sie, dass die Bean-Klasse die Schnittstelle "SelfBeanInfo" implementiert. Außerdem sollte sie eine statische Methode getBeanDescriptorInfo() enthalten, die Informationen zu den JavaBeans zurückgibt. package test.pojo; import java.util.List; import java.util.Vector; import com.ibm.websphere.rpcadapter.SelfBeanInfo; /** * Example showing custom Bean access specified with embedded descriptive * information. This sample is instructive for cases where the Bean can be * modified. * * @see test.pojo.SampleNoBeanInfo * @see test.pojo.Sample */ public class SampleSelfBeanInfo implements SelfBeanInfo { /** * Echoes the input String. This stateless operation works correctly * regardless of the setting of the bean descriptor <code>oneInstancePerUser</code>. * * @param message String to be echoed. */ public String echo(String message) { return(message); } List _values = new Vector(); /** * Adds a value to a list that can be retrieve with the <code>getValues</code> method. * This stateful scenario requires that the bean descriptor <code>oneInstancePerUser</code> * be set to true. * * @param value String added to the list. */ public void addValue(String value) { _values.add(value); } /** * Returns the cumulative list of values added with the <code>addValue</code> method. * This stateful scenario requires that the bean descriptor <code>oneInstancePerUser</code> * be set to true. * * @return List of Strings previously added to the list. */ 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); } } Wenn Sie BeanInfo nicht verwenden möchten, beachten Sie bitte, dass der Klassenpfad keine Klasse BeanInfo enthalten sollte, denn der RPC-Adapter überprüft das Vorhandensein von BeanInfo-Klassen, indem er BeanInfo zum POJO-Klassennamen hinzufügt, und versucht dann, diese Informationen zuerst zu laden. Außerdem müssen die Objekte, die in RPCAdapterConfig.xml zugänglich gemacht werden sollen, registriert werden. Dies gilt unabhängig davon, ob Sie Bean-Deskriptoren verwenden oder nicht.

Paketstruktur

    Diese Bibliothek wird in einer eigenständigen Version verteilt:
 
Eigenständiges Paket

        Dieses Paket ist wie folgt strukturiert: Für WebSphere® Application Server Version 8.5
<Installationsstammverzeichnis>/optionalLibraries/web2mobile/rpcAdapter/RPCAdapter.jar
Java-Klassendateien, die die API implementieren, im Java-Archivformat (JAR)



Nutzungsbedingungen | Feedback