Holder類型是什么

這篇文章主要介紹“Holder類型是什么”,在日常操作中,相信很多人在Holder類型是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Holder類型是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

目前創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、三臺網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

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

IN 參數(shù)是 JAVA 因有的參數(shù), OUT , INOUT 參數(shù)不是 JAVA 固有的。

復(fù)制傳遞:IN參數(shù)

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

test(int intValue,Date dateValue){   intValue=5;   dateValue=new Date(0);   }

在作如下調(diào)用時

int intValue=1;   Date dateValue=new Date();   test(intVlaue,dateValue);   System.out.println(intValue) // 打?。?nbsp;  System.out.pritnln(dateValue) // 打印現(xiàn)在的時間。

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

引用傳遞 : INOUT 參數(shù) OUT 參數(shù) .

在實現(xiàn)引用傳遞的編程語言中,如果 test 方法的兩面?zhèn)€參數(shù)定義為引用傳遞 , 對上述 test 方法調(diào)用后,再打印 intValue 跟 dateValue 的值,會發(fā)現(xiàn)這兩個值已經(jīng)發(fā)生了改變。但是 OUT 參數(shù)更象一個返回值,因為值要從方法中傳出而不是傳入。使用 OUT 參數(shù)數(shù),激活方法前不訪問變量的值,即傳入的值被忽略了。

Holder 類:

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

從 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'/>     < part name='Date_2' type='xsd:dateTime'/>    < /message>    < message name='HolderTestBeanInterface1_echoCalendarResponse'>     < part name='Calendar_1' type='xsd:dateTime'/>    < /message>     < operation name='echoCalendar' parameterOrder='Calendar_1 Date_2'>      < input message='tns:HolderTestBeanInterface1_echoCalendar'/>      < output message='tns:HolderTestBeanInterface1_echoCalendarResponse'/>     < /operation>   < /portType>   …

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

Javax.xml.rpc.holders包中提供了一個Holder類,用于映射到j(luò)ava原始類型的INOUT參數(shù)和OUT參數(shù)。如IntHolder等,同時也提供了一組為nillable內(nèi)置類型定義的Holder類型,如IntegerWrapperHolder等.

自定義Holder類型。必須實現(xiàn)Holder標(biāo)志接口, 其屬性變量名必須為 value 并且必須定義一個空的構(gòu)造函數(shù)就象下面這樣:

public  class BeanTestHolder implements javax.xml.rpc.holders.Holder {       public BeanTest value;       public BeanTestHolder(){       }       public BeanTestHolder(BeanTest beanTest){           value=beanTest;       }   }

Jboss Web Service 的 Holder 類型的具體實現(xiàn) , 采用 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;   }

接口的實現(xiàn)類 :

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     < servlet-name>HolderTestBeanInterface1     < servlet-class>holder.HolderTestBean   < /servlet>   < servlet-mapping>     < servlet-name>HolderTestBeanInterface1     < url-pattern>/HolderTestBeanInterface1   < /servlet-mapping>   < servlet-mapping>     < servlet-name>HolderTestBeanInterface1     < url-pattern>/services/*   < /servlet-mapping>

打包成 war 文件并發(fā)布

客戶端的調(diào)用 :

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.. ");       }   }

到此,關(guān)于“Holder類型是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章題目:Holder類型是什么
轉(zhuǎn)載來源:http://muchs.cn/article48/ijdcep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、做網(wǎng)站、外貿(mào)建站、動態(tài)網(wǎng)站、微信公眾號面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營