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 傻 瓜 閱讀(2966) 評論(0)  編輯  收藏 所屬分類: j2ee web service

          導航

          統計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄂托克前旗| 阿克陶县| 永兴县| 九寨沟县| 南城县| 冷水江市| 烟台市| 临高县| 沐川县| 延津县| 汤原县| 宁海县| 临泽县| 都江堰市| 新泰市| 盖州市| 理塘县| 青浦区| 临沧市| 黎川县| 安岳县| 广平县| 安乡县| 子长县| 沁水县| 呼玛县| 沾益县| 玛曲县| 舟曲县| 西贡区| 宿松县| 柘荣县| 枝江市| 瑞安市| 蒙城县| 沁源县| 离岛区| 锦屏县| 惠安县| 克山县| 周至县|