溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Holder類(lèi)型是什么

發(fā)布時(shí)間:2022-03-31 13:39:57 來(lái)源:億速云 閱讀:175 作者:iii 欄目:編程語(yǔ)言

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

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

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

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

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

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

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

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

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

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

在實(shí)現(xiàn)引用傳遞的編程語(yǔ)言中,如果 test 方法的兩面?zhèn)€參數(shù)定義為引用傳遞 , 對(duì)上述 test 方法調(diào)用后,再打印 intValue 跟 dateValue 的值,會(huì)發(fā)現(xiàn)這兩個(gè)值已經(jīng)發(fā)生了改變。但是 OUT 參數(shù)更象一個(gè)返回值,因?yàn)橹狄獜姆椒ㄖ袀鞒龆皇莻魅搿J褂?OUT 參數(shù)數(shù),激活方法前不訪問(wèn)變量的值,即傳入的值被忽略了。

Holder 類(lèi):

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

從 WSDL 映射 HOLDER 類(lèi)型 :

接口定義

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 編譯器知道它是一個(gè) INOUT 類(lèi)型 , 同時(shí)也需要 Holer 類(lèi)型。如果在output消息定義一個(gè)part元素,這表示它是一個(gè)返回值或者一個(gè)OUT參數(shù),如果part是一個(gè)OUT參數(shù),part標(biāo)記會(huì)列在operation元素的parameterOrder屬性中.OUT參數(shù)也需要Holder類(lèi)型.

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

自定義Holder類(lèi)型。必須實(shí)現(xiàn)Holder標(biāo)志接口, 其屬性變量名必須為 value 并且必須定義一個(gè)空的構(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 類(lèi)型的具體實(shí)現(xiàn) , 采用 Jboss 4.04 版本 .

定義一個(gè) bean 類(lèi) :

public class BeanTest {       private String beanName;       public BeanTest(){       }       public String getBeanName() {           return beanName;       }       public void setBeanName(String beanName) {           this.beanName = beanName;       }   }

給 bean 定制一個(gè) Holder:

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

定義一個(gè)接口 :

public interface HolderTestBeanInterface1 extends Remote {       public void echoCalendar(CalendarHolder val, Date date) throws               RemoteException;       public void echoBeanHolder(BeanTestHolder beanTestHolder,BeanTest beanTest) throws               RemoteException;   }

接口的實(shí)現(xiàn)類(lèi) :

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ā)布

客戶(hù)端的調(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類(lèi)型是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI