無為

          無為則可為,無為則至深!

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
          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



          凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
          、轉載請注明來處和原文作者。非常感謝。

          posted on 2006-11-09 12:24 草兒 閱讀(981) 評論(0)  編輯  收藏 所屬分類: 軟件構架java
          主站蜘蛛池模板: 永定县| 宽城| 韶山市| 高安市| 龙海市| 大兴区| 措美县| 安泽县| 许昌市| 汉阴县| 乐安县| 盐津县| 罗城| 房山区| 鲜城| 秀山| 申扎县| 甘肃省| 广河县| 紫阳县| 墨玉县| 大埔县| 合肥市| 乌兰浩特市| 达拉特旗| 本溪| 田林县| 武乡县| 鹤庆县| 额济纳旗| 柯坪县| 玉山县| 赫章县| 永济市| 高要市| 册亨县| 洛川县| 北票市| 调兵山市| 星子县| 昌乐县|