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);
}
}