java隨記

          堅持就是勝利!

           

          j2ee web service開發(fā)(二) 動態(tài)代理與動態(tài)調(diào)用

          ?j2ee web service 客戶端的三種調(diào)用方式: (一)占位程序:該種調(diào)用方式需要服務(wù)端生成所謂的占位程序,也是性能最好的一種方式,據(jù)有的文檔介紹說用占位程序?qū)崿F(xiàn)的web服務(wù)不能實(shí)現(xiàn)各種編程語言比如C#之是互相調(diào)用就是會引起互操作性的問題.而且生成占位程序的web服務(wù)的確稍麻煩一點(diǎn),更重要的是我不喜歡這種方式,也就不作備忘了:)。

          (二)動態(tài)代理:該種方式需要一個指向WSDL文檔的URL。具體實(shí)現(xiàn):

          ??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

          // 工廠類,取得service對象,

          ?

          ??????? URL wsdlURL = new File(? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").??????????????? ??toURL(); //wsdl 文檔的URL 它可以是一個遠(yuǎn)程的URL 但是本例引用本地硬盤上的一個wsdl文件

          其好處是提高程序的性能。

          ??????? URL mappingURL = new File("complexType-array/WEB-INF/CountUser.xml").???????????????????????? toURL(); // 映射文件的URL 需要著重說明的就是這個映射文件了,標(biāo)準(zhǔn)的j2ee web service API實(shí)現(xiàn)中可不需要這玩意,但是在Jboss的實(shí)現(xiàn)中不要這個就會報錯cannot obtain java mapping type...,在jboss下開發(fā)的web 服務(wù)客戶端移植時需要特別注意,麻煩!

          ??????? QName qname = new QName("http://array", "CountUserService");

          ??????? Service service = factory.createService(wsdlURL, qname, mappingURL);// 通過工廠方法得到一個Service對象,但createService(wsdlURL, qname, mappingURL)方法是jboss的具體實(shí)現(xiàn)增加一的一個方法,標(biāo)準(zhǔn)API可沒有這玩意,對于數(shù)組類型的傳遞只能用這個方法了,奇怪的是客戶端居然需要部署在服務(wù)器端的映射文件,沒勁!???????

          ??????? CountUser port = (CountUser) service.getPort(CountUser.class); // 取得服務(wù)器端的接口。

          ( 三)動態(tài)調(diào)用。

          ?

          ??????? URL wsdlURL = new File(

          ??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

          ????????????????????? toURL();

          ??????? URL mappingURL = new File(

          ??????????????? "complexType-array/WEB-INF/CountUser.xml").

          ???????????????????????? toURL();

          ??????? QName qname = new QName("http://array", "CountUserService");// 表示服務(wù)名QName對象。

          ??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

          ??????? Call call = service.createCall();

          ??? // 沒什么好說的,依然要用到wsdl文檔文件,映射文件。

          ??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));// 指定方法名

          ??????? call.setPortTypeName(new QName("CountUser"));// 指定端口名

          ("value",Constants.TYPE_LITERAL_ANYSIMPLETYPE,ParameterMode.IN);

          ??????? call.setReturnType(Constants.TYPE_LITERAL_INT);

          ??????? Object retObj = call.invoke(new Object[] {user});

          ?

          ?

          ?

          服務(wù)器端的實(shí)現(xiàn)參見j2ee web service()完整的客戶端代碼如下:

          package array;

          ?

          import java.net.URL;

          import javax.xml.rpc.*;

          import javax.xml.namespace.QName;

          import java.util.*;

          import java.io.File;

          import org.jboss.ws.jaxrpc.ServiceFactoryImpl;

          import org.jboss.ws.Constants;

          ?

          public class ArrayExample {

          ? ?? public ArrayExample() {

          ??? }

          ?

          ??? private static final String TARGET_NAMESPACE =

          ??????????? "http://array";

          ?

          ??? private CountUser getPort() throws Exception {

          ?

          ??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

          ?

          ??????? URL wsdlURL = new File(

          ??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

          ????????????????????? toURL();

          ??????? URL mappingURL = new File(

          ??????????????? "complexType-array/WEB-INF/CountUser.xml").

          ???????????????????????? toURL();

          ??????? QName qname = new QName("http://array", "CountUserService");

          ??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

          ?

          ??????? CountUser port = (CountUser) service.getPort(CountUser.class);

          ?

          ??????? return port;

          ??? }

          ?

          ??? public void testComplexUserArray(User[] user) throws

          ??????????? Exception {

          ??????? CountUser port = getPort();

          ?

          ??????? try {

          ??????????? int returnValue = port.countUser(user);

          ??????????? System.out.print(returnValue);

          ??????? } catch (Exception e) {

          ??????????? throw e;

          ??????? }

          ??? }

          ?

          ??? public void DIIClient(User[] user) throws Exception {

          ?

          ??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

          ?

          ??????? URL wsdlURL = new File(

          ??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

          ????????????????????? toURL();

          ??????? URL mappingURL = new File(

          ??????????????? "complexType-array/WEB-INF/CountUser.xml").

          ???????????????????????? toURL();

          ??????? QName qname = new QName("http://array", "CountUserService");

          ??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

          ??????? Call call = service.createCall();

          ??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));

          ??????? call.setPortTypeName(new QName("CountUser"));

          ?

          ??????? call.setReturnType(Constants.TYPE_LITERAL_INT);

          ?

          ????? ??Object retObj = call.invoke(new Object[] {user});

          ?

          ??????? System.out.println(retObj.toString());

          ??? }

          ?

          ??? public static void main(String[] args) throws Exception {

          ??????? ArrayExample arrayexample = new ArrayExample();

          ??????? User[] user = new User[2];

          ??????? user[0] = new User(" 張三", "027-88888888", new Date());

          ??????? user[1] = new User("lisi", null, new Date());

          ??????? //arrayexample.testComplexUserArray(user);

          ??????? arrayexample.DIIClient(user);

          ??? }

          }

          ?

          ?

          ?至此好象一個可以應(yīng)用的web service服務(wù)就完成了,然而這才僅僅只是開始~~~~~~~~~
          如果你想賜教或者討論,歡迎加入QQ群:30406099

          posted on 2006-11-07 10:40 傻 瓜 閱讀(2966) 評論(0)  編輯  收藏 所屬分類: j2ee web service

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(7)

          我參與的團(tuán)隊(duì)

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 睢宁县| 曲周县| 宁阳县| 休宁县| 荣昌县| 临沭县| 衡东县| 麟游县| 阿拉尔市| 湘阴县| 咸宁市| 潜江市| 庄河市| 奇台县| 安多县| 云安县| 泉州市| 沿河| 天水市| 波密县| 黔东| 黑河市| 青河县| 额济纳旗| 天水市| 新巴尔虎右旗| 灵石县| 建始县| 基隆市| 榆树市| 阿坝县| 丹寨县| 石屏县| 轮台县| 囊谦县| 乌什县| 兴仁县| 北碚区| 南陵县| 广宗县| 秦安县|