Ü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.
Derzeit unterstützt der RPC-Adapter zwei RPC-Protokolle:
- HTTP-RPC: Dieses Protokoll codiert RPC-Aufrufe als URLs mit Abfrageparametern (für HTTP Get) oder Formularparametern (für HTTP POST).
- JSON-RPC: Dieses Protokoll unterstützt den von der Dojo-API dojo.rpc.JsonService implementierten SMD-Servicedeskriptor (Simple Method Description).
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.
RPCAdapter
RPCAdapter
com.ibm.websphere.rpcadapter.RPCAdapter
RPCAdapter
/RPCAdapter
RPCAdapter
/RPCAdapter/*
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
Beispiel
test.pojo.Sample
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
example
test.pojo.Example2
echo
Gibt die Nachricht zurück
message
Enthält die zurückzugebende Nachricht
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 oneInstancePerUser
.
*
* @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 getValues
method.
* This stateful scenario requires that the bean descriptor oneInstancePerUser
* 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 addValue
method.
* This stateful scenario requires that the bean descriptor oneInstancePerUser
* 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 oneInstancePerUser
.
*
* @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 getValues
method.
* This stateful scenario requires that the bean descriptor oneInstancePerUser
* 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 addValue
method.
* This stateful scenario requires that the bean descriptor oneInstancePerUser
* 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) |
|