- 浏览: 38964 次
- 性别:
- 来自: 广州
文章分类
最新评论
一、环境准备
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、基本类型,如int、double等,转换成基本对象类型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包一起部署。
发表评论
-
JSP空白页
2010-10-30 16:09 1303今天把原本可以运行的项目移到另一部电脑中,所有JSP页面都是 ... -
Only a type can be imported
2010-10-17 21:49 5610<!--StartFragment --> ... -
JAVA学习---Myeclipse中乱码的问题(转)
2010-07-30 21:49 3934JAVA学习---Myeclipse中乱码的问题 2010- ... -
去除list中null值
2010-01-23 22:54 2392list.toArray(); -
MyEclipse不能调试J2ME程序
2009-08-10 20:01 1646一个多月前写的手机地图程序好好的,今天运行居然运行不了,一开始 ...
相关推荐
Axis开发Web Service实例,介绍AXIS的三种方法
Axis2 Web Service 开发教程, axis2_WebService_开发指南
web service在web接口系统中是jms中很不错的一个选择。而axis又是开发web service的不二人选。本文通过理论结合实例的方式讲解如何通过axis来开发web service。所有实例代码均可copy运行成功。
通过该实验将掌握配置MyEclipse7.0的axis Web Service的开发环境,通过Top-Down方式创建、发布基于axis Web Service的基本步骤,进一步加深学生对XML、WSDL、SOAP等Web Service概念的理解。
使用AXIS开发Web Service 客户端调用的三种方式都有完整例子及步骤
使用Axis开发Web Service程序 在文档中进行了最简单的说明和举例 对于简单框架搭建进行了代码举例
简单地描述下怎么使用 eclipse 生成 Axis2 Web Service 客户端。
用axis2开发web service,过程比用axis1开发web service简单
基于axis 的web service 开发v0.3
web service架设完整流程,内附图解教学
为了更多喜爱开发的程序员也能迅速了解Web Service的开发,我这里整理了一些通过Axis开发Web Service的一些要点,希望能让不熟悉Web Service的开发人员能够迅速掌握Web Service。
基于AXIS2实现Web Service开发
axis web service client 源码
本案例为java开发的axis的web service案例。下载后直接部署到tomcat下即可运行。大家互相学习。
axis java web service web 服务
本资源是Web Service 的框架之一 Axis 集成Web网站示例代码
网上无意中找到的... 介绍Axis 开发WEB SERVICE,挺不错的.
Java RPC通信机制之SOAP:应用Apache Axis进行Web Service开发
Axis2创建web service快速入门