<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java隨記

    堅持就是勝利!

     

    j2ee web service開發(六) 跟其它編程語言寫的Web服務通信 Holder類型

    要弄清楚什么是 Holder 類型,得先搞清楚 IN 參數, OUT 參數, INOUT 參數的概念。

    IN 參數是 JAVA 因有的參數, OUT INOUT 參數不是 JAVA 固有的。

    復制傳遞:IN參數

    java 編程語言對作為參數傳遞給方法調用的所有原始值采用復制傳遞的方式,即傳遞的值是方法調用中所使用變量的復制,而不是原始值本身。比如定義一個方法

    test(int intValue,Date dateValue){

    intValue=5;

    dateValue=new Date(0);

    }

    在作如下調用時

    int intValue=1;

    Date dateValue=new Date();

    test(intVlaue,dateValue);

    System.out.println(intValue) // 打印1

    System.out.pritnln(dateValue) // 打印現在的時間。

    但是在 test 方法中對參數的值作了修改。而實際的參數值并未發生改變。

    引用傳遞 : INOUT 參數 OUT 參數 .

    在實現引用傳遞的編程語言中,如果 test 方法的兩面個參數定義為引用傳遞 , 對上述 test 方法調用后,再打印 intValue dateValue 的值,會發現這兩個值已經發生了改變。但是 OUT 參數更象一個返回值,因為值要從方法中傳出而不是傳入。使用 OUT 參數數,激活方法前不訪問變量的值,即傳入的值被忽略了。

    older 類:

    JAX-RPC 中支持 INOUT,OUT 參數。 Holder 是一個接口,它只是提供了一個補救措施,以在 java 中支持引用傳遞。這樣就使得需要用 java 與支持 INOUT,OUT 參數的編程語言寫的 web 服務進行通信 .

    WSDL 映射 HOLDER 類型 :

    接口定義

    public interface HolderTestBeanInterface1 extends Remote {

    ??? public void echoCalendar(CalendarHolder val, Date date) throws

    ??????????? RemoteException;

    ??? public void echoBeanHolder(BeanTestHolder beanTestHolder,BeanTest beanTest) throws

    ??????????? RemoteException;

    }

    WSDL 文檔

    <?xml version="1.0" encoding="UTF-8"?>

    <definitions name='HolderTestBeanInterface1' targetNamespace='http://holder' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://holder' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>

    <message name='HolderTestBeanInterface1_echoCalendar'>

    ? <part name='Calendar_1' type='xsd:dateTime'/><! 不要這一行 它就是一個 OUT 參數 - à

    ? <part name='Date_2' type='xsd:dateTime'/>

    ?</message>

    ?<message name='HolderTestBeanInterface1_echoCalendarResponse'>

    ? <part name='Calendar_1' type='xsd:dateTime'/>

    ?</message> <portType name='HolderTestBeanInterface1'>

    ? <operation name='echoCalendar' parameterOrder='Calendar_1 Date_2'>

    ?? <input message='tns:HolderTestBeanInterface1_echoCalendar'/>

    ?? <output message='tns:HolderTestBeanInterface1_echoCalendarResponse'/>

    ? </operation>

    </portType>

    ?

    標記為 Calendar_1 part 元素既在 input 消息中又在 ouput 消息中 jax-rpc 編譯器知道它是一個 INOUT 類型 同時也需要 oler 類型。如果在output消息定義一個part元素,這表示它是一個返回值或者一個OUT參數,如果part是一個OUT參數,part標記會列在operation元素的parameterOrder屬性中.OUT參數也需要Holder類型.

    Javax.xml.rpc.holders包中提供了一個Holder類,用于映射到java原始類型的INOUT參數和OUT參數。如IntHolder等,同時也提供了一組為nillable內置類型定義的Holder類型,如IntegerWrapperHolder等.

    自定義Holder類型。必須實現Holder標志接口, 其屬性變量名必須為 value 并且必須定義一個空的構造函數就象下面這樣:

    public? class BeanTestHolder implements javax.xml.rpc.holders.Holder {

    ??? public BeanTest value;

    ??? public BeanTestHolder(){

    ?

    ??? }

    ?

    ??? public BeanTestHolder(BeanTest beanTest){

    ??????? value=beanTest;

    ??? }

    ?

    }

    Jboss   Web Service older 類型的具體實現 采用 Jboss 4.04 版本 .

    定義一個 bean :

    public class BeanTest {

    ??? private String beanName;

    ??? public BeanTest(){

    ?

    ??? }

    ?

    ??? public String getBeanName() {

    ??????? return beanName;

    ??? }

    ?

    ??? public void setBeanName(String beanName) {

    ??????? this.beanName = beanName;

    ??? }

    ?

    }

    bean 定制一個 Holder:

    package holder;

    ?

    public? class BeanTestHolder implements javax.xml.rpc.holders.Holder {

    ??? public BeanTest value;

    ??? public BeanTestHolder(){

    ?

    ??? }

    ?

    ??? public BeanTestHolder(BeanTest beanTest){

    ??????? value=beanTest;

    ??? }

    ?

    }

    ?

    ?

    定義一個接口 :

    public interface HolderTestBeanInterface1 extends Remote {

    ??? public void echoCalendar(CalendarHolder val, Date date) throws

    ??????????? RemoteException;

    ??? public void echoBeanHolder(BeanTestHolder beanTestHolder,BeanTest beanTest) throws

    ??????????? RemoteException;

    }

    接口的實現類 :

    import javax.xml.rpc.holders.*;

    import java.util.Date;

    ?

    public class HolderTestBean implements HolderTestBeanInterface1 {

    ?

    ??? public void echoCalendar(CalendarHolder val,Date date) {

    ??????? System.out.println("echoCalendar: " + val.value.getTime());

    ??????? val.value.setTime(new Date());

    ??????? System.out.println(date);

    ??? }

    ?

    ??? public void echoBeanHolder(BeanTestHolder beanTestHolder,BeanTest beanTest){

    ??????? BeanTest beantest=beanTestHolder.value;

    ??????? System.out.println(beantest.getBeanName()+ " holder ");

    ??????? beantest.setBeanName(" new name ");

    ??????? System.out.println(beantest.getBeanName()+ " holder ");

    ????? ??System.out.println(beanTest.getBeanName()+ " bean ");

    ??????? beanTest.setBeanName(" new name too ");

    ??????? System.out.println(beanTest.getBeanName()+" bean ");

    ?

    ?

    ??? }

    ?

    }

    ?

    用于 jboss 自帶的 wstools 工具的配置文件 wstools-config.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <!--

    ? wstools -cp classes -config wstools-config.xml

    -->

    ?

    <configuration xmlns="http://www.jboss.org/jbossws-tools"

    ?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">

    ? <java-wsdl>

    ??? <service name="HolderTestBeanInterface1" style="rpc" endpoint="holder.HolderTestBeanInterface1"/>

    ??? <namespaces target-namespace="http://holder" type-namespace="http://holder"/>

    ??? <mapping file="HolderTestBeanInterface1.xml"/>

    ??? <webservices servlet-link="HolderTestBeanInterface1"/>

    ? </java-wsdl>

    </configuration>

    生成所需的 webservices.xml,jax-rpc 映射文件 wsdl 文檔

    wstools -config wstools-config.xml

    把生成的 wsdl 文件夾 webservices.xml 及映射文件放到 web-inf 目錄下。

    配置 web.xml 文件

    ? <servlet>

    ??? <display-name>HolderTestBeanInterface1 Servlet</display-name>

    ??? <servlet-name>HolderTestBeanInterface1</servlet-name>

    ??? <servlet-class>holder.HolderTestBean</servlet-class>

    ? </servlet>

    ? <servlet-mapping>

    ??? <servlet-name>HolderTestBeanInterface1</servlet-name>

    ??? <url-pattern>/HolderTestBeanInterface1</url-pattern>

    ? </servlet-mapping>

    ? <servlet-mapping>

    ??? <servlet-name>HolderTestBeanInterface1</servlet-name>

    ??? <url-pattern>/services/*</url-pattern>

    ? </servlet-mapping>

    打包成 war 文件并發布

    客戶端的調用 :

    import java.net.URL;

    import javax.xml.rpc.*;

    import javax.xml.namespace.QName;

    import java.util.*;

    import java.io.File;

    import javax.xml.rpc.holders.CalendarHolder;

    import org.jboss.ws.jaxrpc.ServiceFactoryImpl;

    ?

    public class ClientTest {

    ?

    ?

    ??? private HolderTestBeanInterface1 getPort() throws Exception {

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

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

    ??????????????? "holderTest/WEB-INF/wsdl/HolderTestBeanInterface1.wsdl").toURL();

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

    ??????????????? "holderTest/WEB-INF/HolderTestBeanInterface1.xml").toURL();

    ??????? QName qname = new QName("http://holder", "HolderTestBeanInterface1");

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

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

    ??????? return port;

    ??? }

    ?

    ?

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

    ??????? ClientTest clienttest = new ClientTest();

    ??????????? HolderTestBeanInterface1 h=clienttest.getPort();

    ??????? Date date=new Date();

    ??????? System.out.println(date+? " date begin...? ");

    ??????? GregorianCalendar value = new GregorianCalendar(2006, 1, 1, 23, 59, 59);

    ??????? CalendarHolder holder = new CalendarHolder(value);

    ??????? System.out.println(holder.value.getTime()+" calendarHolder begin... ");

    ?

    ??????? h.echoCalendar(holder,date);

    ??????? System.out.println(holder.value.getTime()+" calendarHolder end ... ");

    ??????? System.out.println(date+ "? date end ... ");

    ?

    ?

    ??????? BeanTest beanTest=new BeanTest();

    ??????? beanTest.setBeanName("test");

    ??????? BeanTest beanTest2=new BeanTest();

    ??????? beanTest2.setBeanName("test2");

    ??????? System.out.println(beanTest.getBeanName()+" holder begin.. ");

    ??????? System.out.println(beanTest2.getBeanName()+" bean begin..");

    ??????? BeanTestHolder beanTestHolder = new BeanTestHolder(beanTest);

    ??????? h.echoBeanHolder(beanTestHolder,beanTest2);

    ??????? System.out.println(beanTest2.getBeanName() + "? bean end..");

    ??????? System.out.println(beanTestHolder.value.getBeanName()+" holder end.. ");

    ?

    ?

    ?

    ??? }

    }

    如何調用 web 服務參見手記 j2ee web serivce 開發 ( )

    對比一下調用前后的輸出就能明白 Holder 類型的作用了 .
    完整的示例下載
    歡迎加入QQ群

    posted on 2006-12-05 14:31 傻 瓜 閱讀(3073) 評論(1)  編輯  收藏 所屬分類: j2ee web service

    評論

    # re: j2ee web service開發(六) 跟其它編程語言寫的Web服務通信 Holder類型 2012-02-20 11:23 tms

    感謝分享!  回復  更多評論   

    導航

    統計

    常用鏈接

    留言簿(7)

    我參與的團隊

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲av无码成人影院一区| 亚洲激情校园春色| 一级女性全黄久久生活片免费| 国产一精品一AV一免费孕妇| 亚洲国产精品网站久久| 1000部拍拍拍18免费网站| 亚洲国产精品美女| 韩国二级毛片免费播放| 精品亚洲国产成人av| va亚洲va日韩不卡在线观看| 一级看片免费视频囗交| 77777亚洲午夜久久多人| 免费人成在线观看视频高潮| 亚洲欧洲在线观看| 在线观看免费人成视频色| 亚洲国产成人精品无码区二本 | h片在线播放免费高清| 久久亚洲高清综合| 中文字幕在线免费观看| 亚洲激情视频图片| 又粗又黄又猛又爽大片免费| 国产美女视频免费观看的网站| 国产亚洲人成网站在线观看不卡 | 精品国产一区二区三区免费| 久久精品亚洲综合| 午夜宅男在线永久免费观看网| 亚洲av无码专区在线电影| 亚洲精品国产高清不卡在线| 久久成人免费大片| 亚洲精品国产第一综合99久久| 亚洲中文字幕伊人久久无码| 99精品视频免费在线观看| 亚洲av无码专区国产不乱码| 亚洲色欲色欲www在线丝| 99国产精品永久免费视频| 美女羞羞免费视频网站| 亚洲国产成人久久精品影视| 永久久久免费浮力影院| a视频在线免费观看| 亚洲综合一区无码精品| 91麻豆精品国产自产在线观看亚洲|