前两天写了两篇Blog
使用SOAP开发java web服务--Axis开发方案 ,
深入探索SOAP1.1--使用SAAJ1.2.1 ,有些读者可能对Java的web服务开发抱怨了,怎的那么复杂呢?不如在net平台下敲几个键就行了,:),请先不用着急,前两天我的Blog只是为了让各位读者深入了解一下什么是SOAP,以及其在Java中的封装接口实现,今天我们来讨论一下,一种高层的web服务实现方案,那就是基于JAX-RPC的服务实现。
JAX-RPC 1.1规范没有定义用于实现基于JAX-RPC的服务的任何API。基于JAX-RPC的服务均可使用Java类或使用WSDL文档实现,这两种情况,JAX-RPC均不为其服务端实现访问和使用部署的服务指定任何要求。基于JAX-RPC的服务于开发RMI应用程序极为相似(JAX-RPC是使用基于SOAP的RPC和WSDL机制调用异源环境中运行的web服务,集成了远程过程调用(RPC)的性能,通过提供Java与XML/WSDL之间所需的映射,封装了底层SOAP包装和消息交换的复杂操作)。
一、基于Java类开发JAX-RPC服务。
步骤与RMI开发基本类似:
1)定义远程接口(服务定义);
2)实现方案远程接口(服务实现方案);
3)配置服务;
4)生成部署文件;
我实现的例子:
1、定义远程接口(StudentInfoIF.java):
/**
*StudentInfoIF.java
*Copyright 2005-2-10
*@author 阿飞
*/
package edu.cun.jws.jaxrpc;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*该接口主要用于jax-rpc服务定义(远程接口)
*/
public interface StudentInfoIF extends Remote{
/**
*@param studentName 这是一个学生名字的字符串表达
*@return String 返回学生的信息
*/
public String getStudentInfo(String studentName) throws RemoteException;
}
2、实现远程接口(StudentInfoImpl.java):
/**
*StudentInfoImpl.java
*Copyright 2005-2-10
*@author 阿飞
*/
package edu.cun.jws.jaxrpc;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*实现远程接口StudentInfoIF,服务实现方案
*@see StudentInfoIF
*/
public class StudentInfoImpl implements StudentInfoIF{
public String getStudentInfo(String studentName){
System.out.println("Your name:"+studentName);
return new String(" Hello");
}
}
对上面的源文件进行编译:java *.java -d .
最后在当前文件夹得到一个edu文件夹,里面就是我们的需要的服务的字节类。
3、准备部署
由于是使用JWSDP1.5的开发工具,读者请到SUN网站下载JWSDP开发工具http://java.sun.com/webservices/downloads/webservicespack.html:
我们使用的是jwsdp安装路径/jaxrpc/bin中的工具wsdeploy,该工具先通过调用wscompile -gen:server来完成编译(由于现在我们部署的对象是Tomcat,所以我们要调用wsdeploy,如果是标准的J2EE实现方案的容器的话,使用wscompile就行了,具体请看帮助文档):
因为使用的是wsdeploy,所以要先编写一个jaxrpc-ri.xml文件,针对我们这次的例子:
<?xml version="1.0" encoding="UTF-8"?>
<webServices
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
version="1.0"
targetNamespaceBase="http://www.cun.edu.cn/jws/wsdl" <------------这个是你自己命名的空间
typeNamespaceBase="http://www.cun.edu.cn/jws/types" <------------也是自己定义的
urlPatternBase="/StudentInfo">
<endpoint
name="StudentInfo"
interface="edu.cun.jws.jaxrpc.StudentInfoIF" <-----------这个是我们提供的接口
implementation="edu.cun.jws.jaxrpc.StudentInfoImpl"/> <-----------实现接口的类
<endpointMapping
endpointName="StudentInfo"
urlPattern="/Info"/> <-----------等于是web.xml文件中的url-pattern
</webServices>
如果需要事先对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"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
准备部署工作完毕。
4、部署(要熟悉j2ee部署规范,这里我的部署对象是Tomcat)
我们创建一个文件夹StudentInfo
以下是文件夹内容
/StudentInfo
/WEB-INF
/classes <-------把我们的服务程序拷到这里,这里是edu文件夹
/lib <-------必须的包,
web.xml <-------上面我们编写的文件
jaxrpc-ri.xml <-------上一步编写的文件
注意这里必须的包包括JAX-RPC相关的包,还有SAAJ相关的包(JavaMail,JAF,JAXP),我这里用了以下几个包(由于是使用jdk1.5,所以JAXP相关包不在内):activation.jar(JAF),jaxrpc-api.jar,jaxrpc-impl.jar,jaxrpc-spi.jar,mail.jar,saaj-api.jar,saaj-impl.jar;
好了之后,我们打包成一个war文件(由于wsdeploy需要的输入文件是一个war存档文件):
转换到到StudentInfo目录下,设置好运行wsdeploy的运行路径,运行:
jar cvf StudentInfo.war *
wsdeploy -o StudentInfoApp.war StudentInfo.war
最后我们得到一个StudentInfoApp.war文件,该文件就是我们需要的部署web服务的程序。我们把它拷到Tomcat的webapps目录下,就自动部署好了
5、测试
在浏览器中输入:http://localhost:8080/StudentInfoApp/Info
测试成功,web服务部署完毕,客户端的测试的话,自己编写,可以使用java,也可以使用net平台等作为客户端,请参考我的例子:使用SOAP开发java web服务--Axis开发方案 ,就是使用C#作为服务的调用客户端。
ps:基于JAX-RPC的web服务开发就是这么简单,很多内部转换的内容都已经自动完成了,我们可以把精力集中于商业逻辑上来,欢迎大家加入Java Web Service的开发行列来。