- 浏览: 3502058 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
最近一直在集成基础事业部开发的一个报表工具,昨天做登录的时候,需要用到webservice 。我们部门用的是Axis2 ,而报表这边用的是Axis。 没用过一,又不想把二的报都导入到报表中, 就试了试用一。看了看文档,生成客户端代码很容易就完成了, 但是发现和二生成的不一样,最后没有耐心了,也没有继续研究下去,还是用了Axis2。
下文是我在学习Axis的时候,看到的一个比较好的帖子,贴上来和大家分享,共同学习进步。
一、环境准备
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
public
class
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;
public
class
CallService {
public
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( 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;
public
class
CallService {
public
static
void
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 for
class
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包一起部署。
评论
错误提示:
faultString: java.io.IOException: No serializer found for class com.web.test.FinancialTask in registry org.apache.axis.encoding.TypeMappingDelegate@33d87ab8
发表评论
-
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1750SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1934If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3757原文出处:http://blog.chenlb.com/200 ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3882When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1988When I try to install the And ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14838大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1709charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22619Java Native Access 项目 在 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13362"在服务器运行过程中,Spring不停的运行的计划任 ... -
DBCP代码研读以及就数据库连接失效的解决
2011-03-31 11:03 3763问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什 ... -
ContextLoaderListener
2010-12-06 15:58 8463(1) org.springframework.web.c ... -
Servlet3.0新功能: 异步处理
2010-12-06 15:22 3181J2EE 6和Glassfish 3V正式发 ... -
Servlet3.0引入的新特性
2010-12-06 15:20 3056Servlet3.0规范的新特性主要是为了3个目的: ... -
100個節點上運行群集亞馬遜EC2上Hazelcast
2010-12-03 23:59 3317本文的目的,適是给妳湮示的細節集群的100個節點。此湮示記錄, ... -
Spring Properties Reloaded
2010-12-02 14:54 4372Spring Properties Reloaded Som ... -
为spring2.5中的jpetstore增加perf4j监控
2010-09-02 13:51 2643perf4j是一款类似于log4j的性能检测工具. 它 ... -
语义网的学习资源大汇集(备忘)
2010-06-23 22:48 1734网上资源 http:/ ... -
使用 JOLAP 实现复杂分析查询
2010-06-06 13:42 1963Shashank Tiwari 在本文中对 ... -
HTML5 Canvas for Internet Explorer
2010-06-04 21:16 1857Canvascape http://www.benjoff ... -
大型网站架构演变和知识体系
2010-06-01 23:47 1966架构演变第一步:物 ...
相关推荐
标题 "axis 开发webservice经典入门例子" 指向的是使用Apache Axis工具来创建和使用Web服务的基本教程。Apache Axis是开源的Java框架,它允许开发者轻松地在Java应用程序中构建和部署Web服务。本教程可能是为了帮助...
标题中的“axis开发webservice客户端”指的是使用Apache Axis框架创建并使用Web服务客户端的过程。Apache Axis是Java平台上的一个开源工具,它简化了SOAP(Simple Object Access Protocol)Web服务的开发,包括...
访问地址: http://127.0.0.1:8080/axis/services
本文将深入探讨如何利用Axis开发WebService,以及相关的技术要点。 首先,了解WebService的基础概念是至关重要的。WebService是一种基于开放标准(如XML、WSDL和SOAP)的互联网应用程序,它能够跨平台、跨语言地...
【标题】: 使用Eclipse和AXIS开发WebService的步骤详解 【描述】: 本文档详细介绍了如何利用Eclipse集成开发环境和AXIS框架来创建并发布WebService。 【标签】: Eclipse 【部分内容】: 在开发基于Java的...
### Axis开发WebService实例知识点解析 #### 一、Axis概述与安装配置 - **Apache Axis简介**:Apache Axis是Apache组织提供的一个开源项目,用于在Java环境中实现WebService技术规范。它支持SOAP协议,并提供了...
在使用Eclipse集成开发环境配合XDoclet和Axis开发WebService的背景下,本文将详细介绍相关的知识点和步骤。首先需要了解的是,WebService是一种可让应用程序通过网络(尤其是互联网)进行通信的接口和协议。它通常...
在本文中,我们将深入探讨如何使用SpringBoot框架开发基于Axis的Web服务。SpringBoot以其便捷的启动和配置方式,已经成为Java开发中的首选框架之一。而 Axis 是一个流行的Apache项目,用于创建和部署Web服务,它提供...
本篇文章将深入探讨如何使用Axis开发Web服务,并详细解释相关jar包的作用。 首先,让我们了解Web服务的基本概念。Web服务是一种通过互联网进行通信的应用程序,遵循W3C制定的SOAP(Simple Object Access Protocol)...
本文档主要介绍了如何使用Eclipse和AXIS框架开发和发布Web服务,以及进行客户端测试。以下是详细步骤和关键知识点: 1. **Eclipse插件安装**: - Eclipse提供了Web服务开发的插件,可以从官方网站下载WTP(Web ...
在本实例中,我们将深入探讨如何使用Axis开发一个简单的"Hello World" WebService。这个教程是基于网上流行的一个文档,但原文档存在四处错误,我已经进行修正并经过Eclipse IDE的调试验证,确保其正确无误。 首先...
本文将详细介绍如何利用Axis开发Web服务,并探讨其使用的jar包。 首先,我们要理解Axis的核心功能。Axis提供了一套完整的Java API,使得开发者能够方便地构建Web服务客户端和服务器端。它支持SOAP(简单对象访问...
Axis开发Web服务(Webservice)的搭建过程是一个系统性的步骤,涉及到服务器端的配置和客户端的调用。在本文中,我们将深入探讨如何使用Apache Axis框架来创建和部署Web服务。Apache Axis是一个开源工具,它允许...
AXIS 是一个流行的开源工具,用于开发和部署Web服务,特别是在Java环境中。本文将深入讲解如何利用AXIS 1.4版本创建和发布Web服务,重点在于定制发布,因为即时发布虽然简单,但在实际开发中可能无法满足复杂需求。 ...
\axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF\lib\*.jar 注意:这些包在我们下载下来的AXIS:axis-bin-1_4.zip中 3. 修改WEB.XML文件,最简单的方法是:直接把 \axis-bin-1_4\axis-1_4\webapps\axis\WEB-INF\web....
本篇文章将深入讲解使用Apache Axis开发Web服务的简单步骤,帮助你实现不同项目间的通信。 首先,理解Web服务的基本概念至关重要。Web服务是通过SOAP(Simple Object Access Protocol)消息在HTTP协议上进行通信的...
本篇文章将详细探讨使用Axis开发Web服务的过程及其重要性。 一、Axis简介 Axis是一个基于Java的SOAP(Simple Object Access Protocol)栈,它提供了从Java类到Web服务的自动绑定功能。通过Axis,开发者可以轻松地将...
本人写的用axis发布webserice程序,用ksoap2调用的实际例子,主要是演示了在手机上如何编写、调用webservice。从网上看到很多类似例子但大部分出错,经过摸索后,该例子能够正常运行,但没有考虑优化等。
本指南旨在为初学者提供AXIS框架下开发WebService的详细步骤,涵盖了从获取开发资源、生成 stub、编写服务器端代码到客户端测试的全过程。AXIS是一个开源的Java库,它提供了创建、部署和使用Web服务的工具,是基于...