`

java开发webservice的几种方式

阅读更多
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。

1.Axis2

Axis是apache下一个开源的webservice开发组件,出现的算是比较早了,也比较成熟。这里主要介绍Axis+eclipse开发webservice,当然不用eclipse也可以开发和发布webservice,只是用eclipse会比较方便。



(1)下载eclipse的Java EE版本

http://www.eclipse.org/downloads/



(2)下载axis2

http://axis.apache.org/axis2/java/core/download.cgi



(3)下载eclipse的axis2插件

Axis2_Codegen_Wizard

Axis2_Service_Archiver

http://axis.apache.org/axis2/java/core/tools/index.html

推荐使用1.3的版本



(4)eclipse安装axis2插件

1)在任意目录下新建一个Axis2文件夹,在该文件夹下新建eclipse目录,在eclipse目录中新建plugins目录和features目录,例如:D:\programSoftware\eclipse-SVN\Axis2\eclipse;

2)把下载的axis2插件解压,并把解压的文件放到新建的eclipse的plugins目录下;

3)在%eclipse_home%的目录下新建links目录,并在links目录下新建axis2.link文件,内容为:path=D:\programSoftware\eclipse-SVN\Axis2;

4)重启eclipse,点击·file-new-other,如果看到Axis2 Wizards,则表明插件安装成功。



(5)安装axis2

下载Axis2的WAR Distribution并解压,把axis2.war包放置到%TOMCAT_HOME%/webapps下,启动tomcat,访问http://localhost:port/axis2,Axis2安装成功。



(6)使用eclipse新建web工程,创建一个普通java类,至少包含一个方法。



(7)发布webservice

1)点击eclipse的File-New-other,打开Axis2 Wizards,选择Axis2 Service Archiver,然后Next;

2)选择Class File Location,也就是类文件存放路径,注意:只选到classes目录,不要包括包文件夹,然后Next;

3)选择Skip WSDL,然后Next

4)一路Next到Select the Service XML file to be included in the Service archive,勾选Generate theservice xml automatically;

5)Service Name-填写你的service名称,Class Name-填写类名称,要包括包名,然后点击load,然后点击Finish,这时webservice就发布成功了;

6)然后到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services 看看是否多了一个.aar的文件;

7)访问http://localhost:8085/axis2/services/类名?wsdl 就可看到生成的wsdl文件了。

注意:以上的方式是发布到axis2.war包中,你也可以把生成.aar文件copy到你的实际应用中,同时,你也可以使用eclipse的create webservice功能发布你的webservice,选择axis2生成你的webservice,这样webservice就会部署到你的应用中了。



2.Apche CXF

CXF开发webservice也是比较方便和简单的,它和spring的集成可以说是非常地好。举一个CXF开发webservice的例子吧。

1)在eclipse中新建一个web工程,导入依赖包,如图:



2)编写一个接口,如:

public String test(@WebParam(name="value", targetNamespace = "http://service.cxf.zcl.com/", mode = WebParam.Mode.IN)String value);

注意:CXF开发的webservice,接口中的方法的参数一定要以这种方式,否则客户端调用的时候CXF服务端会接收不到参数的值,name:参数名称,可不写(建议写上),targetNamespace:命名空间,一定要填写上,默认是包名反过来的顺序,mode:参数类型,IN表示输入。

3)编写一个实现类,实现接口的方法;

4)和spring的集成,编写一个bean文件,如:cxf-beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>   
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:jaxws="http://cxf.apache.org/jaxws"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">   
  
    <import resource="classpath:META-INF/cxf/cxf.xml" />   
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />   
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />   
       
    <jaxws:endpoint id="vote" implementor="com.zcl.cxf.service.VoteImpl" address="/Vote" />   
</beans>  

这个文件比较容易理解,就不解释了。

5)配置CXFServlet

在web.xml文件中配置CXFServlet,加载cxf-beans.xml文件,内容如下:
01.<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
02.    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
03.    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
04.    id="WebApp_ID" version="2.5">   
05.  
06.    <context-param>   
07.        <param-name>contextConfigLocation</param-name>   
08.        <param-value>WEB-INF/cxf-beans.xml</param-value>   
09.    </context-param>   
10.       
11.    <listener>   
12.        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
13.    </listener>   
14.       
15.    <servlet>   
16.        <servlet-name>cxf</servlet-name>   
17.        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>   
18.        <load-on-startup>1</load-on-startup>   
19.    </servlet>   
20.    <servlet-mapping>   
21.        <servlet-name>cxf</servlet-name>   
22.        <url-pattern>/services/*</url-pattern>   
23.    </servlet-mapping>   
24.</web-app>  

把工程部署到中间件,如tomcat,就可以访问该webservice了。



3.JDK开发webservice

1)编写一个Java类,如下:
01.package demo;   
02.  
03.import javax.jws.WebParam;   
04.import javax.jws.WebService;   
05.import javax.xml.ws.Endpoint;   
06.  
07.@WebService   
08.public class JdkWebService {   
09.  
10.    public String doSomething(@WebParam(name="value", targetNamespace = "http://demo/", mode = WebParam.Mode.IN)String value) {   
11.        return "Just do it," + value + "!";   
12.    }   
13.       
14.    public static void main(String[] args) {   
15.        Endpoint.publish("http://localhost:8080/jdkwsdemo/demo.JdkWebService", new JdkWebService());   
16.    }   
17.}  

2)运行该java类,在浏览器上就可以访问该webservice了。

注意:开发web工程的时候,这种方法不太友好。我们可以编写一个servlet类,在servlet类的初始化方法中发布webservice,这样我们的中间件服务器启动的时候就会帮我们自动webservice了。



4)  xfire

开发WebService的框架不少,每个框架都有各自的有点,最近我用xfire练习开发WebService,下面是开发WebService的小例子,希望对入门的人有些小帮助
1.新建一个java web project命名为TestWebService,将xfire相关的jar包添加到lib目录中,写接口类和实现类
01.package com.lamp.service;   
02.  
03.public interface MessageService {   
04.    public String getName(String name);   
05.}  

01.package com.lamp.service;  
02.  
03.public interface MessageService {  
04.    public String getName(String name);  
05.}  

实现类
01.package com.lamp.service.impl;   
02.  
03.import com.lamp.service.MessageService;   
04.  
05.public class MessageServiceImpl implements MessageService {   
06.  
07.    public String getName(String name) {   
08.        return "hellow " + name + ", welcome to WebService world";   
09.    }   
10.  
11.}  
[java] view plaincopyprint?
01.package com.lamp.service.impl;  
02.  
03.import com.lamp.service.MessageService;  
04.  
05.public class MessageServiceImpl implements MessageService {  
06.  
07.    public String getName(String name) {  
08.        return "hellow " + name + ", welcome to WebService world";  
09.    }  
10.  
11.}  

在src目录下新建文件夹META-INF,然后再在其下新建文件夹xfire,在xfire目录下新建配置文件services.xml
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<beans xmlns="http://xfire.codehaus.org/config/1.0">  
03.  <service>  
04.    <name>MessageService</name>  
05.    <serviceClass>com.lamp.service.MessageService</serviceClass>  
06.    <implementationClass>com.lamp.service.impl.MessageServiceImpl</implementationClass>  
07.  </service>  
08.</beans>  
[xml] view plaincopyprint?
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<beans xmlns="http://xfire.codehaus.org/config/1.0">  
03.  <service>  
04.    <name>MessageService</name>  
05.    <serviceClass>com.lamp.service.MessageService</serviceClass>  
06.    <implementationClass>com.lamp.service.impl.MessageServiceImpl</implementationClass>  
07.  </service>  
08.</beans>  

最后在web.xml中配置xfire的servlet
01.<servlet>  
02.        <servlet-name>XFireServlet</servlet-name>  
03.        <servlet-class>  
04.            org.codehaus.xfire.transport.http.XFireConfigurableServlet   
05.        </servlet-class>  
06.    </servlet>  
07.  
08.    <servlet-mapping>  
09.        <servlet-name>XFireServlet</servlet-name>  
10.        <url-pattern>/servlet/XFireServlet/*</url-pattern>  
11.    </servlet-mapping>  
12.  
13.    <servlet-mapping>  
14.        <servlet-name>XFireServlet</servlet-name>  
15.        <url-pattern>/services/*</url-pattern>  
16.    </servlet-mapping>  
[xml] view plaincopyprint?
01.<servlet>  
02.        <servlet-name>XFireServlet</servlet-name>  
03.        <servlet-class>  
04.            org.codehaus.xfire.transport.http.XFireConfigurableServlet  
05.        </servlet-class>  
06.    </servlet>  
07.  
08.    <servlet-mapping>  
09.        <servlet-name>XFireServlet</servlet-name>  
10.        <url-pattern>/servlet/XFireServlet/*</url-pattern>  
11.    </servlet-mapping>  
12.  
13.    <servlet-mapping>  
14.        <servlet-name>XFireServlet</servlet-name>  
15.        <url-pattern>/services/*</url-pattern>  
16.    </servlet-mapping>  

项目部署后在浏览器中通过http://localhost:8080/TestWebService/services访问看到远程访问的接口,并得到wsdl为http://localhost:8080/TestWebService/services/MessageService?wsdl

这样服务器端开发完毕,现在开始客户端的开发
新建一个java project也将xfire相关的jar引入,我用ant在客户端生成代理对象,在项目路径下新建build.xml,代码为
01.<?xml version="1.0" encoding="UTF-8"?>  
02.  
03.<project name="WebService" basedir="." default="gen-webservice">  
04.  
05.    <property file="build.properties">  
06.    </property>  
07.  
08.    <path id="project-classpath">  
09.        <fileset dir="${lib.dir}">  
10.            <include name="**/*.jar" />    
11.        </fileset>  
12.    </path>  
13.  
14.    <target name="gen-webservice">  
15.        <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="project-classpath" />  
16.  
17.        <wsgen outputDirectory="${src.dir}"  
18.          wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>  
19.           
20.    </target>  
21.  
22.</project>  
[xml] view plaincopyprint?
01.<?xml version="1.0" encoding="UTF-8"?>  
02.  
03.<project name="WebService" basedir="." default="gen-webservice">  
04.  
05.    <property file="build.properties">  
06.    </property>  
07.  
08.    <path id="project-classpath">  
09.        <fileset dir="${lib.dir}">  
10.            <include name="**/*.jar" />   
11.        </fileset>  
12.    </path>  
13.  
14.    <target name="gen-webservice">  
15.        <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="project-classpath" />  
16.  
17.        <wsgen outputDirectory="${src.dir}"  
18.          wsdl="${wsdl.dir}" package="com.lamp.ws.client" overwrite="true"/>  
19.          
20.    </target>  
21.  
22.</project>  

其引入的build.properties文件也在项目路径下
src.dir=${basedir}/src
lib.dir=F:/WebService/xfire-1.2.6/lib
wsdl.dir=http://localhost:8080/TestWebService/services/MessageService?wsdl
其中lib.jar为我存放xfire的路径,运行ant得到代理对象
编写一个测试类
01.package com.lamp.test;   
02.  
03.import com.lamp.ws.client.MessageServiceClient;   
04.import com.lamp.ws.client.MessageServicePortType;   
05.  
06.public class TestGetName {   
07.  
08.    public static void main(String[] args) {   
09.        MessageServiceClient msg = new MessageServiceClient();   
10.        MessageServicePortType portType = msg.getMessageServiceHttpPort();   
11.        String result = portType.getName("张三");   
12.        System.out.println(result);   
13.    }   
14.  
15.}  
[java] view plaincopyprint?
01.package com.lamp.test;  
02.  
03.import com.lamp.ws.client.MessageServiceClient;  
04.import com.lamp.ws.client.MessageServicePortType;  
05.  
06.public class TestGetName {  
07.  
08.    public static void main(String[] args) {  
09.        MessageServiceClient msg = new MessageServiceClient();  
10.        MessageServicePortType portType = msg.getMessageServiceHttpPort();  
11.        String result = portType.getName("张三");  
12.        System.out.println(result);  
13.    }  
14.  
15.}  

运行在控制台看到了hellow 张三, welcome to WebService world至此一个简单的WebService开发完毕
XFire是与Axis2 并列的新一代WebService平台。之所以并称为新一代,因为它:
1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;
2、使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;
3、容易上手,可以方便快速地从pojo发布服务;
4、Spring的结合;
5、灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor。

XFire与Axis1性能的比较
1、XFire比Axis1.3快2-6倍
2、XFire的响应时间是Axis1.3的1/2到1/5

XFire与Axis2的比较
虽然XFire与Axis2都是新一代的WebService平台,但是Axis2的开发者太急于推出1.0版本,所以1.0还不

是一个稳定的版本,它的开发者宣称1.1版本即将推出,希望1.1版本会是个稳定的版本。在XFire捐献给

apache后有人认为Axis2将会灭亡。其实在很多人眼里,Axis2并不是pojo形式,Dan Diephouse证明了

XFire比Axis更有市场,我也发现了有很多人开始从Axis转向XFire,包括我也在说服身边的人转向利用

XFire进行WebService的开发,很典型的是我可以在几分钟之内教会我的团队实用XFire来发布一个他自己

的Web服务。

本人倾向于XFire确实比Axis2简单很多

AXIS VS CXF

在SOA领域,我们认为Web Service是SOA体系的构建单元(building block)。对于服务开发人员来说,

AXIS和CXF一定都不会陌生。这两个产品都是Apache孵化器下面的Web Service开源开发工具。 Axis2的最

新版本是1.3.CXF现在已经到了2.0版本。

这两个框架 都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和

Celtix项目的结合产品。Axis2是从底层全部重新实现,使用了新的扩展性更好模块架构。 CXF也重新的

深化了XFire和Celtix这两个开发工具。

新产品的退出导致了几个问题。是不是现有的使用Axis 1.x,XFire和Celix的应用需要迁移的新的版本上

。如果一个开发人员确定要迁移它的应用到新的框架上,那么他应该选择哪一个呢?相反的,如果一个开

发者决定从头开发一个新的Web Service,他应该使用哪个呢? 这两个框架哪一个更好一些呢?

对于系统迁移来说,也许迁移到新的框架并不难。Axis和CXF都提供了迁移的指导。能够给开发者一些迁

移的技巧和经验。但是对于这样迁移,这两个开源项目都没有提供迁移的工具。对于这样的迁移工作,尽

管很值得去寻找所有的可行方案。Axis2和CXF都有各自不同的WebService开发方法,每个方法都有相当数

量拥护者。

通过一个比较矩阵来比较Axis2和CXF变得有现实的意义。这两个项目都开发不够成熟,但是最主要的区别

在以下几个方面:

1.CXF支持 WS-Addressing,WS-Policy, WS-RM, WS-Security和WS-I Basic Profile。Axis2不支持WS

-Policy,但是承诺在下面的版本支持。

2. CXF可以很好支持Spring。Axis2不能

3. AXIS2支持更广泛的数据并对,如XMLBeans,JiBX,JaxMe和JaxBRI和它自定义的数据绑定ADB。注意

JaxME和JaxBRI都还是试验性的。CXF只支持JAXB和Aegis。在CXF2.1

4. Axis2支持多语言-除了Java,他还支持C/C++版本。

比较这两个框架的Web Service开发方法与比较它们的特性同样重要。 从开发者的角度,两个框架的特性

相当的不同。 Axis2的开发方式类似一个小型的应用服务器,Axis2的开发包要以WAR的形式部署到

Servlet容器中,比如Tomcat,通过这些容器可以对工作中的Web Service进行很好的监控和管理。Axis2

的Web administrion模块可以让我们动态的配置Axis2.一个新的服务可以上载,激活,使之失效,修改

web服务的参数。管理UI也可以管理一个或者多个处于运行状态的服务。这种界面化管理方式的一个弊端

是所有在运行时修改的参数没有办法保存,因为在重启动之后,你所做的修改就会全部失效。

Axis2允许自己作为独立的应用来发布Web Service,并提供了大量的功能和一个很好的模型,这个模型可

以通过它本身的架构(modular architecture)不断添加新的功能。有些开发人员认为这种方式对于他们

的需求太过于繁琐。这些开发人员会更喜欢CXF。

CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。大多数配置都可以API来完成

,替代了比较繁琐的XML配置文件, Spring的集成性经常的被提及,CXF支持Spring2.0和CXF's API和

Spring的配置文件可以非常好的对应。CXF强调代码优先的设计方式(code-first design),使用了简单

的API使得从现有的应用开发服务变得方便。

不过你选择Axis2还是CXF,你都可以从开源社区得到大量的帮助。这两个框架都有商业公司提供服务,

WSO2提供AXIS2的支持,Iona提供CXF的支持。这两公司都有很活跃的开发者社区。 Axis2出现的时间较早

,CXF的追赶速度快。我的建议是:如果你需要多语言的支持,你应该选择AXIS2。如果你需要把你的实现

侧重JAVA并希望和Spring集成,CXF就是更好的选择,特别是把你的Web Service嵌入其他的程序中。如果

你觉得这两个框架的新特性对于你并没有太大的用处,你会觉得Axis1也是不错的选择,你应该继续使用

它知道你有充分的理由去更换它。



如何抉择:
1、如果应用程序需要多语言的支持,Axis2 应当是首选了;
2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web

Services 来说;
3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如 Axis1,XFire,Celtrix

或 BEA 等等厂家自己的 Web Services 实现,就别劳民伤财了。
分享到:
评论

相关推荐

    详解java开发webservice的几种方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,有兴趣的可以了解一下。

    webservice 开发指南

    此文档详细讲解了java中webservice的几种实现方式,分别为XFire,Axis,CXF,其中最常用的为XFire,对于初学者来说是不错的选择(比较系统全面)!

    webservice(XFire)实例

    webservice(XFire)实例: 最近在研究JAVA开发Webservice,发现网络上比较流行的几种选择AXIS、XFire、,前几天看了几篇关于这三种选择的比较的文章,对它们已经有了些概念。决定自己实践一个例子!

    CXF创建webservice服务端.doc

    CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。 3. 容易 使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 ...

    Java面试宝典-经典

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试宝典2010版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    java面试题大全(2012版)

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    最新Java面试宝典pdf版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试笔试资料大全

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    java面试宝典2012

    解析XML文档有哪几种方式? 127 七. 流行的框架与新技术 128 1、谈谈你对Struts的理解。 128 2、谈谈你对Hibernate的理解。 128 3、AOP的作用。 129 4、你对Spring的理解。 129 5、谈谈Struts中的Action servlet。 ...

    JAVA面试宝典2010

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试宝典2012新版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action servlet。 ...

    Java面试宝典2012版

    解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 3、AOP的作用。 118 4、你对Spring的理解。 118 5、谈谈Struts中的Action ...

    涵盖了90%以上的面试题

    数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 java socket java序列化 JVM加载class文件的原理 双亲委派模型 为什么要...

    J2EE学习笔记

    6.9:几种常用协议 192 7.0:SOA原理 200 8:搜索引擎专题 205 9:CMS(内容发布管理系统)专题 206 10:OA引擎专题 207 11:AJAX专题 207 第七章:JSP和SERVLETS 207 7.1:Jsp 207 7.2:Servlet 212 第八章:J2EE开发框架...

    Java 面试宝典

    Java 基础部分..................................................................................................................... 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么...

Global site tag (gtag.js) - Google Analytics