使用JAX-WS构建Web Services
JAX-WS简写为
Java Api For Xml Web Service。JAX-WS是使用XML构建Web Service与Client进行交流通信的技术。
在
JAX-WS中,Web Service操作调用表现为以XML为基础的协议如SOAP协议。SOAP定义了封装架构,编码规则以及Web Service中调用和回应表现的规则。这些调用和回应在HTTP基础上以SOAP规范的消息进行传递。
尽管
SOAP协议是很复杂的,但是JAX-WS隐藏了开发人员面对的复杂性。在服务器端,开发者可以通过在使用java语言接口中定义方法来制定Web Service。开发者可以编写一个或者多个类来实现这些方法。客户端程序也很容易编写。客户端会创建一个代理(表现服务器端的本地对象)并且简单的调用代理中的方法即可。在JAX-WS中,开发者不必去创建和解析SOAP消息。JAX-WS运行系统会自动完成调用和回应之间SAOP消息的转换。
使用
JAX-WS,客户端和服务器端都有一个很大的优势:java编程语言的平台独立性。此外,JAX-WS并不限制:JAX-WS客户端程序可以访问不运行在java平台上的Web Servicce。这种灵活性是由于Web Service采用了W3C定义的技术规范:Http,SOAP,WSDL。
如何创建一个Web Service和Client并将他们部署。
开发一个
JAX-WS Web Service首先是要定义一个类标示了javax.jws.WebService注释。@WebService注释定义了一个Web Service终端。
Service终端接口或者
Service终端实现(SEI)是一个java接口和类,其中定义了客户端可以调用的方法。建立一个JAX-WS终端时接口并不是必须的。Web Service实现类定义了SEI。
你也可以通过向实现类的
WebService注释中添加endpointInterface 元素来指定外部接口。之后你必须定义一个接口并且将其中需要实现的方法声明为public。
创建Web Service和Client的步骤
1. 编写实现类
2. 编译实现类
3. 添加部署
Web Service必须的文件
4. 打包成
WAR
5. 部署
WAR文件
6. 编写
Client类
7. 产生和编译连接到
Service需要的文件
8. 编译
Client类
9. 运行
Client
JAX-WS
终端要求
² 实现类必须注释为
javax.jws.WebService或者javax.jws.WebServiceProvider。
² 实现类可以参考通过
WebService注释中的endpointInterface元素。但是这不是必须的。如果WebService注释中没有endpointInterface元素的话,SEI会默认的为实现类定义一个。
² 实现类的方法必须是
public,不能使final或者static。
² 被暴露给
Web Service Client的方法必须被注释为javax.jws.WebMethod。
² 实现类不能使
final和abstract。
² 实现类必须有一个默认的构造函数。
² 实现类不能定义
finalize方法。
² 实现类必须在他生命周期回调函数中必须用
javax.annotation.PostConstruct或者javax.annotation.PreDestroy注释。
PostConstruct方法由容器在实现类开始向
Web Service Client做出反应之前调用。
PreDestroy方法由容器在终端移出操作之前调用。
编写Service终端实现类
在这个例子中,实现类
Hello通过@WebService注释被定义为Service终端。Hello中有一个sayHello方法,被注释为@WebMethod。@WebMethod注释向Web Service Client暴露了被注释的方法。sayHello方法向客户段返回一通过参数name进行组装的问候字符串。这个实现类必须有一个默认的声明为public,无参数的构造函数。
package helloservice.endpoint;
import javax.jws.WebService;
@WebService
public class Hello {
private String message = new String("Hello, ");
public void Hello() {}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
简单的JAX-WS客户端
HelloClient是一个可以访问
Hello对象的sayHello方法的独立的客户端程序。这个调用是通过一个本地对象port实现的,当然这个本地对象port是远程Service对象的一个代理。
编写客户端程序
1. 使用
javax.xml.ws.WebServiceRef注释可以声明一个Web Service的参考。@WebServiceRef注释使用wsdlLocation元素指定一个已经部署的Service的wsdl的URI
@WebServiceRef(wsdlLocation="http://localhost:8080/helloservice/hello?wsdl")
2. 找回
Service的代理,看作一个port,这是通过调用Service的一个函数getHelloPort实现的
Hello port = service.getHelloPort();
Port实现了被
service定义的SEI
3. 调用
port的sayHello方法,并传入一个参数name。
String response = port.sayHello(name);
类的实现如下
package simpleclient;
import javax.xml.ws.WebServiceRef;
import helloservice.endpoint.HelloService;
import helloservice.endpoint.Hello;
public class HelloClient {
@WebServiceRef(wsdlLocation = "http://localhost:8080/helloservice/hello?wsdl")
static HelloService service;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
HelloClient client = new HelloClient();
client.doTest(args);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void doTest(String[] args) {
try { // Call Web Service Operation
System.out.println(
"Retrieving the port from the following service: "
+ service);
Hello port = service.getHelloPort();
System.out.println("Invoking the sayHello operation on the port.");
String name;
if (args.length > 0) {
name = args[0];
} else {
name = "No Name";
}
String response = port.sayHello(name);
System.out.println(response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
本文参考
Javaee5官方文档,源码在NetBeans6.0中使用,具体可以在sun官方网站下载,或者和我联系