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 配接器目前支援兩種 RPC 通訊協定:

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 檔中建立下列項目。 <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> 請在 WEB-INF 目錄中指定一個 RpcAdapterConfig.xml。 這個檔案用來配置匯出的服務。 在這個案例中,範例 RpcAdapterConfig.xml 檔類似於下列範例: <?xml version="1.0" encoding="UTF-8"?> <rpcAdapter> <default-format>xml</default-format> <services> <pojo> <name>範例</name> <implementation>test.pojo.Sample</implementation> </pojo> </services> </rpcAdapter> 衍生的 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 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>echos the message</description> <parameters> <parameter> <name>message</name> <description>Contains the message to be echo'd.</description> <!--optional--> </parameter> </parameters> </method> </methods> </pojo> </services> </rpcAdapter>

配置檔中的 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 描述子 <code>oneInstancePerUser</code> 的設定為何, * 這個無狀態作業都能夠正確運作。 * * @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(); /** * 新增一個值到可以利用 <code>getValues</code> 方法來擷取的清單中。 * 這個有狀態的實務要求 Bean 描述子 <code>oneInstancePerUser</code> * 設為 true。 * * @param 新增到清單的值字串。 */ public void addValue(String value) { e1.printStackTrace(); } /** * 傳回 <code>addValue</code> 方法所新增的累加值清單。 * 這個有狀態的實務要求 Bean 描述子 <code>oneInstancePerUser</code> * 設為 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 描述子 <code>oneInstancePerUser</code> 的設定為何, * 這個無狀態作業都能夠正確運作。 * * @param 要回應的訊息字串。 */ public String echo(String message) { e1.printStackTrace(); } List _values = new Vector(); /** * 新增一個值到可以利用 <code>getValues</code> 方法來擷取的清單中。 * 這個有狀態的實務要求 Bean 描述子 <code>oneInstancePerUser</code> * 設為 true。 * * @param 新增到清單的值字串。 */ public void addValue(String value) { e1.printStackTrace(); } /** * 傳回 <code>addValue</code> 方法所新增的累加值清單。 * 這個有狀態的實務要求 Bean 描述子 <code>oneInstancePerUser</code> * 設為 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 類別檔。



使用條款 | 意見