holder是什么意思(Holder类型是什么)

发布时间:2025-12-10 23:25:08 浏览次数:1

要弄清楚什么是 Holder 类型,得先搞清楚 IN 参数, OUT 参数, INOUT 参数的概念。

IN 参数是 JAVA 因有的参数, OUT , INOUT 参数不是 JAVA 固有的。

复制传递:IN参数

java 编程语言对作为参数传递给方法调用的所有原始值采用复制传递的方式,即传递的值是方法调用中所使用变量的复制,而不是原始值本身。比如定义一个方法

test(intintValue,DatedateValue){intValue=5;dateValue=newDate(0);}

在作如下调用时

intintValue=1;DatedateValue=newDate();test(intVlaue,dateValue);System.out.println(intValue)//打印1System.out.pritnln(dateValue)//打印现在的时间。

但是在 test 方法中对参数的值作了修改。而实际的参数值并未发生改变。

引用传递 : INOUT 参数 OUT 参数 .

在实现引用传递的编程语言中,如果 test 方法的两面个参数定义为引用传递 , 对上述 test 方法调用后,再打印 intValue 跟 dateValue 的值,会发现这两个值已经发生了改变。但是 OUT 参数更象一个返回值,因为值要从方法中传出而不是传入。使用 OUT 参数数,激活方法前不访问变量的值,即传入的值被忽略了。

Holder 类:

在 JAX-RPC 中支持 INOUT,OUT 参数。 Holder 是一个接口,它只是提供了一个补救措施,以在 java 中支持引用传递。这样就使得需要用 java 与支持 INOUT,OUT 参数的编程语言写的 web 服务进行通信 .

从 WSDL 映射 HOLDER 类型 :

接口定义

publicinterfaceHolderTestBeanInterface1extendsRemote{publicvoidechoCalendar(CalendarHolderval,Datedate)throwsRemoteException;publicvoidechoBeanHolder(BeanTestHolderbeanTestHolder,BeanTestbeanTest)throwsRemoteException;}

WSDL 文档

<?xmlversion="1.0"encoding="UTF-8"?><definitionsname='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'><messagename='HolderTestBeanInterface1_echoCalendar'><partname='Calendar_1'type='xsd:dateTime'/><partname='Date_2'type='xsd:dateTime'/></message><messagename='HolderTestBeanInterface1_echoCalendarResponse'><partname='Calendar_1'type='xsd:dateTime'/></message><operationname='echoCalendar'parameterOrder='Calendar_1Date_2'><inputmessage='tns:HolderTestBeanInterface1_echoCalendar'/><outputmessage='tns:HolderTestBeanInterface1_echoCalendarResponse'/></operation></portType>…

标记为 Calendar_1 的 part 元素既在 input 消息中又在 ouput 消息中 ,jax-rpc 编译器知道它是一个 INOUT 类型 , 同时也需要 Holer 类型。如果在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 并且必须定义一个空的构造函数就象下面这样:

publicclassBeanTestHolderimplementsjavax.xml.rpc.holders.Holder{publicBeanTestvalue;publicBeanTestHolder(){}publicBeanTestHolder(BeanTestbeanTest){value=beanTest;}}

Jboss Web Service 的 Holder 类型的具体实现 , 采用 Jboss 4.04 版本 .

定义一个 bean 类 :

publicclassBeanTest{privateStringbeanName;publicBeanTest(){}publicStringgetBeanName(){returnbeanName;}publicvoidsetBeanName(StringbeanName){this.beanName=beanName;}}

给 bean 定制一个 Holder:

packageholder;publicclassBeanTestHolderimplementsjavax.xml.rpc.holders.Holder{publicBeanTestvalue;publicBeanTestHolder(){}publicBeanTestHolder(BeanTestbeanTest){value=beanTest;}}

定义一个接口 :

publicinterfaceHolderTestBeanInterface1extendsRemote{publicvoidechoCalendar(CalendarHolderval,Datedate)throwsRemoteException;publicvoidechoBeanHolder(BeanTestHolderbeanTestHolder,BeanTestbeanTest)throwsRemoteException;}

接口的实现类 :

importjavax.xml.rpc.holders.*;importjava.util.Date;publicclassHolderTestBeanimplementsHolderTestBeanInterface1{publicvoidechoCalendar(CalendarHolderval,Datedate){System.out.println("echoCalendar:"+val.value.getTime());val.value.setTime(newDate());System.out.println(date);}publicvoidechoBeanHolder(BeanTestHolderbeanTestHolder,BeanTestbeanTest){BeanTestbeantest=beanTestHolder.value;System.out.println(beantest.getBeanName()+"holder");beantest.setBeanName("newname");System.out.println(beantest.getBeanName()+"holder");System.out.println(beanTest.getBeanName()+"bean");beanTest.setBeanName("newnametoo");System.out.println(beanTest.getBeanName()+"bean");}}

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

<?xmlversion="1.0"encoding="UTF-8"?><!--wstools-cpclasses-configwstools-config.xml--><configurationxmlns="http://www.jboss.org/jbossws-tools"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.jboss.org/jbossws-toolshttp://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd"><java-wsdl><servicename="HolderTestBeanInterface1"style="rpc"endpoint="holder.HolderTestBeanInterface1"/><namespacestarget-namespace="http://holder"type-namespace="http://holder"/><mappingfile="HolderTestBeanInterface1.xml"/><webservicesservlet-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>HolderTestBeanInterface1Servlet<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 文件并发布

客户端的调用 :

importjava.net.URL;importjavax.xml.rpc.*;importjavax.xml.namespace.QName;importjava.util.*;importjava.io.File;importjavax.xml.rpc.holders.CalendarHolder;importorg.jboss.ws.jaxrpc.ServiceFactoryImpl;publicclassClientTest{privateHolderTestBeanInterface1getPort()throwsException{ServiceFactoryImplfactory=newServiceFactoryImpl();URLwsdlURL=newFile("holderTest/WEB-INF/wsdl/HolderTestBeanInterface1.wsdl").toURL();URLmappingURL=newFile("holderTest/WEB-INF/HolderTestBeanInterface1.xml").toURL();QNameqname=newQName("http://holder","HolderTestBeanInterface1");Serviceservice=factory.createService(wsdlURL,qname,mappingURL);HolderTestBeanInterface1port=(HolderTestBeanInterface1)service.getPort(HolderTestBeanInterface1.class);returnport;}publicstaticvoidmain(String[]args)throwsException{ClientTestclienttest=newClientTest();HolderTestBeanInterface1h=clienttest.getPort();Datedate=newDate();System.out.println(date+"datebegin...");GregorianCalendarvalue=newGregorianCalendar(2006,1,1,23,59,59);CalendarHolderholder=newCalendarHolder(value);System.out.println(holder.value.getTime()+"calendarHolderbegin...");h.echoCalendar(holder,date);System.out.println(holder.value.getTime()+"calendarHolderend...");System.out.println(date+"dateend...");BeanTestbeanTest=newBeanTest();beanTest.setBeanName("test");BeanTestbeanTest2=newBeanTest();beanTest2.setBeanName("test2");System.out.println(beanTest.getBeanName()+"holderbegin..");System.out.println(beanTest2.getBeanName()+"beanbegin..");BeanTestHolderbeanTestHolder=newBeanTestHolder(beanTest);h.echoBeanHolder(beanTestHolder,beanTest2);System.out.println(beanTest2.getBeanName()+"beanend..");System.out.println(beanTestHolder.value.getBeanName()+"holderend..");}}

到此,关于“Holder类型是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注本站网站,小编会继续努力为大家带来更多实用的文章!

holder是什么意思
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477