四、例子源代码剖析 D:/Sun/SDK/samples/javaee5/webservices/hello-jaxws(以后简称为hello-jaxws)
项目里的源文件只有三个 hello-jaxws/src/endpoint/Hello.java 提供webservice的服务器端实现类 hello-jaxws/src/client/Client.java 调用webservice的客户端测试类 hello-jaxws/build.xml 自动编译的ant脚本
下面我们把这三个文件的内容看一下 1、服务器端的service实现类文件Hello.java,
[Copy to clipboard]
CODE:
/* src/endpoint/Hello.java文件的内容 */ package endpoint; import javax.jws.WebService; @WebService public class Hello { public String getHello(String name) { return "Hello " + name + "!"; } }
有这个文件可以看出,编写一个service的实现类,把编写普通的java类 差不多,只不过又多了三点 ①要在该类前一个@WebService说明, ②引入javax.jws.WebService; ③在公开的方法前加@WebMethod说明,如果不加的话, 所有的public方法都会自动变成service的对外接口.
2、客户端测试类的实现文件
[Copy to clipboard]
CODE:
/* src/client/Client.java文件的内容 */ package client; import javax.xml.ws.WebServiceRef; import endpoint.HelloService; import endpoint.Hello; public class Client { @WebServiceRef(wsdlLocation="http://localhost:8080/Hello/HelloService?WSDL") static HelloService service; public static void main(String[] args) { Client client = new Client(); client.doHello(); } public void doHello() { try { Hello port = service.getHelloPort(); String ret = port.getHello(System.getProperty("user.name")); System.out.println("Hello result = " + ret); } catch(Exception e) { e.printStackTrace(); } } }
客户端调用代码要点为: ①导入WebServiceRef包 import javax.xml.ws.WebServiceRef; ②导入本地生成的stub类,另外编译时也要指明stub类的路径 import endpoint.HelloService; import endpoint.Hello; ③指明服务器的wsdl路径 @WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL") ④声明一个静态的service对象 static HelloService service; ⑤对要调用的远程方法声明一个代理对象,通过代理来调用真正的远程方法 Hello port = service.getHelloPort(); String ret = port.getHello(System.getProperty("user.name"));
3、ant 脚本build.xml
[Copy to clipboard]
CODE:
<!-- ant 脚本build.xml的内容 --> <?xml version="1.0" encoding="UTF-8"?> <project name="hello-jaxws" default="all" basedir="."> <!-- include user specific build properties --> <!-- 导入预先j2ee预先写好的设置文件--> <property file="../../../bp-project/build.properties"/> <property file="${user.home}/build.properties"/> <property file="../../../bp-project/app-server.properties"/> <!-- 设置发布目录和类的输出目录 --> <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/> <property name="classesdir" value="./build"/> <!-- 设置java的类库路径 --> <path id="classpath"> <pathelement location="${javaee.home}/lib/j2ee.jar"/> <pathelement location="${classesdir}"/> </path> <!-- 项目的最终任务 --> <target name="all" depends="run-client"> <!--antcall target="restore"/--> </target> <!-- 测试操作系统环境--> <target name="init"> <condition property="windows"> <os family="windows" /> </condition> <condition property="unix"> <os family="unix" /> </condition> </target> <!-- 编译服务器端并把它自动发布到sun的服务器上 --> <target name="compile-deploy-service" depends="init"> <mkdir dir="${classesdir}"/> <echo message="${javaee.home}"/> <javac srcdir="./src" includes="endpoint/**" destdir="${autodeploydir}" classpath="${javaee.home}/lib/j2ee.jar" /> <waitfor maxwait="100" maxwaitunit="second"> <or> <available file="${autodeploydir}/endpoint/Hello.class_deployed"/> <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/> </or> </waitfor> <condition property="deploy_succeeded"> <available file="${autodeploydir}/endpoint/Hello.class_deployed"/> </condition> <condition property="deploy_failed"> <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/> </condition> </target> <target name="get-artifacts" depends="compile-deploy-service,get-artifacts-windows,get-artifacts-unix"/> <!-- 生成客户端所需的stub --> <target name="get-artifacts-windows" if="windows"> <exec executable="${javaee.home}/bin/wsimport.bat"> <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/> </exec> </target> <target name="get-artifacts-unix" if="unix"> <exec executable="${javaee.home}/bin/wsimport"> <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/> </exec> </target> <!-- 编译客户端 --> <target name="compile-client" depends="get-artifacts"> <javac srcdir="./src/client" destdir="${classesdir}"> <classpath refid="classpath"/> </javac> </target> <target name="run-client" depends="compile-client,run-client-windows,run-client-unix"/> <!-- 执行客户端 --> <target name="run-client-windows" if="windows"> <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}"> <arg value="client.Client"/> </exec> </target> <target name="run-client-unix" if="unix"> <exec executable="${javaee.home}/bin/appclient" dir="${classesdir}" failifexecutionfails="false"> <arg value="client.Client"/> </exec> </target> <!-- 以下几个任务用与清理和卸载--> <!-- 删除生成的类文件--> <target name="clean"> <delete dir="${classesdir}"/> </target>
<!-- 删除和卸载服务器的webservice--> <target name="restore"> <delete> <fileset dir="${autodeploydir}/endpoint" includes="Hello*.*"/> </delete> </target> <target name="undeploy"> <antcall target="restore"/> </target> </project> 这个脚本有许多在windows平台用不到的步骤,下面我们对其进行改造,把它精简一下. /*title: web service入门学习笔记(五) **date:
2007/01/18
**author:laomai **url: http://blog.csdn.net/laomai/ */
|