微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Axis 开发WebService

一、环境准备
1 、从axis网站下载相关内容:http: //apache.justdn.org/ws/axis/1_3/ 
2 、解压后,参考webapps\axis,为了使你的web应用axis开发web service,需要做的事情如下     a. 将webapps\axis\WEB- INF\lib下的相关jar包拷贝到你自己web应用的lib目录下。另外需要activation.jar、 mail.jar两个支持包。
     b.修改web.xml,加载axis的servlet。
< listener>class  org.apache.axis.transport.http.AxisHTTPSessionListener/ servlet name AxisServlet display Apache Axis Servletorg.apache.axis.transport.http.AxisServlet

 mapping url pattern* .jws services/*二、开发service
服务器端的service为普通的java类:com.hnisi.axis.BookOrder
public BookOrder {
String getName(String name) {
System.out.println("start execute ..." );
return "book name: "+ name;
}
Book setPrice(Book book){
book.setPrice(10book;
com.hnisi.axis.Book为简单的值对象,包含两个属性name,price。
三、发布service
 、手工修改server config.wsdd文件(在已有server config.wsdd文件的情况下)
添加service:
 service name="BookOrder" provider"java:RPC" parameter name"allowedMethods" value"*""className""com.hnisi.axis.BookOrder" serviceallowedMethods是调用的服务的方法,如果有多个方法的话可以用空格分开,当用 的时候表示全部。
 、写deploy.wsdd文件,使用axis提供的AdminClient工具,自动生成server config.wsdd。deploy.wsdd文件如下:
 deployment xmlns"http://xml.apache.org/axis/wsdd/"xmlns java"http://xml.apache.org/axis/wsdd/providers/java" deploymentdeploy.wsdd文件位于 web inf目录下。
使用AdminClient发布该service,在 inf目录下新建deploy.bat文件set LIB_HOME . lib
set CPATH .;% LIB_HOME \axis.jar; \jaxrpc.jar; \commons logging0 .jar;\commons discovery \saaj.jar; \activation.jar; \mail.jar
java  classpath  CPATH org.apache.axis.client.AdminClient  lhttp//localhost:8080/test/services/AdminService deploy.wsddpause
执行deploy.bat,会生成server config.wsdd文件。成功生成的几个必要条件:
a. axis相关jar包存在于 inf lib下
b. 你的tomcat必须启动,同时留意deploy.bat文件的第三行"http://localhost:8080/test/services/AdminService" ,根据具体情况修改
否则会报"java.net.ConnectException: Connection refused: connect" 异常。
综合上述,在第一次发布service的情况下,需用方式 生成server config.wsdd,后续开发过程中,使用方式 直接修改serverconfig.wsdd文件
发布后,执行http//localhost:8080/test/services,能看到当前web应用的所有web service.http//localhost:8080/test/services/BookOrder?wsdl 为ServerService对应WSDL.还可以通过IE浏览器直接调用服务,方法是在服务URL后加"method=xxx" ,其中xxx是要调用方法名称//localhost:8080/test/services/BookOrder?method=getName&name=HH四、调用service
有两种方式可以调用service。
 、使用org.apache.axis.client.Call直接调用
package com.hnisi.axis;
import org.apache.axis.client.Call;
org.apache.axis.client.Service;
CallService {
static void main(String[] args) {
try {
String endpoint "http://localhost:8080/test/services/BookOrder" ; 
Service service new Service();
Call call  (Call) service.createCall();
call.setTargetEndpointAddress( java.net.URL(endpoint) );
call.setoperationName("getName"String ret  (String) call.invoke(Object[] {"yehailong" });
"return value is " obj[ ]);
catch (Exception ex) {
ex.printstacktrace();
 、根据wsdl生成客户端java代码
 inf目录下新建make.bat文件 \mail.jar;\wsdl4j5 \log4j6 .jar;. classes
 org.apache.axis.wsdl.WSDL2Java  p com.hnisi.axis.client http//192.168.3.42:8080/test/services/BookOrder?wsdl生成java代码在包com.hnisi.axis.client下面,封装了调用的接口。
然后,使用以上生成的java代码,编写调用service的测试类com.hnisi.axis.client.CallServicecom.hnisi.axis.client;
BookOrderService service BookOrderServiceLocator();
BookOrder_PortType client  service.getBookOrder();
String retValue  client.getName("zhangsan"System.out.println(retValue);
(Exception e) {
System.err.println("Execution Failed. Exception: " e);
五、对象的序列化和返序列化
在以上代码的基础上,试图调用BookOrder的setPrice服务,会报这样的异常:
faultString java.io.IOException No serializer found for com.hnisi.axis.Book in registry
由于SOAP中值的类型就是XML Schema中的基本类型,认只支持简单类型和数组。所以在进行对象传递的过程中,需要进行序列化和反序列化。
Axis为提供了大量的序列化 反序列化器,能够基本满足大部分应用:
 、基本类型,如int double 等,转换成基本对象类型java.lang.Integer、java.lang.Double。
 、常用集合对象的转换
java.util.List == java.lang.Object[]
java.util.Vector  java.util.Vector
3 、普通JavaBean(简单值对象)的序列化和反序列化
首先,在web service部署端,修改server config.wsdd文件,在具体的service配置,增加如下代码
 beanMapping languageSpecificType"java:com.hnisi.axis.Book" qname"ns1:Book"         xmlns ns1"urn:BeanService"languageSpecificType属性指定JavaBean类文件位置,qname属性指定JavaBean类的名字。当然,一个service可以绑定多个bean对象。
其次,在客户端,完成对象的注册
对于调用方法一中,需要新增如下代码以完成注册
QName qn QName("Book" ); 
call.registerTypeMapping(Book.,qn,
BeanSerializerFactory(Book.                    BeanDeserializerFactory(Book.而对于调用方法二,重新根据wsdl生成java代码,已完成必要的对象注册过程,CallService中可以直接传递Book对象了。
4 、复杂java对象的序列化
需要自行开发一个序列化 反序列化器,请参考http//kb.csdn.net/java/Articles/200506/73d6aea4-0d38-4e21-a188-473790c9ef57.html六、axis和spring的集成
spring容器管理的业务层服务bean,可以做为web service发布。整合的方法有两种:
 、直接发布
spring容器中预定义的service直接做为web service对外发布。
为此,web服务的提供类必须有spring管理,在调用web服务时需要从web应用环境(ServletContext)中去获取服务类的bean实例。
具体的实现原理请参考http//blog.csdn.net/liumyong/archive/2004/12/09/210043.aspx 、间接发布
spring业务层servcie不直接做为web service对外发布,提供一个间的接口(类)来调用spring service。
对外发布成web service的接口需要从Axis的contextAxis得到Spring的contextSpring:
        HttpServlet servlet  (HttpServlet) MessageContext.getCurrentContext().getProperty(HTTPConstants.MC_HTTP_SERVLET);
        ApplicationContext context  WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
以上两种方式各有优缺点:
方式 :
需要继承扩展axis的相关代码,重载实现org.apache.axis.transport.http.AxisServlet,并提供一个 SpringBeanProvider类来处理web service bean与spring service bean的关联。
优点是,spring service直接做为web service发布,直接配置,无需任何附加中间接口。
需要为每个web service提供一个中间接口来调用spring service。
在单一的spring service不能满足web服务需求时,可使用中间接口类综合调用多个spring service,然后集中做为一个web service发布出去。
综合上述,在实际的开发过程中,结合具体的应用灵活采取
七、Document Literal 样式 
前文所使用的都是RPC ENCODED样式发布service,axis根据一定的规则完成JAVA对象和XML文件的转化,即序列化和反序列化过程。
采用此方式,发布和调用的过程都很简单,服务发布方和调用方都是直接面向JAVA对象,而其缺点也相当明显客户端需要使用服务器端的辅助JAVA对象(尽管这些JAVA代码可以自动根据WSDL生成),服务提供者和客户之间的紧密耦合,任何对接口的更改都会导致服务和客户间联系的中断。
Document样式和上面的RPC样式最主要的不同就是,前者中客户在一个规范的XML文档中向服务器发送服务参数,而代替了后者中的一组离散的方法的参数值。这使得Document样式比RPC样式有更加松散的耦合关系。
Web服务提供者处理规范的XML文档,执行操作并向客户端作出响应,返回的也是一个规范的XML文档。在服务器对象(参数,方法调用等)和XML数据值之间并没有一种直接的映射关系。应用程序负责映射XML数据值。
Document样式中SOAP消息在它的SOAP体中包含了一个或者更多的XML文档。协议并没有约束文档需要如何组织构成;这完全是在程序级处理的。另外,Document样式web服务遵循异步处理范例。
八、安全性问题
参考《实现安全的AXIS Web服务》。
九、开发工具
 、ant支持
 、eclipse wtp

http://yangzb.iteye.com/blog/256890

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐