当前流行的几种开发webservice平台使用方法,性能对比及开发要点
?最近在做一些关于webservice的项目,项目做完之后对当前流行的几种webservice的开发平台做了学习,比较,以下是各个平台开发实例,供大家参考,其中也含有我个人在开发过程中的一些感受和观点,纯属抛砖引玉,如有不对请指出,废话不多说直接进入正题。
目前比较流行的开发webservice的平台很多,主流的有如axis1.X,axis2.X,xfire,CXF等等,其中axis1.X属于第一代的webservice开发平台,axis2.X,xfire,CXF都属于第二代,在在第一代axis1.X中,axis1.4是最成熟最稳定的一个版本。axis2.X是Apache组织新出一个版本,与其说是axis1.X的升级版,到不如说是一个独立的版本,他完全颠覆了axis1.X的开发模式,xfire无论是效率和方便性都远高于axis1,但xfire的文档不如axis1全,但现在官网已经停止更新了,CXF是Apache组织把Celtix 和 XFire整合之后的新出一种,全称Apache CXF。(具体的可以去网上查询,这边只是对他们的实际应用做比较)
开发方式:
axis1.4有2种开发方式
首先,建立一个web工程,登陆Apache官网,下载axis1.4,从axis1.4中把开发所需要的jar包,并拷贝到web工程的lib包下,把以下内容拷贝添加到web.xml中。
<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>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</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>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<session-config>
<!-- Default to 5 minute session timeouts -->
<session-timeout>5</session-timeout>
</session-config>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<!-- webService end-->
<welcome-file-list id="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>
服务器端编写
一、即时发布jws(Java web service)
1、写一个java类,去掉其包名(如:package com.test.servcie),然后把Java类的后缀改为.jws,拷贝到上面所建项目的web-inf下,
2、启动服务器(任何能发布web工程的服务器都可以),访问http://localhost:8080/项目名/xxx.jws即可访问。此方法简单,但是不适合大项目和带包名的服务。不推荐使用,了解就行。
二 定制发布WSDD (这个是最常用的方式)
1、在上面所建的web工程的src目录下写一个接口类 HelloService和实现类HelloServiceIMpl
package com.zsh.service;
public interface HelloService {
public String getName(String name);
}
package com.zsh.service;
public class HelloServiceImpl implements HelloService{
public String getName(String name){
return "hello:"+name;
}
}
2、如果你有现成的server-config.wsdd文件的话最好,只需要在其中添加这么一段
<service name="HelloService " provider="java:RPC" style="wrapped" use="literal" xmlns:ns="http://www.linkage.com">
<parameter name="className" value="com.zsh.service.HelloServiceImpl "/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="Request"/>
</service>
将其拷贝到web-inf目录下,启动服务器(任何能发布web工程的服务器都可以),
访问http://localhost:8080/项目名/services/HelloService?wsdl
?
没有server-config.wsdd的话在web-inf 下新建一个deploy.wsdd文件把下面内容的拷贝进去
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="HelloService " provider="java:RPC">
<parameter name="className" value="com.zsh.service.HelloServiceImpl " />
<parameter name="allowedMethods" value="*" />
<parameter name="scope" value="request"></parameter>
</service>
</deployment>
再在web-info目录下建一个deploy.bat文件的批处理文件
把下面的拷贝进去
set Java_Cmd=java -Djava.ext.dirs=lib
set Axis_Servlet=http://localhost:8080/项目名/servlet/AxisServlet
%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd
pause
双击执行,就会再旁边生成server-config.wsdd文件。
重启服务 访问访问http://localhost:8080/项目名/services/HelloService?wsdl(具体根据你们自己的web根路径)
这样服务器端就发布好,下面写客户端访问
客户端调用有三种方式
1、知道wsdl文档后,用命令生成
在web-inf目录下新建WSDL2Java.bat批处理文件
set Java_Cmd=java -Djava.ext.dirs=lib
set Output_Path=G:\workspace\webServiceDemo4\src
set Package=com.zsh.client
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://localhost:8080/项目名/services/HelloService?wsdl
就会在G:\workspace\webServiceDemo4\src目录下自动生成客户端代码,优点比较自动化,缺点废代码太多了,不简洁。
2、自己手动写客户端,用动态调用方式(这个是最常用的方法)
package com.linkage.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.rpc.ServiceException;
import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class WebClient {
private static String endPointUrl = "http://127.0.0.1:8080/项目名/services/HelloService ";
public static String getName(String request){
String response = null ;
Call call = null;
try {
call = (Call) new Service().createCall();
call.setTargetEndpointAddress(new URL(endPointUrl));
response = (String)call.invoke("getName", {request});
} catch (ServiceException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AxisFault e) {
e.printStackTrace();
} return response;
}
public static void main(String[] args) {
String request = "zhangsh";
System.out.println(getName(request));
}
}
3使用动态代理
这个方法需要在客户端新建一个服务的接口,如上面的HelloService 接口,具体的写法网上例子很多,在这就不多说了。