1.创建Webservice服务类HelloService,代码如下:
package com.cugxw.ws; import javax.jws.WebMethod; import javax.jws.WebService; /* 使用@WebService注解标明该类作为WebService类,不能是final,static */ @WebService public class Hello { /* 对外开发的方法,不能是final,static */ @WebMethod public String sayHello(String name) { System.out.println("Hello " + name); return "Hello " + name; } }
2.创建Endpoint,发布WebService
执行以下代码即可:
Hello hello = new Hello(); /* 注意: 端口号不能被其他已经启动的程序占用 */ Endpoint.publish("http://localhost:8086/hello",hello);
但是一般情况下,我们会将WebService服务集成到web服务器下,所以一般会在web服务器启动时发布WebService服务,以Tomcat为例,想在tomcat启动时候发布WebService
只需要想办法让它启动时执行上面的代码即可,由此我们想到可以使用HttpServlet做load-on-startup配置。
步骤如下:
(1)建立一个servlet类,只覆盖init方法。
package com.cugxw.start; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.xml.ws.Endpoint; import com.cugxw.ws.Hello; @SuppressWarnings("serial") public class StartupWebService extends HttpServlet { @Override public void init() throws ServletException { // create and publish an endpoint Hello hello = new Hello(); Endpoint.publish("http://localhost:8086/hello", hello); System.out.println("Web service startup..."); } }
(2)配置web.xml,只需增加以下代码:
<servlet> <servlet-name>startupWebService</servlet-name> <servlet-class>com.cugxw.start.StartupWebService</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
3.启动tomcat,在浏览器中测试url: http://localhost:8086/hello?wsdl。
4.生成client端WebService支持代码,有两种方式:
(1)启动控制台,执行JVM命令: wsimport -p com.cugxw.ref -keep http://localhost:8086/hello?wsdl
参数
-p: 指定生成java文件,class文件的目录
-keep: 表示保留java文件,否则删除所有生成的java文件
本例中生成的java文件和class文件在控制台所在目录下的com/cugxw/ws里面,我们可以直接将java文件copy到client端代码中区引用,也可以在此时候jar命令打包class文件,
在client端工程的classpath中引入使用,本例直接将java代码copy到client工程里面,保留包结构com.cugxw.ws,文件列表如下:
Hello.java
HelloService.java
ObjectFactory.java
package-info.java
SayHello.java
SayHelloResponse.java
(2)使用ant脚本生成,但是要增加一个ant命令,那就是wsimport,需要依赖的jar包可从http://www.jarfinder.com下载,ant脚本如下:
<project name="WsClient" default="run" basedir="."> <!-- 定义ant任务所有引用变量 --> <property name="build.wsdl.uri" value="http://localhost:8086/hello?wsdl" description="WebService的WSDL" /> <property name="build.lib.dir" value="C:/Xw bin/lib" description="引用的jar目录" /> <property name="build.src.dir" value="${basedir}" description="生成源代码的目录" /> <property name="build.bin.dir" value="../lib" description="打包生成jar文件的目录" /> <property name="build.jar.file" value="WsHello.jar" description="打包后的jar文件名称" /> <!-- 将wsimport命令加入ant所引用的所有jar包(来自本地目录),可从http://www.jarfinder.com下载 --> <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport2"> <classpath> <filelist> <file name="${build.lib.dir}/ws/jaxws-tools-2.1.4.jar" /> <file name="${build.lib.dir}/ws/jaxws-api-2.1.jar" /> <file name="${build.lib.dir}/ws/jaxws-rt-2.1.4.jar" /> <file name="${build.lib.dir}/ws/jaxb-xjc-2.1.7.jar" /> <file name="${build.lib.dir}/ws/jaxb-impl-2.1.7.jar" /> <file name="${build.lib.dir}/ws/streambuffer-0.8.jar" /> <file name="${build.lib.dir}/ws/stax-ex-1.2.jar" /> </filelist> </classpath> </taskdef> <!-- 所有ant任务 --> <target name="run" depends="clean" /> <!-- 删除生成的class文件 --> <target name="clean" depends="jar"> <delete> <fileset dir="${build.src.dir}" defaultexcludes="true"> <include name="**/*.class"/> </fileset> </delete> </target> <!-- 打包 --> <target name="jar" depends="wsimport"> <mkdir dir="${build.bin.dir}"/> <jar jarfile="${build.bin.dir}${file.separator}${build.jar.file}" defaultexcludes="true"> <fileset dir="${build.src.dir}" defaultexcludes="true"> <include name="**/*.class"/> </fileset> </jar> </target> <!-- 根据wsdl生成client端辅助类class文件 --> <target name="wsimport"> <wsimport destdir="${build.src.dir}" debug="true" wsdl="${build.wsdl.uri}"/> </target> </project>
5.引用步骤4中生成的jar或者直接使用生成的java代码,编写client端程序调用WebService。
package com.cugxw.client; import javax.xml.ws.WebServiceRef; import com.cugxw.ws.Hello; import com.cugxw.ws.HelloService; public class HelloClient { /* 注入WebService支持类的对象,指定WSDL */ @WebServiceRef(wsdlLocation="http://localhost:8086/hello?wsdl") static HelloService service; public static void main(String[] args) { HelloService service = new HelloService(); Hello helloProxy = service.getHelloPort(); String hello = helloProxy.sayHello("Brooke"); System.out.println(hello); } }
执行,查看client端输出结果: Hello Brooke
查看server端输入结果: Hello Brooke