首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

基于SOA的同步通信——JAX-WS的根本用法

2013-01-18 
基于SOA的同步通信——JAX-WS的基本用法1.创建Webservice服务类HelloService,代码如下:package com.cugxw.ws

基于SOA的同步通信——JAX-WS的基本用法

1.创建Webservice服务类HelloService,代码如下:

package com.cugxw.ws;import javax.jws.WebMethod;import javax.jws.WebService;/* 使用@WebService注解标明该类作为WebService类,不能是final,static */@WebServicepublic class Hello {/* 对外开发的方法,不能是final,static */@WebMethodpublic 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 {@Overridepublic void init() throws ServletException {// create and publish an endpointHello 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

热点排行