Web Service之Chain的使用
chain是若干个handler的集合(handler串)
一个用户需要3个handler,另一个需要2个handler,它们共有1个相同的handler,如果分别都给予,就太浪费资源了,所以可以用chain来实现。
service-----handler:解决方法是编写chain
先编写服务端程序:
publicclassHelloWorld {
privateintrequestCount = 0 ;
public String hello(Stringname){
requestCount++ ;
System.out.println("RequestCount="+ requestCount);
System.out.println("you recevice name :"+ name);
return"Hello "+ name ;
}
}
HelloWorldHandler.java
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
publicclassHelloWorldHandler extends BasicHandler {
publicvoid invoke(MessageContextmsgContext) throwsAxisFault {
Stringstate = (String) this.getOption("state");
System.out.println("此时调用的是第一个handler程序,获取的初始化参数是" + state);
}
}
修改server-config.wsdd配置信息
<handlername="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">
<parametername="state" value="123" />
</handler>
<servicename="HelloWorld" provider="java:RPC">
<parametername="className" value="com.webservice.anni.HelloWorld"/>
<parametername="allowedMethods" value="*" />
<requestFlow>
<handlertype="HelloWorldHandler" />
</requestFlow>
<responseFlow>
<handlertype="HelloWorldHandler" />
</responseFlow>
</service>
客户端程序为:
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
publicclassTestClient {
publicstaticvoid main(String[] args) throws Exception {
//指定获取web服务的位置
Stringurl = "http://localhost:8089/axis/services/HelloWorld" ;
Serviceservice = newService() ;
Callcall = (Call) service.createCall() ;
call.setTargetEndpointAddress(new java.net.URL(url)) ;
call.setOperationName(new QName(url,"hello"));
StringreturnValue = (String) call.invoke(new Object[]{"Xin"}) ;
System.out.println(returnValue);
}
}
此时,会有如下结果:
此时调用的是第一个handler程序,获取的初始化参数是123
RequestCount=1
you recevice name :Xin
此时调用的是第一个handler程序,获取的初始化参数是123
再回到服务器端:编写:
import org.apache.axis.AxisFault;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
publicclassHelloWorldHandler2 extends BasicHandler {
publicvoid invoke(MessageContextmsgContext) throwsAxisFault {
Stringstate = (String) this.getOption("state");
System.out.println("此时调用的是第二个handler2程序,获取的初始化参数是" + state);
}
}
配置信息:
<handler name="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">
<parametername="state" value="123" />
</handler>
<handler name="HelloWorldHandler2"type="java:com.webservice.anni.HelloWorldHandler2">
<parameter name="state"value="123" />
</handler>
<servicename="HelloWorld" provider="java:RPC">
<parametername="className" value="com.webservice.anni.HelloWorld"/>
<parametername="allowedMethods" value="*" />
<requestFlow>
<handlertype="HelloWorldHandler" />
<handler type="HelloWorldHandler2" />
</requestFlow>
<responseFlow>
<handlertype="HelloWorldHandler" />
<handler type="HelloWorldHandler2" />
</responseFlow>
</service>
运行客户端程序,显示的信息为:
此时调用的是第一个handler程序,获取的初始化参数是123
此时调用的是第二个handler2程序,获取的初始化参数是123
RequestCount=1
you recevice name :Xin
此时调用的是第一个handler程序,获取的初始化参数是123
此时调用的是第二个handler2程序,获取的初始化参数是123
现在把这两个过滤器组合在一起!
在服务端编写程序HelloWorldChain.java
import org.apache.axis.SimpleChain;
publicclassHelloWorldChain extends SimpleChain {
//自定义handler串
public HelloWorldChain(){
//调用需要使用的handler
HelloWorldHandlerhandler1 = newHelloWorldHandler() ;
HelloWorldHandler2handler2 = newHelloWorldHandler2() ;
//将使用的handler放入chain中
this.addHandler(handler1) ;
this.addHandler(handler2) ;
}
}
配置信息为:
<handler name="HelloWorldHandler"type="java:com.webservice.anni.HelloWorldHandler">
<parametername="state" value="123" />
</handler>
<handlername="HelloWorldHandler2"type="java:com.webservice.anni.HelloWorldHandler2">
<parametername="state" value="123" />
</handler>
<chainname="HelloWorldChain">
<handlertype="java:com.webservice.anni.HelloWorldHandler"/>
<handlertype="HelloWorldHandler2"/>
</chain>
<servicename="HelloWorld" provider="java:RPC">
<parametername="className" value="com.webservice.anni.HelloWorld"/>
<parametername="allowedMethods" value="*" />
<requestFlow>
<chaintype="HelloWorldChain" />
</requestFlow>
<responseFlow>
<chaintype="HelloWorldChain" />
</responseFlow>
</service>
控制台显示的信息为:
此时调用的是第一个handler程序,获取的初始化参数是null
此时调用的是第二个handler2程序,获取的初始化参数是123
RequestCount=1
you recevice name :Xin
此时调用的是第一个handler程序,获取的初始化参数是null
此时调用的是第二个handler2程序,获取的初始化参数是123
这后面有点混乱,我自己都不是很明白。HelloWorldChain.java显得有点多余。配置信息的HelloWorldHandler参数也没能用上。