java隨記

          堅持就是勝利!

           

          j2ee web service開發(二) 動態代理與動態調用

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

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

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

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

          ?

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

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

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

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

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

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

          ( 三)動態調用。

          ?

          ??????? 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");// 表示服務名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});

          ?

          ?

          ?

          服務器端的實現參見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);

          ??? }

          }

          ?

          ?

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

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

          導航

          統計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 图木舒克市| 乌鲁木齐市| 田阳县| 漳浦县| 大悟县| 忻城县| 佛教| 思茅市| 布尔津县| 内黄县| 西林县| 宜章县| 枣阳市| 方城县| 武宁县| 麦盖提县| 昂仁县| 平凉市| 巍山| 沂水县| 闽侯县| 平定县| 雷州市| 德惠市| 镇巴县| 繁峙县| 沙雅县| 禹州市| 乌兰县| 义马市| 革吉县| 星座| 磐石市| 巴彦县| 巫山县| 聂荣县| 南川市| 张家川| 望谟县| 射洪县| 来凤县|