Web Service
详细解析及使用方法
XFire篇
XFire简介
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和xifre的jar加入到工程所需要的类库引用中。创建一个简单但的java文件,这个文件只有一个名为add的成员方法。
提供服务实现类
package
net.ruixin.webservicedemo;
public
class
HelloWorldServiceImpl
implements
IHelloWorldService {
/**
*
返回名称的方法
*
@param
name
名称
*/
public
String sayHello(String name){
return
"
您好
,"
+name;
}
}
服务类的接口类
package
net.ruixin.webservicedemo;
public
interface
IHelloWorldService {
/**
*
返回名称的方法
*
@param
name
名称
*
@return
返回值
*/
public
String sayHello(String name);
}
配置services.xml
<
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
>
服务名
<
name
>
HelloWorldService
</
name
>
服务类
<
serviceClass
>
net.ruixin.webservicedemo.IHelloWorldService
</
serviceClass
>
服务接口
<
implementationClass
>
net.ruixin.webservicedemo.HelloWorldServiceImpl
</
implementationClass
>
服务范围
<
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;
public
class
HelloWorldClient {
public
static
void
main(String args[]) {
Service srvcModel =
new
ObjectServiceFactory()
.create(IHelloWorldService.
class
);
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
框架中,我们有两种方式将
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"
)
public
class
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
>
完整的开发过程
首先打开Eclipse
,创建一个普通的java
工程,将xfire
所需的jar
和xfire
的jar
加入到工程所需的类库引用中。
创建一个简单的java 文件,这个java 文件简单到只提供一个add 方法。
package com.kuaff.xfire.samples;
public class MathService {
public long add(int p1, int p2) {
return p1 + p2;
}
}
在src 目录下创建META-INF/xfire 目录,然后在META-INF/xfire 目录下创建services.xml 文件,文件内容为:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MathService</name>
<namespace>http://www.kuaff.com/xfire/samples/MathService</namespace>
<serviceClass>com.kuaff.xfire.samples.MathService</serviceClass>
</service>
</beans>
这个文档定义了你要发布的web 服务,这个定义了一个名为MathService 的服务,服务类为com.kuaff.xfire.samples.MathService 。
这样我们的一个简单的web 服务就开发完成了,下面就要把它发布出去。
将工程bin 目录下的所有的文件复制到第一节中配置的tomcat/webapps/xfire/WEB-INF/classes 文件夹下,启动tomcat ,你就可以检查这个web 服务是否发布成功了。
打开浏览器,在浏览器地址栏中输入http://localhost:8080/xfire/services/ ,正常情况下应该浏览器应该显示类似下图所示的页面。
注意:请在浏览器中输入http://localhost:8080/xfire/services/ 而不是http://localhost:8080/xfire/services ,虽然两者显示的页面相同,但是点击页面上的链接,后者的链接会出错,因为后者后面少加了一个“/” 。
点击[wsdl] 链接,可以查看这个web 服务的wsdl 文档。
如果在你的机器上的显示如上面所示,则说明你的这个web 服务发布成功,可以正常提供基于http 的web 服务。
下面一个问题就是如何开发一个Client ,来消费(使用)这个web 服务。
XFire 、Axis 、asp.net 以及其它的一些商业产品都提供了根据wsdl 文档创建客户端代码的工具。这里采用Xfire 提供的wsgen 工具来创建客户端的访问代码。
Wsgen 是xfire 提供的一个ant task ,task 的申明如下:
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="xfire 的jar 路径" />
这样,就可以在build.xml 文件中使用这个task :
<wsgen outputDirectory="client" wsdl="MathService.wsdl" package="com.kuaff.xfire.samples" />
outputDirectory 属性定义创建的代码所在的文件夹,wsdl 是web 服务的wsdl 文件,package 代表创建的代码的packege 。还可以通过binding 属性制定bind 类型:jaxb 或者是xmlbeans ,
这样,就会在client 文件夹下创建多个java 文件,这些文件提供了访问web 服务的方法。
在这里声明一点,创建的代码大量的使用了java 注释,这个JSE5 中提供的新特性,所以你需要使用JSE5 编译,Eclipse 也必须要3.1 以上的版本。
这段ant 脚本将创建三个文件:MathServicePortType 、MathServiceImpl 和MathServiceClient 。MathServicePortType 是这个web 服务的客户端接口存根、MathServiceImpl 实现了这个接口。MathServiceClient 封装了访问这个web 服务的方法。
最后,你可以创建一个单元测试类,用来测试这个客户端类。这个类的内容如下:
package com.kuaff.xfire.samples;
import junit.framework.TestCase;
public class MathServiceClientTest extends TestCase {
public void testAdd() {
MathServiceClient client = new MathServiceClient();
MathServicePortType ms = client.getMathServiceHttpPort();
long result = ms.add(10, 20);
assertEquals(result, 30);
}
}
创建一个简单的java 文件,这个java 文件简单到只提供一个add 方法。
package com.kuaff.xfire.samples;
public class MathService {
public long add(int p1, int p2) {
return p1 + p2;
}
}
在src 目录下创建META-INF/xfire 目录,然后在META-INF/xfire 目录下创建services.xml 文件,文件内容为:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MathService</name>
<namespace>http://www.kuaff.com/xfire/samples/MathService</namespace>
<serviceClass>com.kuaff.xfire.samples.MathService</serviceClass>
</service>
</beans>
这个文档定义了你要发布的web 服务,这个定义了一个名为MathService 的服务,服务类为com.kuaff.xfire.samples.MathService 。
这样我们的一个简单的web 服务就开发完成了,下面就要把它发布出去。
将工程bin 目录下的所有的文件复制到第一节中配置的tomcat/webapps/xfire/WEB-INF/classes 文件夹下,启动tomcat ,你就可以检查这个web 服务是否发布成功了。
打开浏览器,在浏览器地址栏中输入http://localhost:8080/xfire/services/ ,正常情况下应该浏览器应该显示类似下图所示的页面。
注意:请在浏览器中输入http://localhost:8080/xfire/services/ 而不是http://localhost:8080/xfire/services ,虽然两者显示的页面相同,但是点击页面上的链接,后者的链接会出错,因为后者后面少加了一个“/” 。
点击[wsdl] 链接,可以查看这个web 服务的wsdl 文档。
如果在你的机器上的显示如上面所示,则说明你的这个web 服务发布成功,可以正常提供基于http 的web 服务。
下面一个问题就是如何开发一个Client ,来消费(使用)这个web 服务。
XFire 、Axis 、asp.net 以及其它的一些商业产品都提供了根据wsdl 文档创建客户端代码的工具。这里采用Xfire 提供的wsgen 工具来创建客户端的访问代码。
Wsgen 是xfire 提供的一个ant task ,task 的申明如下:
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="xfire 的jar 路径" />
这样,就可以在build.xml 文件中使用这个task :
<wsgen outputDirectory="client" wsdl="MathService.wsdl" package="com.kuaff.xfire.samples" />
outputDirectory 属性定义创建的代码所在的文件夹,wsdl 是web 服务的wsdl 文件,package 代表创建的代码的packege 。还可以通过binding 属性制定bind 类型:jaxb 或者是xmlbeans ,
这样,就会在client 文件夹下创建多个java 文件,这些文件提供了访问web 服务的方法。
在这里声明一点,创建的代码大量的使用了java 注释,这个JSE5 中提供的新特性,所以你需要使用JSE5 编译,Eclipse 也必须要3.1 以上的版本。
这段ant 脚本将创建三个文件:MathServicePortType 、MathServiceImpl 和MathServiceClient 。MathServicePortType 是这个web 服务的客户端接口存根、MathServiceImpl 实现了这个接口。MathServiceClient 封装了访问这个web 服务的方法。
最后,你可以创建一个单元测试类,用来测试这个客户端类。这个类的内容如下:
package com.kuaff.xfire.samples;
import junit.framework.TestCase;
public class MathServiceClientTest extends TestCase {
public void testAdd() {
MathServiceClient client = new MathServiceClient();
MathServicePortType ms = client.getMathServiceHttpPort();
long result = ms.add(10, 20);
assertEquals(result, 30);
}
}
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包的工具
但是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的重要部分。
Axis简单使用
提供服务实现类
package
zpf;
public
class
SSOWebservice
{
/**
登陆并得到用户信息
*/
public
boolean
login(String loginid, String password) {
boolean
ret =
false
;
if
(loginid.equals(
"cx"
) && password.equals(
"cx"
))
ret =
true
;
else
ret =
false
;
return
ret;
}
}
配置web.xml
<?
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
>
配置server-config.wsdd
<?
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;
public
class
CallC
{
public
static
void
main(String [] args)
throws
Exception {
try
{
String endpoint =
"http://localhost:5200/axis_sample/services/SSOWebservice"
;
Integer i1 =
new
Integer(1);
Integer i2 =
new
Integer(2);
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
);
Boolean bv =
false
;
if
(call!=
null
) {
bv = (Boolean)call.invoke(
new
Object[] {user, password});
}
if
(bv) {
System.
out
.println(
"
用户登陆成功了
"
);
}
else
{
System.
out
.println(
"
用户登陆失败了
"
);
}
}
catch
(Exception e){
e.printStackTrace();
}
}
}
完整的开发过程
1. Axis开发包下载.
Apache的一个项目,请下载(略)
2. 编写方法
package zpf;
import java.util.*;
import java.io.*;
public class SSOWebservice
{
/**
登陆并得到用户信息
*/
Public boolean login(String loginid, String password){
boolean ret=false;
if(loginid.equals(“zpf”)&&password.equals(“123”))
ret= true;
else
ret=false;
return ret;
}
/**
得到所有部门信息
*/
public zpf.DepartmentInfo[] getAllDepts(){
zpf.Department dept=new zpf.Department();
zpf.DepartmentInfo[] ret=dept.getAllDepartment();
return ret;
}
}
http://localhost:8080/kmwhc/services/SSOWebservice
编译,通过,不在累述
3.
修改web.xml
加入如下代码
<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>
<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>
<!-- uncomment this if you want the admin servlet -->
<!-- currently the W3C havent settled on a media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
for now we go with the basic 'it's XML' response -->
<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>
4. 布署
(1)
WEB-INF下建立文件server-config.wsdd
(2)
文件内容如下:
蓝色部分定义了服务的名称,所用的类 方法.
红色部分定义了服务的方法所用的返回值的自定义类型.
<?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>
<operation name="getAllDepts" returnType="ns:ArrayOf_tns2_DepartmentInfo">
</operation>
<typeMapping
xmlns:ns="http://interf.kmwhc.zpf.com"
qname="ns:DepartmentInfo"
type="java:zpf.DepartmentInfo"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
/>
<typeMapping
xmlns:ns="urn:SSOWebservice"
qname="ns:ArrayOf_tns2_DepartmentInfo"
type="java:zpf.DepartmentInfo[]"
serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>
</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>
文件修改完毕后,重新启动你的应用服务器.
5. 测试
在IE里输入
http://localhost:8080/kmwhc/services/SSOWebservice
看到页面提示如下信息表示布署成功:
看到页面提示如下信息表示布署成功:
SSOWebservice
Hi there, this is an AXIS service!
Perhaps there will be a form for invoking the service here...
6. 编译生成客户端调用包
我用的ANT进行编译,在配置文件里加入如下代码
<!--登录服务-->
<java2wsdl output="${client.dir}/SSOWebservice.wsdl"
className="zpf.SSOWebservice"
namespace="urn:SSOWebservice"
location="http://localhost:8080/kmwhc/services/SSOWebservice">
<mapping namespace="urn:SSOWebservice"
package="zpf.client" />
</java2wsdl>
<wsdl2java url="${client.dir}/SSOWebservice.wsdl"
output="${client.dir}" deployscope="session" serverSide="yes"
skeletonDeploy="no" noimports="no" verbose="no" testcase="no">
<mapping namespace="urn:SSOWebservice"
package="zpf.client" />
</wsdl2java>
编译,生成wsdl文件和客户端代码.
7调用
调用代码:
zpf.client.SSOWebserviceServiceLocator sv=new zpf.client. SSOWebserviceServiceLocator();
zpf.client.SSOWebservice ssp=sv.getWebCaseservice(new java.net.URL("http://localhost:8080/kmwhc/services/SSOWebservice"));
boolean aa=ssp.login(“admin”,”123”);
XFire和Axis的比较
XFire和Axis开发上的比较
XFire的优点
XFire方便(
简化
Web
服务开发),开发速度快,易于上手,配置简洁,可以和Spring很好的结合。
● 本地数据绑定功能。支持普通Java对象(POJO)、XMLBeans、面向XML绑定的Java架构(JAXB)和Castor等。数据绑定指定了发送至Web服务的XML请求以及返回的XML响应如何映射成Java对象。
● 使用用于XML的流式API(StAX)处理XML文档。与文档对象模型(DOM)的基于树形的方法以及用于XML的简单API(SAX)的事件驱动方法相比,StAX使用了基于拉取的机制,这不但大大加快了速度,还提高了内存的使用效率。
● 支持各种传输协议,譬如HTTP、Java消息服务(JMS)和Java虚拟机内部传输(in-JVM transport)。
● 嵌入功能,这是XFire的主要优点之一。可以把这个SOAP引擎嵌入到应用当中,完全隐藏XFire特定的所有引用,因为所有配置都是程序驱动的。
● 具有丰富的API,这样一来,非常容易定制,让开发人员可以在需要时,在不同阶段截获请求,并且进行处理。
● 符合诸多最新标准,譬如SOAP 1.1(没有编码的远程过程调用即RPC)和1.2、WSDL 1.1、Web服务互操作性组织的Basic Profile 1.0、Web服务寻址规范和Web服务安全标准。
● 性能和局限
Web服务使用许多资源,但它们的性能并不高。XFire打破了这个传统。与同类的SOAP引擎相比,XFire使用的内存大大减少(一方面是由于使用StAX),而性能却大大提高。
另外,XFire还提供了进一步优化性能的几种方法。方法之一就是使用Java虚拟机内部传输。如果知道Web服务与客户程序在同一个Java虚拟机里面运行,就可以选择使用本地传输,这样可以高速传输服务。
XFire的缺点
● 开发Web服务的一个好的做法就是,从WSDL开始着手。大多数SOAP引擎提供了利用WSDL创建服务占位模块的工具。XFire也提供了这样一个工具。但它需要使用注解,因而需要J2SE 5.0。这对仍坚持使用J2SE 1.4.X的人来说并不受欢迎,因为他们用其他方法来编写客户程序,本文给出的示例就表明了一种方法。
● 缺少支持附件的功能,不过将来的版本一定能支持该功能。
● 缺少简单易懂的用户指南,XFire开发队伍在这方面有许多工作要做。