Web Service之Axis2(一)
注:目前LZ写的WerService都是比较简单的原理和使用,以后等LZ有能力了,就会写些深入的内容。
Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
实现一个完整的Web服务包括以下步骤:
◆ Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)
◆ Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)
◆ Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)
◆ 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)
◆ Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)
WebService一共有四种:CXF方式、Xfire方式、AXIS2方式、AXIS1方式
这里介绍AXIS2方式,其他方式见Web Service另外篇章。
Axis2:
Axis2的安装,官方文档说,axis2需要java5以上的不小于11M的磁盘空间。现在安装一下axis2
1:下载axis2的war包:http://www.apache.org/dist//axis/axis2/java/core/1.7.4/
2:解压所下载的war包到tomcat的webapps目录下
3:启动tomcat。在webapps目录下会生成axis2文件夹和相关文件。访问localhost:8080/axis2就能看到axis2运行成功的页面。
安装好后,来写一个Demo进行webService开发:
1:首先创建一个Maven项目wsDemo。
2:将Tomcat下的webapps/axis2/WEB-INF下的modules、services、lib(只需要jar包)和conf文件拷到wsDemo的WEB-INF下,然后将lib中的jar包build path一下(具体就不介绍了,网上很多),
当然其实Maven可以直接在pom.xml中添加更方便,效果一样。最后在services文件下新建一个wsDemo/META-INF目录,下面新建services.xml,然后配置下web.xml。
<!-- 加载Axis2 --> <servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
3:完成上面基础步骤之后,我们新建一个WsMethod类,里面有一些方法:
package com.ws.model; public class WsMethod { public String getMethodByParam(String name) { return "Method Name Is:" + name + "."; } public String getMethod() { return "Method Name Is:getMethod."; } public void NoReturnMethod(){ System.out.println("NO Return Method"); } }
4:在services.xml中进行配置
<!-- name:指定服务名称,注意,这里的名称到时候和访问名称后面的是一样的 --> <service name="WsMethodService"> <!-- 服务描述 --> <description> WsMethod Service Example </description> <!-- 服务级参数 --> <!-- 在services.xml文件中,我们可以直接在service节点下定义参数,这些 参数供消息上下文(在运行时)、AxisService或AxisOperation访问。 参数有一个必选参数和可选参数:参数名称是必选参数,这里的服务参数为指定的服务类。 --> <parameter name="ServiceClass"> com.ws.model.WsMethod </parameter> <!-- 服务级消息接收器 Axis2中消息接收器是特殊的处理器,是In路径(请求路径)中的最后一个处理器。Web服务中的每个操作都有他自己的消息接收器,而且不同的操作可以有不同的消息接收器。 消息接收器是依赖于消息交换模式的,所以我们必须为不同的消息交换模式指定不同的消息接收器。 怎样才能给所有的操作指定相同的消息接收器呢?只要添加服务级消息接收器即可。如此我们就不必在操作级别指定消息接收器了。我们要做的是指定服务级消息接收器。而在部署时, Axis2会自动给操作选择正确的消息接收器。这里我们指定Operation级消息接收器。前文描述了如何指定服务级消息接收器,但是,我们也可以为不同的操作指定不同的消息接收器, 这需要在operation中指定messageReceiver标签。 最后说明一个编写用于部署服务组的services文件的问题,要在单个服务包文件中部署多个服务,服务组是一个便捷方法,当然,这些服务之间应该存在逻辑关系。 用于服务组的services,xml文件和用于单个文件服务的,它们之间唯一的区别就是根元素,用于服务组的,根元素 是serviceGroup,我们可以在serviceGroup中定义多个service <serviceGroup> <service name=service1> ...... <service> <service name=service2> .......... </service> </serviceGroup> --> <operation name="getMethodByParam"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="getMethod"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="NoReturnMethod"> <!-- 这里要注意,当没有返回值时才用 org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver,没有参数还是用RPCMessageReceiver--> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> </operation> <!-- 启动Tomcat后访问 http://127.0.0.1/wsDemo/services/WsMethodService?wsdl 得到了一个wsdl文件 --> </service>
启动Tomcat后访问
http://127.0.0.1/wsDemo/services/WsMethodService?wsdl
可以得到一个wsdl文件
5:新建一个测试类WsTest来进行测试
package com.ws.test; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class WsTest { public static void main(String[] args) { String url = "http://127.0.0.1/wsDemo/services/WsMethodService"; String result = null; try { //使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); //指定调用的WebService的URL EndpointReference targetEPR = new EndpointReference(url); options.setTo(targetEPR); //在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间, //也就是 <wsdl:definitions>元素的targetNamespace属性值:http://model.ws.com //指定要调用的getWorld方法以及WSDL文件的命名空间... QName opAddEntry = new QName("http://model.ws.com", "getMethodByParam"); //指定getMethodByParam方法的参数值,如果有多个。继续往后增加即可,不用指定参数名称 Object[] opAddEntryArgs = new Object[]{"MethodA"}; //返回参数类似,这个和axis1有点区别 //invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名 //第二个参数表示要调用的WebService方法的参数值,参数类型是Object[] //丢三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[] //如果方法没有参数时,invokeBlocking方法的第二个参数值不能为null,而是new Object[]{} //如果被调用的WebService方法没有返回值,则使用RPCServiceClient类的invokeRobust方法 //该方法只有两个参数,参数含义和invokeBlocking方法的前两个参数含义相同 //指定getMethodByParam方法返回值的数据类型的Class对象 Class[] classes = new Class[]{String.class}; //调用getMethodByParam方法并输出该方法的返回值 result = (String)serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]; System.out.println(result); //下面是调用getMethod方法的代码,这些代码与调用getMethodByParam方法的代码类似 opAddEntry = new QName("http://model.ws.com", "getMethod"); opAddEntryArgs = new Object[] {}; System.out.println( serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0] ); // 下面是调用NoReturnMethod方法的代码 opAddEntry = new QName("http://model.ws.com", "NoReturnMethod"); serviceClient.invokeRobust(opAddEntry, new Object[] {}); } catch (AxisFault e) { e.printStackTrace(); } } }
运行结果:
Tomcat下运行结果:
参考资料:http://blog.csdn.net/csh624366188/article/details/8362696
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。