Web Service详细解析及使用方法
XFire篇
XFire简介
它拥有一个轻量级的信息处理模块,通过STAX来与SOAP信息相结合。提供了一个工作在web services下的简单API,支持POJO和schema开发。XFire是 CodeHaus 推出的下一代的 Java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
XFire特性
1)、 支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
2)、 高性能的SOAP栈设计
3)、可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2及castor
4)、 jsr181规范
5)、支持多种传输协议:HTTP、JMS、XMPP、In-JVM
6)、可嵌入式的API
7)、 JBI支持
8)、客户端和服务器端的存根创建工具
9)、 JAX-WS的早期支持
XFire使用
首先打开IDE,创建一个普通的Java工程,将XFire所需要的jar加入到工程的类库引用中。创建一个简单的Java文件,这个文件只有一个名为sayHello的成员方法。
//包名
package net.ruixin.webservicedemo;
/**
*服务实现类的实现
*@authorcaoxiang
*/
publicclass HelloWorldServiceImpl implements IHelloWorldService {
/**
*返回名称的方法
*@paramname名称
*/
public String sayHello(String name){
return"您好,"+name;
}
}
//包名
package net.ruixin.webservicedemo;
/**
*服务接口类的创建
*@authorcaoxiang
*/
publicinterface IHelloWorldService {
/**
*返回名称的方法
*@paramname名称
*@return返回值
*/
public String sayHello(String name);
}
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.ruixin.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<scope>application</scope>
</service>
</beans>
标签说明:
WebService的服务名
<name>HelloWorldService</name>
WebService的服务接口类<serviceClass>net.ruixin.webservicedemo.IHelloWorldService
</serviceClass>
WebService的服务接口实现类<implementationClass>net.ruixin.webservicedemo.HelloWorldServiceImpl</implementationClass>
WebService的服务有效范围
<scope>application</scope>
//包名
package net.ruixin.webservicedemo;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
/**
*测试服务类的创建
*@authorcaoxiang
*/
publicclass HelloWorldClient {
/**
*测试主程序
*@paramargs
*@throwsException
*/
publicstaticvoid main(String args[]) {
//通过接口类创建Service对象
Service srvcModel = new ObjectServiceFactory()
.create(IHelloWorldService.class);
//通过XFire的工厂类创建工厂对象
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
//访问的地址
String helloWorldURL="http://localhost:5200/xfire_sample/services/HelloWorldService";
//异常处理
try {
//创建服务对象
IHelloWorldService srvc = (IHelloWorldService) factory.create(srvcModel, helloWorldURL);
//调用服务中的方法,并显示其结果
System.out.print(srvc.sayHello("dennis"));
//异常处理
} catch (MalformedURLException e) {
//显示错误信息
e.printStackTrace();
}
}
}
XFire、Axis以及其他的一些商业产品都提供了wsdl文档创建客户端代码的工具。这里采用XFire提供的wsgen工具来创建客户端的访问代码。
Wsgen是XFire提供的一个ant task,task的申明如下:
<targetname="Wsgen">
<taskdefname="wsgen"classname="org.codehaus.xfire.gen.WsGenTask"classpathref="build.classpath"/>
<wsgenoutputDirectory="build.classpath"wsdl="http://localhost:portno/xfire_sample/services/HelloWorldService?wsdl"package="client"/>
</target>
outputDirectory属性定义了创建代码的存放路径,wsdl是web服务的wsdl文件,package代表创建的代码的package。还可以通过binding属性指定bind类型,jaxb或者是xmlbeans。
这样就会在outputDirectory属性指定的目录下创建多个Java文件,这些文件提供了访问web服务的方法。
XFire框架中,我们有两种方式将 POJO 发布成 Web 服务:
方式1:直接使用 Web 服务接口和 Web 服务实现类(POJO)来发布
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWorldService</name>
<serviceClass>
net.rubyeye.webservicedemo.IHelloWorldService
</serviceClass>
<implementationClass>
net.rubyeye.webservicedemo.HelloWorldServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
方式2:基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
package com.test;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name="Hello",serviceName="Hello",
targetNamespace="http://www.oksonic.cn/xfire")
publicclass Hello {
@WebMethod
@WebResult
public String getName(@WebParam String name){
return"Hello world " + name;
}
}
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<serviceClass>com.test.Hello</serviceClass>
<serviceFactory>jsr181</serviceFactory>
</service>
</beans>
Axis篇
Axis简介
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从
http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
1)、 一个独立运行的SOAP服务器
2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
3)、对WSDL的扩展支持
4)、一个将WSDL的描述生成JAVA类的工具
5)、一些示例代码
6)、还有一个监控TCP/IP包的工具
SOAP
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
//包名
package zpf;
/**
*服务实现类的实现
*@authorcaoxiang
*/
publicclass SSOWebservice
{
/**
登陆并得到用户信息
*/
publicboolean login(String loginid, String password) {
//判断用户是否登陆成功的标记
boolean ret = false;
if (loginid.equals("caoxiang") && password.equals("caoxiang "))
ret = true;
else
ret = false;
//返回
return ret;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-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>
<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>
<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>
</web-app>
<?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="enableNamespacePrefixOptimization"
value="true" />
<parameter name="attachments.Directory" value="D:\jakarta-tomcat-5.0.28\webapps\axis\WEB-INF\attachments" />
<parameter name="disablePrettyXML" value="true" />
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<!-- 自定义服务开始 -->
<!-- 单点登陆服务 add by Zhang.P.F -->
<service name="SSOWebservice" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="zpf.SSOWebservice" />
<operation name="login" returnType="ns:boolean">
<parameter name="loginid" type="ns:String" />
<parameter name="password" type="ns:String" />
</operation>
</service>
<!-- 自定义服务结束 -->
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService" />
<parameter name="enableRemoteAdmin" value="false" />
<parameter name="className" value="org.apache.axis.utils.Admin" />
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion" />
<parameter name="className" value="org.apache.axis.Version" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
<parameter name="qs.list"
value="org.apache.axis.transport.http.QSListHandler" />
<parameter name="qs.method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler" />
<parameter name="qs.wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" />
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
</deployment>
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;
/**
*客户端登陆类的实现
*@authorcaoxiang
*/
publicclass CallC
{
/**
*测试主程序
*@paramargs
*@throwsException
*/
publicstaticvoid main(String [] args) throws Exception {
try{
//服务路径
String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice";
//用户名
String user= new String("1");
//密码
String password=new String("2");
//服务对象
Service service = new Service();
//调用服务的对象
Call call = (Call) service.createCall();
//设置目标服务
call.setTargetEndpointAddress(new java.net.URL(endpoint));
//设置调用的方法
call.setOperationName("login");
//设置参数
call.addParameter("loginid", XMLType.XSD_STRING, ParameterMode.IN);
//设置参数
call.addParameter("password", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_BOOLEAN);
//用于判断用户是否登陆的成功的标记