介绍
本文主要介绍Java Web Services Developers Pack1.6的基础知识,并且利用Eclipse开发一个入门程序。
Java Web Services Developer Pack简介
Java Web Services Developer Pack(JWSDP)是一个免费的集成工具,它帮助Java开发者使用最新的Web Services技术和标准实现建立和测试XML程序、Web Services和Web应用程序。JWSDP当前最新版本是2.0,而本文的讲解和示例程序是基于1.6的。更多详细信息请参考http://java.sun.com/webservices/jwsdp/index.jsp。
JWSDP1.6包含了下列技术:
l XML and Web Services Security v2.0 EA
l XML Digital Signatures v1.0 FCS
l Java Architecture for XML Binding (JAXB) v 1.0.5 FCS
l Java API for XML Processing (JAXP) v 1.3.1 FCS
l Java API for XML Registries (JAXR) v 1.0.8 FCS
l Java API for XML-based RPC (JAX-RPC) v 1.1.3 FCS
l SOAP with Attachments API for Java (SAAJ) v 1.2.2 FCS
l JavaServer Pages Standard Tag Library (JSTL) v 1.1.1 _01 FCS
l Sun Service Registry v3.0 EA
l Ant Build Tool 1.6.2 FCS
l WS-I Attachments Sample Application 1.0 EA5
wscompile和wsdeploy工具介绍
这两个工具是由JAX-RPC标准实现提供的,和JWSDP包一起发布。开发者通过使用它们可以开发标准的Web Services以及客户端实现。
1、 wscompile
wscompile主要用来生成在JAX-RPC客户端和服务中使用的stubs、ties、serializers和WSDL文件。这个工具使用一个配置文件作为输入,配置文件一般指定一个WSDL文件、一个模型文件或者一个经过的编译的服务终端接口。
wscompile可以在命令中使用,也可以通过Ant脚本调用,命令行中的语法是:
wscompile [options] <configuration-file>
为了方便起见,一般把配置文件命名为config.xml,当然这并不是必须,你也可以命名为你喜欢的任何名字。关于options的详细信息请参考jaxrpc-tools文档,这里就不再赘述了。我们主要看一下配置文件的格式。
配置文件包含了描述web service的信息,基本格式如下:
<?xml version="1.0" encoding="UTF-8"?>
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<service> or <wsdl> or <modelfile>
</configuration>
其中<configuration>元素必须包含<service>、<wsdl>或者<modelfile>元素中的一个。
<service>元素
如果指定了这个元素,wscompile就会读取描述服务的终端接口,并且生成一个WSDL文件。在<interface>子元素中,name属性指定了服务终端接口,servantName属性指定实现接口的类。例如:
service name="CollectionIF_Service"
targetNamespace="http://echoservice.org/wsdl"
typeNamespace="http://echoservice.org/types"
packageName="stub_tie_generator_test">
<interface name="stub_tie_generator_test.CollectionIF"
servantName="stub_tie_generator_test.CollectionImpl"/>
</service>
<wsdl>元素
如果指定了这个元素,wscompile会读取服务的WSDL文件,产生服务终端接口。location属性指定了WSDL文件的URL,而packageName属性指定了由wscompile产生的类所在的包。例如:
<wsdl
location="./etc/HelloWorldService.wsdl"
packageName="hello">
</wsdl>
<modelfile>元素
这个元素主要为高级用户而设置。
如果config.xml文件包含了一个<service>或者<wsdl>元素,wscomplile就会生成一个model文件,它包含了描述服务的内在数据结构。如果你已经手动生成了一个model文件,那么在下一次运行wscompile时可以重用。例如:
<modelfile location="mymodel.xml.gz"/>
2、 wsdeploy
wsdeploy工具读取一个WAR文件和jaxrpc-ri.xml文件,然后产生另外一个可以用来发布的WAR文件。在这个操作背后,wsdeploy运行了包含-gen:server选项的wscompile。wscompile命令产生类和一个WSDL文件,这些要被包含在wsdeploy产生的WAR文件中。
和wscompile一样,wsdeploy也可以通过命令行和Ant脚本两种方式调用,下面是命令行的语法:
wsdeploy -o <output-war-file> <input-war-file> <options>
<options>具体意义参考jaxrpc-tools文档。
输入的WAR文件
你可以通过任何方式(IDE、Ant等)产生输入的WAR文件,这个文件典型结构如下:
WEB-INF/classes/hello/HelloIF.class
WEB-INF/classes/hello/HelloImpl.class
WEB-INF/web.xml
这上面的例子中HelloIF是服务终端接口,而HelloImpl是实现这个接口的类。web.xml文件是web组件的描述符文件。接下来介绍jaxrpc-ri.xml文件。
jaxrpc-ri.xml文件
下面的清单是关于一个简单的HelloWorld服务的jaxrpc-ri.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
targetNamespaceBase="http://com.test/wsdl"
typeNamespaceBase="http://com.test/types"
displayName="HelloWorld Service"
description="A simple web service"
implementation="hello.HelloImpl"/>
<webServices>元素必须一个或者多个<endpoint>元素。在这个例子中,注意<endpoint>元素的interface和implementation属性指定了服务的接口和实现类。<endpointMapping>元素将服务名和URL联系起来。
使用JWSDP实现一个简单的HelloService
1、 开发环境:JWSDP1.6、Tomcat50-JWSDP,开发工具Eclipse3.1(已配置好)。
2、 下载所需工具:Java Web Services Developers Pack1.6和Tomcat50-JWSDP。下载地址:http://java.sun.com/webservices/jwsdp/index.jsp
3、 安装
(1) tomcat50-jwsdp,下载后直接解压到指定目录即可,本文是E:/tomcat50-jwsdp。
(2) JWSDP1.6的安装:下载的应该是一个可执行文件jwsdp-1_6-windows-i586.exe,双击即开始安装。注意:JWSDP1.6需要JDK1.4或者以上版本;在安装过程中会让指定Web服务器,这里就指定为刚才安装的tomcat。当然也可以不指定,需要时再根据文档手动指定。
4、 开发过程
一切准备工作都已就绪,下面就开始具体的实现吧。
(1) 新建工程:打开Eclipse,选择New—〉Project,在Web中选择Dynamic Web Project。“Next”,在Project Name中输入工程名:HelloWorld。Target Runtime指定了运行时的服务器,如果列表中没有需要的服务器,可以点击“New”重新指定。
图1 输入工程名、指定服务器
一直下一步,完成工程新建。
(2) 添加类库:在工程名单击右键,选择“Properties”—〉“Java Build Path”。“Add Libraries”,在“Add Library”窗口中选择“User Library”,“Next”,如果“Selected User Library”中不存在需要的类库,点击“User Libraries”添加。所需要的jar文件列表如图2中所示:
图2 程序需要的jar列表
(3) 新建接口类和实现类:建立接口和类的方法非常简单,没有必要在叙述,两个文件分别为:HelloIF.java和HelloImpl.java下面是两个文件的代码列表:
//HelloIF.java
package hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloIF extends Remote{
public String sayHello(String str) throws RemoteException;
}
//HelloImpl.java
package hello;
public class HelloImpl implements HelloIF {
//
private String hello = "SayHello";
public String sayHello(String str) {
return str + hello;
}
}
呵呵,是不是太简单了?不过这已经足够了。
(4) 建立jaxrpc-ri.xml文件:因为在例子中只用了wsdeploy工具,所以我们需要一个jaxrpc-ri.xml文件。在“WebContent”下的“WEB-INF”节点上单击右键,选择“Other”—〉选择“XML”下的“XML”,输入文件名“jaxrpc-ri.xml”。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://hello.org/wsdl"
typeNamespaceBase="http://hello.org/types"
urlPatternBase="/webservices">
<endpoint
name="Hello"
displayName="HelloService"
description="An example SSO token service"
interface="hello.HelloIF"
implementation="hello.HelloImpl"/>
<endpointMapping
endpointName="Hello"
urlPattern="/hello"/>
</webServices>
(5) 建立Ant脚本build.xml文件:过程和上面一样,文件位置在工程根目录下,名字为build.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="HelloWorld" default="all" basedir=".">
<property name="JWSDP_HOME" value="E:/jwsdp-1.6"/>
<property name="tmpdir" value="./tmp"/>
<property name="webclasses" value="./WebContent/WEB-INF/classes"/>
<property name="TOMCAT_HOME" value="E:/tomcat50-jwsdp"/>
<target name="clean">
<echo message="删除目录"/>
<delete file="./${ant.project.name}.war" />
<delete file="./hello-temp.war" />
<delete dir="${tmpdir}"/>
<delete dir="${webclasses}"/>
</target>
<target name="init" depends="clean">
<mkdir dir="${webclasses}"/>
<mkdir dir="${tmpdir}"/>
</target>
<target name="create-war" depends="init">
<copy todir="./WebContent/WEB-INF/classes">
<fileset dir="./build/classes"/>
</copy>
<jar jarfile="./hello-temp.war" basedir="./WebContent"/>
</target>
<target name="deployready" depends="create-war">
<exec executable="${JWSDP_HOME}/jaxrpc/bin/wsdeploy.bat">
<arg line="-tmpdir tmp/ -o ${ant.project.name}.war hello-temp.war"/>
</exec>
</target>
<target name="deploy" depends="deployready">
<delete file="${TOMCAT_HOME}/webapps/${ant.project.name}.war"/>
<copy file="./${ant.project.name}.war" tofile="${TOMCAT_HOME}/webapps/${ant.project.name}.war"/>
</target>
<target name="run-server">
<exec executable="${TOMCAT_HOME}/bin/startup.bat"/>
</target>
<target name="all" depends="deploy">
</target>
</project>
经过以上5个步骤已经建立了程序需要的所有文件,剩下的工作就是测试了。工程中文件结构如下图:
图3 例子的文件结构
(6) 测试和运行:将build.xml文件添加到Eclipse的Ant窗口中,如图4。
图4 Ant窗口
双击all任务,可以在console窗口中看到如下信息:
图5 控制台输出信息
证明程序编译发布成功。我们可以通过winrar等工具查看由wsdeploy工具生成的HelloWorld.war文件的结构:
WEB-INF下:
图6
WEB-INF/classes/hello下:
图7
WEB-INF/classes/jaxrpc/generated/hello下:
图8
在Ant窗口中双击“run-server”任务启动服务器,打开浏览器,在其中输入http://localhost:8080/HelloWolrd/hello?WSDL,可以看到WSDL文件内容。证明程序成功运行。
注意:本文没有实现WebService的客户端,那么就留作练习吧。
总结
本文简单的介绍了Java Web Services Developer Pack 的基本概念,以及 wscompile 和 wsdeploy 的使用方法,并且结合 JWSDP1.6实现了一个简单的HelloWorld程序。