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

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

你可能感兴趣的:(webservice,ant,SOA,jax-ws,同步通信)