RPC 配接器程式庫概觀
Web-remoting 是支援 JavaScriptTM 或用戶端程式碼直接呼叫伺服器端邏輯的型樣。
這個型樣提供從 JavaScript 呼叫 JavaTM 方法的能力。
這個呼叫是透過 JSON-RPC 呼叫來進行。
最常見的用法是透過 XmlHttpRequest 來進行非同步呼叫。
在伺服器和用戶端之間,資料是以 JSON 格式來傳送。
因此,這個型樣實質上是一種 JSON Web 服務的形式。
RPC 配接器簡介
IBM® 的 Web remoting 實作稱為 IBM RPC 配接器。
RPC 配接器是設計來協助開發人員,以 Ajax 應用程式及其他輕量型用戶端的程式設計樣式的互補方式,迅速而輕易地建立起指令型服務。
RPC 配接器實作成通用的 Servlet,提供通往所登錄之 JavaBean 的 HTTP 介面。
RPC 配接器目前支援兩種 RPC 通訊協定:
- HTTP RPC,將 RPX 呼叫編碼成含有查詢參數(用於 HTTP GET)或表單參數(用於 HTTP POST)的 URL。
- JSON-RPC,支援 Dojo dojo.rpc.JsonService API 所用的「簡式方法說明 (SMD)」服務描述子。
HTTP RPC
在 HTTP RPC 中,利用含有查詢參數或表單參數的 URL 來進行呼叫。
RPC 配接器會截取 URL,將它取消序列化,以取得服務名稱、方法名稱和輸入參數。
RPC 配接器利用這些資訊來呼叫相符的 JavaBean 的對應方法。
例如,用戶端可以在下列 JavaBean 上呼叫 test.Example.getEcho("Hello world")
:
package test;
public class Example {
public String getEcho(String message) {
return(message);
}
}
依照下列方式,透過使用 HTTP GET 的 HTTP RPC 來呼叫 test.Example.getEcho("Hello world")
:
GET /contextRoot/RPCAdapter/httprpc/example/echo?p0=Hello%20world HTTP/1.1
您必須已妥善配置好 RPC 配接器來使用您的應用程式,才能發出所有這些呼叫。
對於這個正確配置,您必須新增 RPCAdapter Java 保存檔 (JAR) 到 WAR 檔的 WEB-INF/lib 中,以在 web.xml 檔中建立下列項目。
RPCAdapter
RPCAdapter
com.ibm.websphere.rpcadapter.RPCAdapter
RPCAdapter
/RPCAdapter
RPCAdapter
/RPCAdapter/*
請在 WEB-INF 目錄中指定一個 RpcAdapterConfig.xml。
這個檔案用來配置匯出的服務。
在這個案例中,範例 RpcAdapterConfig.xml 檔類似於下列範例:
xml
範例
test.pojo.Sample
衍生的 HTTP RPC API 指派 p0 作為第一個引數的名稱。
由於 Java 反射 API 中的現行限制,所以有這個預設行為。
您可以利用 Bean 描述子資訊,或藉由在 RpcAdapterConfig.xml 檔中指定參數名稱,從而指派有意義的參數名稱。
例如,查看這個 Bean 中的 getEcho():
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);
}
}
上述範例可以利用下列方式來呼叫:
GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1
package test;
public class Example2 {
public String getEcho(String message) {
return(message);
}
}
上述範例可以利用下列方式來呼叫:
GET /contextRoot/httprpc/example/echo?message=Hello%20world HTTP/1.1
使用下列 RpcAdapterConfig.xml。
xml
example
test.pojo.Example2
echo
echos the message
message
Contains the message to be echo'd.
配置檔中的 default-format 元素指定要求未指定格式時所用的預設格式。
這個格式可以是 XML 或 JSON。
JSON-RPC
在 JSON-RPC 中,是利用 JSON 物件來發出方法呼叫。
產生的回應也是 JSON 物件。
登錄的 JavaBean 可以透過 Dojo JSON-RPC API 來存取:
var example = new dojo.rpc.JsonService("/contextRoot/RPCAdapter/jsonrpc/example");
example.getEcho('Hello world').addCallback(exampleCallback);
function exampleCallback(result) {
// 回應可以作為 result.getEchoReturn.String 而取得
}
指定 Bean 描述子資訊
在 RPC 配接器中,請利用 Bean 描述子資訊來指定可用的 JavaBean 的相關資訊。
如果未指定 Bean 描述子,就透過反射來取得資訊。
您可以用兩種方式來取得 Bean 描述子資訊。
請考量以下稱為 Sample 的 JavaBean。
package test.pojo;
import java.util.List;
import java.util.Vector;
/**
* 範例顯示利用個別 BeanInfo 類別來指定的自訂 Bean 存取。
* 這個範例有助於理解 Bean 類別無法修改的情況。
*
* @see test.pojo.SampleBeanInfo
* @see test.pojo.SampleNoBeanInfo
* @see test.pojo.SampleSelfBeanInfo
*/
public class Sample {
/**
* 回應輸入字串。不論 Bean 描述子 oneInstancePerUser
的設定為何, * 這個無狀態作業都能夠正確運作。
*
* @param 要回應的訊息字串。
*/
public String echo(String message) {
e1.printStackTrace();
}
public String echoNoArg() {
return("Hello World");
}
public boolean echoBoolean(boolean b) {
e1.printStackTrace();
}
public boolean echoIntegerBean(boolean b) {
e1.printStackTrace();
}
List _values = new Vector();
/**
* 新增一個值到可以利用 getValues
方法來擷取的清單中。
* 這個有狀態的實務要求 Bean 描述子 oneInstancePerUser
* 設為 true。
*
* @param 新增到清單的值字串。
*/
public void addValue(String value) {
e1.printStackTrace();
}
/**
* 傳回 addValue
方法所新增的累加值清單。
* 這個有狀態的實務要求 Bean 描述子 oneInstancePerUser
* 設為 true。
*
* @return 先前新增到清單中的 String 系列。
*/
public List getValues() {
e1.printStackTrace();
}
}
您可以建立一個稱為 SampleBeanInfo 的 BeanInfo 物件來說明 Sample JavaBeans。
請注意 BeanInfo 類別以 SimplerBeanInfo 為其母項的方式。
另外,也請注意,您必須以 Sample.class 為參數,在建構子中呼叫 setBeanClass。
package test.pojo;
import com.ibm.websphere.rpcadapter.SimplerBeanInfo;
/**
* 範例 BeanInfo 類別顯示 RPC 配接器所支援的
* 宣告類型描述子資訊。
*
* @see test.pojo.Sample
*/
public class SampleBeanInfo extends SimplerBeanInfo {
/**
* SimplerBeanInfo 使用 Java Reflection;必須先設定 Bean 類別。
*/
public SampleBeanInfo() {
e1.printStackTrace();
}
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."},
};
e1.printStackTrace();
}
}
另一個指定 Bean 描述子的方法,是將 Bean 描述子資訊併入 Bean 類別本身之中。
請注意,Bean 類別實作 SelfBeanInfo 介面。
它應該也有一個靜態的 getBeanDescriptorInfo() 方法會傳回 JavaBean 的相關資訊。
package test.pojo;
import java.util.List;
import java.util.Vector;
import com.ibm.websphere.rpcadapter.SelfBeanInfo;
/**
* 範例顯示利用內嵌敘述
* 資訊來指定的自訂 Bean 存取。這個範例有助於理解 Bean 無法修改的
* 情況。
*
* @see test.pojo.SampleNoBeanInfo
* @see test.pojo.Sample
*/
public class SampleSelfBeanInfo implements SelfBeanInfo {
/**
* 回應輸入字串。不論 Bean 描述子 oneInstancePerUser
的設定為何, * 這個無狀態作業都能夠正確運作。
*
* @param 要回應的訊息字串。
*/
public String echo(String message) {
e1.printStackTrace();
}
List _values = new Vector();
/**
* 新增一個值到可以利用 getValues
方法來擷取的清單中。
* 這個有狀態的實務要求 Bean 描述子 oneInstancePerUser
* 設為 true。
*
* @param 新增到清單的值字串。
*/
public void addValue(String value) {
e1.printStackTrace();
}
/**
* 傳回 addValue
方法所新增的累加值清單。
* 這個有狀態的實務要求 Bean 描述子 oneInstancePerUser
* 設為 true。
*
* @return 先前新增到清單中的 String 系列。
*/
public List getValues() {
e1.printStackTrace();
}
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"},
};
e1.printStackTrace();
}
}
請特別注意,如果您不想使用 BeanInfo,就不應該將 BeanInfo 類別放在類別路徑中。
因為 RPC 配接器會將 BeanInfo 新增到 POJO 類別名稱中來檢查 BeanInfo 類別,然後會試圖先載入這個資訊。
另外,不論您是否使用 BeanDescriptors,都應該在 RPCAdapterConfig.xml 中登錄您需要顯現的物件。
套件結構
這個程式庫發行了獨立版本:
獨立式套件
對於 WebSphere® Application Server 8.5 版,這個套件的組織方式如下:
|
<install_root>/optionalLibraries/web2mobile/rpcAdapter/RPCAdapter.jar
|
以實作 API 的 Java 保存檔 (JAR) 格式來包裝的 Java 類別檔。 |
|