欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK 1.6 环境下开发 WebService

程序员文章站 2022-06-02 10:31:54
...

    JDK1.6 中已经支持用Java开发WebService应用了,而且很方便。这样就大大减少了项目安装部署的代价,因为选择开源的框架依赖大量第三方包,程序的尺寸倍增。下面为大家提供一个一个JDK1.6开发Web Service的入门例子 HellService。

    1、服务端

    首先创建一个简单的接口 IHello ,这个接口就只有一个方法 say:

package com.spr.ws.service;


public interface IHello {
	
	public String say(String msg);

}

   然后编写HelloService的服务类 Hello ,实现上面的接口:

package com.spr.ws.service.impl;

import javax.jws.WebService;

import com.spr.ws.service.IHello;

@WebService
public class Hello implements IHello{

	public String say(String msg) {		
		return "Hello "+msg;
	}
	
}

   接着在项目的classpath根目录(工程项目 .classpath 文件所在目录)对服务端代码进行 apt 编译:

E:\etl\webService>apt com/spr/ws/service/impl/Hello.java

    编译的结果是在 com.spr.ws.service.impl 包下生成 jaxws 子包,该包下生成两个源文件:Say.java 和 SayResponse.java。

    最后,编写WebService的服务启动类。这里JDK1.6已经将这个过程提升到了API级别:

package com.spr.ws.soap.server;

import javax.xml.ws.Endpoint;
import javax.xml.ws.soap.SOAPBinding;

import com.spr.ws.service.impl.Hello;

public class SoapServer {

	/**
	 * <b>Summary: </b>
	 *     main(WebService的发布)
	 * @param args 
	 */
	public static void main(String[] args) {
		System.out.println("准备启动WebService服务:http://127.0.0.1:8080/helloService");
		Endpoint endpoint = Endpoint.publish("http://127.0.0.1:8080/helloService",new Hello());
		SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
		binding.setMTOMEnabled(true);
		System.out.println("已成功启动WebService服务:http://127.0.0.1:8080/helloService");
	}

}

    运行之后,打开浏览器,输入 http://127.0.0.1:8080/helloService?wsdl 就能看到WebService的xml结构了。至此,该WebService的服务端基本开发完毕。因为ws基本上是一个远程调用的过程(RMI),所以,关键还是在,客户端该怎么调用。

    2、客户端

    这里的客户端调用,当然还是在JDK1.6自带的环境。首先介绍两个命令:

    a、wsgen(生成WebService服务端文件)

    参数说明(工程根目录):

  •  -cp 定义classpath
  • -r 生成 bean的wsdl文件的存放目录
  • -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
  • -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)
E:\etl\webService>wsgen -cp ./WebRoot/WEB-INF/classes -r ./WebRoot/ws -s ./src -d ./WebRoot/WEB-INF/classes -wsdl com.spr.ws.service.impl.Hello

    运行之后,会将前面开发的服务端java文件,转化成为webservice(HelloService.wsdl 和 HelloService_schema1.xsd)文件,存放在 WebRoot/ws 目录下。

    b、wsimport(一直WebService服务端地址,生成客户端文件,实现本地API式的调用,需要在ws运行的状态下进行)

    参数说明(工程根目录):

  • -d:生成客户端执行类的class文件的存放目录
  • -s:生成客户端执行类的源文件的存放目录
  • -p:定义生成类的包名
E:\etl\webService>wsimport -d ./WebRoot/WEB-INF/classes -s ./src -p [存放客户端代码的包名,如 com.spr.ws.soap.client] -keep [WebService 访问地址,如:http://127.0.0.1:8080/helloService?wsdl]

     运行之后,会在 com.spr.ws.soap.client 包下,生成若干客户端文件。这里才是关键。利用生成的客户端文件我们就可以把远端的WebService当做本地类来使用了。

package com.spr.ws.soap.client;

import com.spr.ws.soap.client.Hello;
import com.spr.ws.soap.client.HelloService;

public class TestHelloClient {

	public static void main(String[] args) {
		Hello hello = new HelloService().getHelloPort();
		System.out.println("----------HelloService.say()-------------");
		String result = hello.say("Web Service");
		System.out.println("result:"+result);
	}

}