3. 应用 AXIS 开发 Web Service
3.1. AXIS项目
Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group )的开放源代码实现。有很多流行的开发工具都使用AXIS作为其 实现支持Web服务的功能,例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1,可以从 http: //ws.apache.org/axis/index.html下载。
下图是AXIS核心引擎的体系结构图:
图1
整个AXIS项目包括以下几个部分:
消息流子系统
消息流子系统提供了灵活的消息传递框架,这个消息传递框架包括处理程序、链、序列化程序和反序列化程序。处理程序是一个处理请求、响应和故障流的对象。处理程序可被组合在一起成为链,而且可以使用一个灵活的部署描述符来配置这些处理程序的顺序。
传输框架子系统
提供了一个传输框架,这个传输框架可以帮助您创建自己的可插式传输发送器和传输侦听器。
数据编码子系统
AXIS完全按照 XML Schema 规范提供各种数据类型的自动序列化,并且提供功能扩展接口来使用您自己定制的序列化器和反序列化器。
其他
AXIS完全支持 WSDL 以及日志记录、出错以及故障处理机制。它同时提供一些工具用来讲WSDL文档转换成客户端的调用框架以及根据类来产生WSDL定义文档。
AXIS目前版本支持的标准是:W3C SOAP 1.1 和 1.2;WSDL 1.1;SAAJ 1.1(SUN公司: SOAP with Attachments API for Java);JAX-RPC(SUN公司:Java API for XML- Based RPC)1.0。
3.2. 环境搭建
由于AXIS本身是基于JAVA语言开发的项目,并且是以Web应用形式发布的,因此它运行时需要一个应用服务器作为支撑。为了方便我们这里选用的是 Tomcat。由于AXIS本身需要用到处理XML信息的包,所以我们建议使用JDK1.4并安装Tomcat 4.1.24。下面是环境搭建步骤,读取 根据自身情况进行安装。
安装JDK1.4.1
安装Tomcat 4.1.24到C:/Tomcat并验证安装是否成功
下载AXIS项目打包文件axis-1_1.zip解压缩后将目录中的webapps目录下的axis子目录拷贝到C:/Tomcat/webapps下。
验证AXIS的安装:重新启动Tomcat服务器后打开浏览器输入网址http://localhost:8080/axis 后应该出现如下图所示页面,点击链接"Validate"来验证Axis所需的几个JAVA包是否齐全。
图2
点击超链接Validate后,AXIS会自动检查所需的每一个JAVA组件,这协组件分为:必需组件以及可选组件,必须保证所有必需组件都存在,如下图所示即为验证成功。
图3
3.3. Web Service服务端开发
经过了前两步之后我们就可以开始Web服务之旅了!大多数人在学习一种编程语言的第一步都是从Hello world程序开始的,我们也不例外。我们将提 供这样一个Web服务,通过给它传入姓名,服务返回:你好[姓名],欢迎来到Web服务的世界。这就是我们的需求。我们将马上根据AXIS的要求完成我们 的需求,你就会发现原来Web服务可以这么简单!
编写JAVA类Hello.java,内容如下:
public class Hello{
public String hello(String name){
if(name==null)
name = "";
return "hello "+name+",welcome to web service";
}
}
仅此而已,无需编译,将该文件改名为Hello.jws并拷贝到AXIS应用目录C:/Tomcat/webapps/axis下。
下面我们就可以测试该Web服务了,打开浏览器并输入刚刚创建的文件名对应的URL地址 http://localhost:8080/axis/Hello.jws 浏览器显示如下结果:
There is a Web Service here
Click to see the WSDL
点击页面上的链接查看该Web服务对应的WSDL信息如下所示(我们将在下一小节简单介绍WSDL)
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions
targetNamespace="http://localhost:8080/axis/Hello.jws"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://www.w3.org/2000/xmlns/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:impl="http://localhost:8080/axis/Hello.jws"
xmlns:intf="http://localhost:8080/axis/Hello.jws"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
- <wsdl:message name="helloRequest">
<wsdl:part name="name" type="xsd:string" />
</wsdl:message>
+ <wsdl:message name="helloResponse">
- <wsdl:portType name="Hello">
- <wsdl:operation name="hello" parameterOrder="name">
<wsdl:input name="helloRequest" message="intf:helloRequest" />
<wsdl:output name="helloResponse" message="intf:helloResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="HelloSoapBinding" type="intf:Hello">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="hello">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="helloRequest">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://DefaultNamespace" />
</wsdl:input> - <wsdl:output name="helloResponse">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost:8080/axis/Hello.jws" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="HelloService">
- <wsdl:port name="Hello" binding="intf:HelloSoapBinding">
<wsdlsoap:address location="http://localhost:8080/axis/Hello.jws" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
到此我们已经完成了hello的Web服务了,那我们怎么告诉用户如何来使用该服务呢?我们只需要告诉用户我们的Web服务的URL地址: http://localhost:8080/axis/Hello.jws?wsdl 就可以了!
3.4. Web Service客户端开发
使用AXIS的工具将使Web服务的访问和我们之前介绍的创建一个Web服务一样的简单。我们前面安装的AXIS环境中已经包含着这样的工具,它是一个 JAVA类,类名为:org.apache.axis.wsdl.WSDL2Java。打开命令行窗口,转到AXIS目录下的WEB-INF子目录。确保 Tomcat服务已经处于启动状态,键入命令 :
Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl
该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws,该目录下有四个JAVA源文件,它们分别是:
Hello.java 定义了Web服务接口,此例中只有一个hello方法。
HelloService.java 定义了用于获取Web服务接口的方法。
HelloServiceLocator.java 接口HelloService的具体实现。
HelloSoapBindingStub.java Web服务客户端桩,通过该类与服务器交互。
这四个JAVA类帮我们处理了大部分的逻辑,我们需要的仅仅是把这些类加到我们的项目然后创建一个我们自己的类来调用它们即可。为此我们新加一个类Main.java,为了方便,让这个类与刚产生的四个类都在同一个包下。内容如下:
//Main.java
package localhost.axis.Hello_jws;
public class Main{
public static void main(String[] args) throws Exception{
HelloService service = new HelloServiceLocator();
Hello hello = service.getHello();
System.out.println("Response:"+hello.hello("罐头"));
}
}
使用以下命令进行编译:
javac -classpath lib/axis.jar;lib/jaxrpc.jar localhost/axis/Hello_jws/*.java
如果编译没有问题的话执行该测试程序:
java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//运行结果:Response:你好罐头,欢迎来到Web服务的世界!
在WSDL2Java工具自动产生的几个类中,类HelloServiceLocator中保存这一些跟服务器相关的信息,例如URL地址等,当服务器的 地址更改后但是服务并没有改动的时候直接修改该文件中的字符串定义,而无需重新生成这几个类。具体需要修改的内容,打开该文件便可一目了然。
3.5. 处理复杂的自定义数据类型
在Axis中,将自定义的复杂数据类型序列化成xml有两种方法,一种方法是使用JavaBean方法,使用Axis提供的Bean序列化工厂 (BeanSerializerFactory)来实现序列化;另一种方法是自己编写序列化工厂和反序列化工厂,这种方法这里将不做说明。另外其它 web service产品也应提供这两种方法;
3.6. 参考资料
Apache网站AXIS项目 http://ws.apache.org/axis/
Apache Tomcat http://jakarta.apache.org/tomcat
AXIS打包下载地址: http://ws.apache.org/axis/dist/1_1/
4. 应用 XFire 开发 Web Service
4.1. 服务器端开发
一、首先建立WEB.XML文件的配置映射,当访问services时,调用XFireConfigurableServlet来处理:
xml 代码
1. ……
2. <web-app>
3.
4. <servlet>
5. <servlet-name> XFireServlet </servlet-name>
6. <display-name> XFire Servlet </display-name>
7. <servlet-class>
8. org.codehaus.xfire.transport.http.XFireConfigurableServlet
9. </servlet-class>
10. </servlet>
11.
12. <servlet-mapping>
13. <servlet-name> XFireServlet </servlet-name>
14. <url-pattern> /servlet/XFireServlet/* </url-pattern>
15. </servlet-mapping>
16.
17. <servlet-mapping>
18. <servlet-name> XFireServlet </servlet-name>
19. <url-pattern> /services/* </url-pattern>
20. </servlet-mapping>
21. </web-app>
二、XFireConfigurableServlet会自动查找classes下的META-INF/xfire/services.xml配置文件,在这个XML配置文件中,把要提供服务类或接口进行绑定,设置其名称、命名空间、需要绑定的类:
xml 代码
1. <beans xmlns="http://xfire.codehaus.org/config/1.0">
2. <service>
3. <name> MathService </name>
4. <namespace> http://192.168.0.16/MathService </namespace>
5. <serviceClass> lpl.MathService </serviceClass>
6. </service>
7. </beans>
三、把需要服务的类或接口编写出来,我的示例是lpl.MathService类:
java 代码
1. package lpl;
2.
3. public class MathService {
4.
5. public long add(int a,int b){
6. return a+b+1000;
7. }
8.
9. public long sub(int a, int b){
10. return a-b+1000;
11. }
12. }
四、把XFire及其需要的包都拷过来。
下载XFire后,解压后有个lib目录,把里面全部的包都拷过来
下载的XFire包也拷过来
五、起动TOMCAT进行服务器端的测试:
输入网址:http://localhost:8080/MathService/services/
浏览器会显示你所绑定的类或接口名称,如:
Available Services:
• MathService [wsdl]
Generated by XFire ( http://xfire.codehaus.org )
点击服务名后面的[wsdl],会显示该服务类的详细wsdl描述。(某些浏览器或插件可能会显示失败,我用TW就不能正常访问,所以不行时,换个浏览器试试)
4.2. 参考资料
http://xfire.codehaus.org/
http://blog.163.com/peigen_peigen/blog/static/27047802007114115555893/
http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html
http://sdbany.javaeye.com/blog/53993
3.1. AXIS项目
Axis框架来自 Apache 开放源代码组织,它是基于JAVA语言的最新的 SOAP 规范(SOAP 1.2)和 SOAP with Attachments 规范(来自 Apache Group )的开放源代码实现。有很多流行的开发工具都使用AXIS作为其 实现支持Web服务的功能,例如JBuilder以及著名的Eclipse J2EE插件Lomboz。AXIS的最新版本是1.1,可以从 http: //ws.apache.org/axis/index.html下载。
下图是AXIS核心引擎的体系结构图:
图1
整个AXIS项目包括以下几个部分:
消息流子系统
消息流子系统提供了灵活的消息传递框架,这个消息传递框架包括处理程序、链、序列化程序和反序列化程序。处理程序是一个处理请求、响应和故障流的对象。处理程序可被组合在一起成为链,而且可以使用一个灵活的部署描述符来配置这些处理程序的顺序。
传输框架子系统
提供了一个传输框架,这个传输框架可以帮助您创建自己的可插式传输发送器和传输侦听器。
数据编码子系统
AXIS完全按照 XML Schema 规范提供各种数据类型的自动序列化,并且提供功能扩展接口来使用您自己定制的序列化器和反序列化器。
其他
AXIS完全支持 WSDL 以及日志记录、出错以及故障处理机制。它同时提供一些工具用来讲WSDL文档转换成客户端的调用框架以及根据类来产生WSDL定义文档。
AXIS目前版本支持的标准是:W3C SOAP 1.1 和 1.2;WSDL 1.1;SAAJ 1.1(SUN公司: SOAP with Attachments API for Java);JAX-RPC(SUN公司:Java API for XML- Based RPC)1.0。
3.2. 环境搭建
由于AXIS本身是基于JAVA语言开发的项目,并且是以Web应用形式发布的,因此它运行时需要一个应用服务器作为支撑。为了方便我们这里选用的是 Tomcat。由于AXIS本身需要用到处理XML信息的包,所以我们建议使用JDK1.4并安装Tomcat 4.1.24。下面是环境搭建步骤,读取 根据自身情况进行安装。
安装JDK1.4.1
安装Tomcat 4.1.24到C:/Tomcat并验证安装是否成功
下载AXIS项目打包文件axis-1_1.zip解压缩后将目录中的webapps目录下的axis子目录拷贝到C:/Tomcat/webapps下。
验证AXIS的安装:重新启动Tomcat服务器后打开浏览器输入网址http://localhost:8080/axis 后应该出现如下图所示页面,点击链接"Validate"来验证Axis所需的几个JAVA包是否齐全。
图2
点击超链接Validate后,AXIS会自动检查所需的每一个JAVA组件,这协组件分为:必需组件以及可选组件,必须保证所有必需组件都存在,如下图所示即为验证成功。
图3
3.3. Web Service服务端开发
经过了前两步之后我们就可以开始Web服务之旅了!大多数人在学习一种编程语言的第一步都是从Hello world程序开始的,我们也不例外。我们将提 供这样一个Web服务,通过给它传入姓名,服务返回:你好[姓名],欢迎来到Web服务的世界。这就是我们的需求。我们将马上根据AXIS的要求完成我们 的需求,你就会发现原来Web服务可以这么简单!
编写JAVA类Hello.java,内容如下:
public class Hello{
public String hello(String name){
if(name==null)
name = "";
return "hello "+name+",welcome to web service";
}
}
仅此而已,无需编译,将该文件改名为Hello.jws并拷贝到AXIS应用目录C:/Tomcat/webapps/axis下。
下面我们就可以测试该Web服务了,打开浏览器并输入刚刚创建的文件名对应的URL地址 http://localhost:8080/axis/Hello.jws 浏览器显示如下结果:
There is a Web Service here
Click to see the WSDL
点击页面上的链接查看该Web服务对应的WSDL信息如下所示(我们将在下一小节简单介绍WSDL)
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions
targetNamespace="http://localhost:8080/axis/Hello.jws"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://www.w3.org/2000/xmlns/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:impl="http://localhost:8080/axis/Hello.jws"
xmlns:intf="http://localhost:8080/axis/Hello.jws"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
- <wsdl:message name="helloRequest">
<wsdl:part name="name" type="xsd:string" />
</wsdl:message>
+ <wsdl:message name="helloResponse">
- <wsdl:portType name="Hello">
- <wsdl:operation name="hello" parameterOrder="name">
<wsdl:input name="helloRequest" message="intf:helloRequest" />
<wsdl:output name="helloResponse" message="intf:helloResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="HelloSoapBinding" type="intf:Hello">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="hello">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="helloRequest">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://DefaultNamespace" />
</wsdl:input> - <wsdl:output name="helloResponse">
<wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost:8080/axis/Hello.jws" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="HelloService">
- <wsdl:port name="Hello" binding="intf:HelloSoapBinding">
<wsdlsoap:address location="http://localhost:8080/axis/Hello.jws" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
到此我们已经完成了hello的Web服务了,那我们怎么告诉用户如何来使用该服务呢?我们只需要告诉用户我们的Web服务的URL地址: http://localhost:8080/axis/Hello.jws?wsdl 就可以了!
3.4. Web Service客户端开发
使用AXIS的工具将使Web服务的访问和我们之前介绍的创建一个Web服务一样的简单。我们前面安装的AXIS环境中已经包含着这样的工具,它是一个 JAVA类,类名为:org.apache.axis.wsdl.WSDL2Java。打开命令行窗口,转到AXIS目录下的WEB-INF子目录。确保 Tomcat服务已经处于启动状态,键入命令 :
Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/Hello.jws?wsdl
该命令执行的结果是在当前所在目录下产生一个子目录 localhost/axis/Hello_jws,该目录下有四个JAVA源文件,它们分别是:
Hello.java 定义了Web服务接口,此例中只有一个hello方法。
HelloService.java 定义了用于获取Web服务接口的方法。
HelloServiceLocator.java 接口HelloService的具体实现。
HelloSoapBindingStub.java Web服务客户端桩,通过该类与服务器交互。
这四个JAVA类帮我们处理了大部分的逻辑,我们需要的仅仅是把这些类加到我们的项目然后创建一个我们自己的类来调用它们即可。为此我们新加一个类Main.java,为了方便,让这个类与刚产生的四个类都在同一个包下。内容如下:
//Main.java
package localhost.axis.Hello_jws;
public class Main{
public static void main(String[] args) throws Exception{
HelloService service = new HelloServiceLocator();
Hello hello = service.getHello();
System.out.println("Response:"+hello.hello("罐头"));
}
}
使用以下命令进行编译:
javac -classpath lib/axis.jar;lib/jaxrpc.jar localhost/axis/Hello_jws/*.java
如果编译没有问题的话执行该测试程序:
java -Djava.ext.dirs=lib -cp . localhost.axis.Hello_jws.Main//运行结果:Response:你好罐头,欢迎来到Web服务的世界!
在WSDL2Java工具自动产生的几个类中,类HelloServiceLocator中保存这一些跟服务器相关的信息,例如URL地址等,当服务器的 地址更改后但是服务并没有改动的时候直接修改该文件中的字符串定义,而无需重新生成这几个类。具体需要修改的内容,打开该文件便可一目了然。
3.5. 处理复杂的自定义数据类型
在Axis中,将自定义的复杂数据类型序列化成xml有两种方法,一种方法是使用JavaBean方法,使用Axis提供的Bean序列化工厂 (BeanSerializerFactory)来实现序列化;另一种方法是自己编写序列化工厂和反序列化工厂,这种方法这里将不做说明。另外其它 web service产品也应提供这两种方法;
3.6. 参考资料
Apache网站AXIS项目 http://ws.apache.org/axis/
Apache Tomcat http://jakarta.apache.org/tomcat
AXIS打包下载地址: http://ws.apache.org/axis/dist/1_1/
4. 应用 XFire 开发 Web Service
4.1. 服务器端开发
一、首先建立WEB.XML文件的配置映射,当访问services时,调用XFireConfigurableServlet来处理:
xml 代码
1. ……
2. <web-app>
3.
4. <servlet>
5. <servlet-name> XFireServlet </servlet-name>
6. <display-name> XFire Servlet </display-name>
7. <servlet-class>
8. org.codehaus.xfire.transport.http.XFireConfigurableServlet
9. </servlet-class>
10. </servlet>
11.
12. <servlet-mapping>
13. <servlet-name> XFireServlet </servlet-name>
14. <url-pattern> /servlet/XFireServlet/* </url-pattern>
15. </servlet-mapping>
16.
17. <servlet-mapping>
18. <servlet-name> XFireServlet </servlet-name>
19. <url-pattern> /services/* </url-pattern>
20. </servlet-mapping>
21. </web-app>
二、XFireConfigurableServlet会自动查找classes下的META-INF/xfire/services.xml配置文件,在这个XML配置文件中,把要提供服务类或接口进行绑定,设置其名称、命名空间、需要绑定的类:
xml 代码
1. <beans xmlns="http://xfire.codehaus.org/config/1.0">
2. <service>
3. <name> MathService </name>
4. <namespace> http://192.168.0.16/MathService </namespace>
5. <serviceClass> lpl.MathService </serviceClass>
6. </service>
7. </beans>
三、把需要服务的类或接口编写出来,我的示例是lpl.MathService类:
java 代码
1. package lpl;
2.
3. public class MathService {
4.
5. public long add(int a,int b){
6. return a+b+1000;
7. }
8.
9. public long sub(int a, int b){
10. return a-b+1000;
11. }
12. }
四、把XFire及其需要的包都拷过来。
下载XFire后,解压后有个lib目录,把里面全部的包都拷过来
下载的XFire包也拷过来
五、起动TOMCAT进行服务器端的测试:
输入网址:http://localhost:8080/MathService/services/
浏览器会显示你所绑定的类或接口名称,如:
Available Services:
• MathService [wsdl]
Generated by XFire ( http://xfire.codehaus.org )
点击服务名后面的[wsdl],会显示该服务类的详细wsdl描述。(某些浏览器或插件可能会显示失败,我用TW就不能正常访问,所以不行时,换个浏览器试试)
4.2. 参考资料
http://xfire.codehaus.org/
http://blog.163.com/peigen_peigen/blog/static/27047802007114115555893/
http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html
http://sdbany.javaeye.com/blog/53993