使用JAX-WS构建Web Services

2022-09-14 09:21:16 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

使用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官方网站下载

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159707.html原文链接:https://javaforall.cn

0 人点赞