`

AXIS封装Web Service(转)

    博客分类:
  • java
阅读更多

一、环境准备
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>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>

<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>

二、开发service
服务器端的service为普通的java类:com.hnisi.axis.BookOrder

publicclass BookOrder {
public String getName(String name) {
System.out.println("start execute ...");
return"book name: "+ name;
}

public Book setPrice(Book book){
book.setPrice(10);
return book;
}
}

com.hnisi.axis.Book为简单的值对象,包含两个属性name,price。

三、发布service
1、手工修改server-config.wsdd文件(在已有server-config.wsdd文件的情况下)
添加service:

<service name="BookOrder" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="com.hnisi.axis.BookOrder"/>
</service>

allowedMethods是调用的服务的方法,如果有多个方法的话可以用空格分开,当用*的时候表示全部。

2、写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">
<service name="BookOrder" provider="java:RPC">
<parameter name="className" value="com.hnisi.axis.BookOrder"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>

deploy.wsdd文件位于/web-inf目录下。
使用AdminClient发布该service,在/web-inf目录下新建deploy.bat文件:

set LIB_HOME=./lib
set CPATH=.;%LIB_HOME%\axis.jar;%LIB_HOME%\jaxrpc.jar;%LIB_HOME%\commons-logging-1.0.2.jar;%LIB_HOME%\commons-discovery-0.2.jar;%LIB_HOME%\saaj.jar;%LIB_HOME%\activation.jar;%LIB_HOME%\mail.jar
java -classpath %CPATH% org.apache.axis.client.AdminClient -lhttp://localhost:8080/test/services/AdminService deploy.wsdd
pause

执行deploy.bat,会生成server-config.wsdd文件。成功生成的几个必要条件:
a. axis相关jar包存在于/web-inf/lib下
b. 你的tomcat必须启动,同时留意deploy.bat文件的第三行"http://localhost:8080/test/services/AdminService",根据具体情况修改。
否则会报"java.net.ConnectException: Connection refused: connect"异常。

综合上述,在第一次发布service的情况下,需用方式2生成server-config.wsdd,后续开发过程中,使用方式1直接修改server-config.wsdd文件。

发布后,执行http://localhost:8080/test/services,能看到当前web应用的所有web service.
http://localhost:8080/test/services/BookOrder?wsdl 为ServerService对应WSDL.
还可以通过IE浏览器直接调用服务,方法是在服务URL后加"method=xxx",其中xxx是要调用的方法名称:
http://localhost:8080/test/services/BookOrder?method=getName&name=HH

四、调用service
有两种方式可以调用service。
1、使用org.apache.axis.client.Call直接调用

package com.hnisi.axis;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

publicclass CallService {
publicstaticvoid main(String[] args) {
try {
String endpoint ="http://localhost:8080/test/services/BookOrder"
Service service =new Service();
Call call = (Call) service.createCall();

call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName("getName" );

String ret = (String) call.invoke(new Object[] {"yehailong"});
System.out.println("return value is "+ obj[0]);
catch (Exception ex) {
ex.printStackTrace();
}
}
}

2、根据wsdl生成客户端java代码
/web-inf目录下新建make.bat文件:

set LIB_HOME=./lib
set CPATH=.;%LIB_HOME%\axis.jar;%LIB_HOME%\jaxrpc.jar;%LIB_HOME%\commons-logging-1.0.2.jar;%LIB_HOME%\commons-discovery-0.2.jar;%LIB_HOME%\saaj.jar;%LIB_HOME%\activation.jar;%LIB_HOME%\mail.jar;%LIB_HOME%\wsdl4j-1.5.1.jar;%LIB_HOME%\log4j-1.2.6.jar;./classes

java -classpath %CPATH% org.apache.axis.wsdl.WSDL2Java -p com.hnisi.axis.client http://192.168.3.42:8080/test/services/BookOrder?wsdl

pause


生成java代码在包com.hnisi.axis.client下面,封装了调用的接口。

然后,使用以上生成的java代码,编写调用service的测试类com.hnisi.axis.client.CallService:

package com.hnisi.axis.client;

publicclass CallService {
publicstaticvoid main(String[] args) {
try {
BookOrderService service =new BookOrderServiceLocator();
BookOrder_PortType client = service.getBookOrder();
String retValue = client.getName("zhangsan");
System.out.println(retValue);
catch (Exception e) {
System.err.println("Execution failed. Exception: "+ e);
}
}
}

五、对象的序列化和返序列化
在以上代码的基础上,试图调用BookOrder的setPrice服务,会报这样的异常:
faultString: java.io.IOException: No serializer found forclass com.hnisi.axis.Book in registry

由于SOAP中值的类型就是XML Schema中的基本类型,默认只支持简单类型和数组。所以在进行对象传递的过程中,需要进行序列化和反序列化。
Axis为提供了大量的序列化/反序列化器,能够基本满足大部分应用:
1、基本类型,如intdouble等,转换成基本对象类型java.lang.Integer、java.lang.Double。
2、常用集合对象的转换
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 =new QName("urn:BeanService","Book"); 
call.registerTypeMapping(Book.class, qn,
new BeanSerializerFactory(Book.class, qn),
                    new BeanDeserializerFactory(Book.class, qn));
而对于调用方法二,重新根据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发布。整合的方法有两种:
1、直接发布
将spring容器中预定义的service直接做为web service对外发布。
为此,web服务的提供类必须有spring管理,在调用web服务时需要从web应用环境(ServletContext)中去获取服务类的bean实例。
具体的实现原理请参考http://blog.csdn.net/liumyong/archive/2004/12/09/210043.aspx
2、间接发布
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());

以上两种方式各有优缺点:
方式1
需要继承扩展axis的相关代码,重载实现org.apache.axis.transport.http.AxisServlet,并提供一个SpringBeanProvider类来处理web service bean与spring service bean的关联。
优点是,spring service直接做为web service发布,直接配置,无需任何附加中间接口。
方式2
需要为每个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服务遵循异步处理范例。

//TODO 给出document方式的实例

八、安全性问题
参考《实现安全的AXIS Web服务》。

九、开发工具
1、ant支持
Axis为支持Ant构建,提供了一个axis-ant.jar文件。
该文件包含三个可选任务(task)的定义和实现:axis-wsdl2java,axis-java2wsdl和axis-admin。
可以在项目的build.xml文件中引入如上三个任务
<taskdef resource="axis-tasks.properties" classpathref="lib.class.path"/>
确保axis-ant.jar文件在你的build path中。
axis-wsdl2java: 由wsdl(本地wsdl文件或internet输出)生成客户端java代码。
axis-java2wsdl: 由服务接口类java代码生成对应的wsdl描述文件。
axis-admin: 服务的发布&取消发布管理。
各task的具体属性配置请参考axis包\docs\ant。

2、eclipse wtp
纯eclipse开发环境没有开发web service的功能,使用wtp-all-in-one-sdk-1.0开发环境能方便地发布web service。
右键点击服务接口文件,选择webServices,有以下功能:生成web Service等。
右键点击wsdl文件,选择webServices,有以下功能:发布wsdl文件,生成客户端代码等。
在第一次生成web service时,会自动下载axis相关jar包并完成构建(web.xml自动修改,加载AxisServlet),无需任何人工干预。
同时eclipse提供了友好的界面操作,如测试的时候,提供界面让你输入参数,而不必该改程序。

以上操作在一个新建的web project中顺利实现.
当在已存在的eecmis工程中,做以上web service生成操作,无法在当前web应用集成发布web service,会自动发布到一个独立的web应用(默认名WebServiceProject)。
在系统实际部署时,可以将这两个web应用打成ear包一起部署。

分享到:
评论

相关推荐

    AXIS Web Service入门及应用

    AXIS Web Service是一种基于Java的开源工具,用于创建和部署Web服务。它是Apache软件基金会的项目,主要用于简化SOAP(简单对象访问协议)处理,使得开发人员可以轻松地将Java类转换为Web服务或调用远程Web服务。在...

    Axis 开发Web Service(学习笔记)

    **Axis开发Web Service学习笔记** 在信息技术领域,Web服务是一种基于开放标准的互联网通信协议,允许不同的应用程序之间进行互操作。而Axis是Apache软件基金会的一个开源项目,它提供了一个强大的工具集,用于创建...

    通向架构师的道路(第十二天)之Axis2 Web Service(三).docx

    【标题】:“通向架构师的道路(第十二天)之Axis2 Web Service(三)” 【描述】:本文档是通往架构师学习路径的一部分,主要关注Axis2框架下的Web Service开发,尤其是关于SOAP特性的应用。 【标签】:Axis2 ...

    深入理解axis2-web service产生

    ### 深入理解Axis2与Web Service #### Web Service概览 随着互联网技术的不断发展,Web Service作为一种标准的应用间通信方式,逐渐被广大开发者所接受。它是一种以标准方式暴露应用程序功能的服务,使得不同平台...

    Java RPC通信机制之SOAP:应用Apache Axis进行Web Service开发

    以下是使用Apache Axis进行Web Service开发的关键步骤: 1. **创建服务**: 开发者首先定义Java接口和服务实现,这些接口描述了可供远程调用的方法。然后,使用Axis工具,这些接口和实现可以被转换成SOAP服务。 2. ...

    DataHander.rar_axis datahand_web service _webservice

    标题 "DataHandler.rar_axis datahand_web service _webservice" 暗示了这是一个关于使用Axis框架来处理Web服务的项目,其中可能包含了客户端和服务端的数据处理组件。描述中提到的"webservices附件传输"指的是通过...

    web service ppt

    XFire是Java平台上的Web Service框架,而Axis则提供1.x和2.x两个版本,用于生成和部署Web Service。此外,Web Service的相关技术还包括AJAX(Asynchronous JavaScript and XML)用于增强用户体验,JMS(Java Message...

    Web Service(Axis) + Excel(Office 2003)

    通过VBA,我们可以创建自定义函数,封装Web服务调用并在单元格中直接使用。这不仅简化了操作,还能在工作簿中多次重用相同的Web服务请求。 在实际应用中,这种集成可以用于各种场景,如实时数据更新、数据分析以及...

    Web Service原理及应用

    Web Service主要依赖HTTP协议进行传输,使用SOAP协议封装数据,WSDL描述服务接口,UDDI用于服务的注册和查找。此外,WS-Security、WS-ReliableMessaging等扩展规范进一步增强了安全性、可靠性和互操作性。 1.5 Web ...

    Web Service Java C# 实现 订餐小系统

    在C#中,我们可以使用.NET Framework的WSDL.exe工具或Visual Studio的Add Service Reference功能来生成客户端代理类,这些类封装了与Web Service交互的所有细节。项目中的"OMSAxisClientV1_0"可能就是这样一个客户端...

    java-ws-clients.rar_SOAP Web_Web Service SOAP_axis

    本压缩包“java-ws-clients.rar”包含了一些关于如何使用Java和Apache Axis库创建及操作SOAP Web服务的实例。Apache Axis是一个开源的Java框架,它简化了SOAP客户端和服务端的实现。 SOAP是一种基于XML的协议,用于...

    XML Web Service开发教程

    在开发XML Web Service时,我们将学习如何使用工具如Apache Axis、Microsoft .NET的ASMX或WCF(Windows Communication Foundation)等,它们简化了服务的创建、部署和调用。例如,ASMX允许开发者使用.NET Framework...

    Android axis调用Webservice

    - 这些类将封装调用Web Service的具体方法,简化了调用流程。 4. **调用服务:** - 在Android应用中实例化生成的stub类,然后调用对应的方法。 - 参数可以是基本类型、List、Map或自定义对象,根据Web Service...

    Web Services & Axis2.zip(2011年度巨献)

    4. **基于AXIS2的Web Service开发.doc** - 这部分可能详细阐述了使用Axis2进行Web服务开发的完整流程,从创建服务端到发布、测试和服务调用。 5. **WSDL教程.doc** - WSDL是Web服务的核心描述文件,这份教程可能...

    axis2-1.5.6完整版

    1. **服务组件模型**:Axis2 的服务组件模型(Service Component Architecture, SCA)使得开发人员能够轻松地将业务逻辑封装为服务,并通过 WSDL 描述。服务可以通过多种协议(如 SOAP、REST、HTTP)进行交互,支持...

    一个实现天气查询的WEB Service的源程序

    3. **库文件**:`.jar`文件,可能包含了运行Web Service所需的第三方库,如 Axis、Jersey 或者CXF等框架的实现。 4. **测试文件**:可能包含`.jsp`或者`.html`页面,用于展示查询结果,或者`.java`测试类用于验证...

    Web Service详细解析及使用方法

    SOAP(Simple Object Access Protocol)是Web Service的基础,它定义了如何在XML中封装数据,以及如何通过HTTP或HTTPS等传输协议发送这些数据。 **XFIRE和AXIS的比较** XFIRE和AXIS各有优势。XFIRE适合小型项目,...

    ATA XML Web Service 2009年1月真题01

    5. **Web Service开发**:可能涉及到使用工具(如Apache Axis或.NET的WSDL.exe)生成客户端代码,或者创建Web Service服务器端接口。 6. **互操作性**:XML Web Service的一个主要优点是跨平台和跨语言的互操作性,...

Global site tag (gtag.js) - Google Analytics