这两天由于工作的某些原因,需要了解一些关于Web Service的知识,然后在网上看到了这么一篇简单的有点略微过时但是对于初次接触Web Service的同学来说又很有必要了解的文章,于是自己尝试着将文章翻译过来。
A. 构造Web服务
1. 构造一个简单的hello类
假设你构造了这样一个类,接受一个字符串输入并且返回另外一个字符串
package waserver;
public class Hello{
public String sayHello(String name){
return "Hello " + name;
}
}
2. 将hello类转变成Web Service
我们可以简单的利用几个注解将这个hello类转换成一个对应的Web Service:
* @WebService— 用来将一个类标记为一个Web服务
* @SOAPBinding(style=SOAPBinding.Style.RPC)—用来标注通信类型,在这里是采用RPC通信
package wsserver
import javax.jwx.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class Hello {
public String sayHello(String name) {
return "Hello " + name;
}
}
3. 发布Hello服务
我们可以利用JDK自带的Endpoint类来发布服务。我们将向该类的public方法提供一个URL以及一个服务类的实例。
package wsserver;
import javax.xml.ws.Endpoint;
public class ServiceStarter {
public static void main(String[] args) {
String url = "http://localhost:1212/hello";
4. 编译代码
我们可以利用简单的Javac命令来编译上面的两个类(即Hello类和ServiceStarter类)
javac -d . *.java
5. 启动服务
我们可以利用下面的Java命令来运行ServiceStarter类,从而启动我们的服务 java wsserver/ServiceStarter
6. 检查服务
现在服务已经成功运行起来了,你可以通过步骤3中的url地址获取到服务的WSDL文件来检查服务是否正确运行。服务的WSDL文件是通过在URL最后添加?wsdl得到的:http://localhost:1212/hello?wsdl.
你得到的WSDL文件与下面所展示的XML文件类似。
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://wsserver/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://wsserver/" name="HelloService">
<types></types>
<message name="sayHello">
<part name="arg0" type="xsd:string"></part>
</message>
<message name="sayHelloResponse">
<part name="return" type="xsd:string"></part>
</message>
<portType name="Hello">
<operation name="sayHello">
<input message="tns:sayHello"></input>
<output message="tns:sayHelloResponse"></output>
</operation>
</portType>
<binding name="HelloPortBinding" type="tns:Hello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>
<operation name="sayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal" namespace="http://wsserver/"></soap:body>
</input>
<output>
<soap:body use="literal" namespace="http://wsserver/"></soap:body>
</output>
</operation>
</binding>
<service name="HelloService">
<port name="HelloPort" binding="tns:HelloPortBinding">
<soap:address location="http://localhost:1212/hello"></soap:address>
</port>
</service>
</definitions>
B. 创建客户端
首先我们需要拥有一个服务类的接口,这样我们才能够通过java代码调用服务类的方法。然后我们需要写一些代码来连接服务。非常幸运的是,如果我们能够提供一个有效的WSDL URL,JDK里面的wsimport命令可以帮助我们完成所有的工作。
1. 导入服务接口和服务客户端构造类
我们可以利用wsimport命令来完成这个目标 wsimport -d . -p wsclient -keep http://localhost:1212/hello?wsdl -p参数指定生成类所在的目录。执行上面这条命令可以生成两个类文件:第一个文件为Hello.java,这个接口包含了我们的sayHello方法。代码如下所示:
package wsclient;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.6 in JDK 6
* Generated source version: 2.1
*
*/
@WebService(name = "Hello", targetNamespace = "http://wsserver/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Hello {
/**
*
* @param arg0
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult(partName = "return")
public String sayHello(
@WebParam(name = "arg0", partName = "arg0")
String arg0);
}
第二个文件为HelloService.java,它包含帮助我们连接我们关注的含有无参构造器的服务以及getHelloPort()方法:
package wsclient;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.1.6 in JDK 6
* Generated source version: 2.1
*
*/
@WebServiceClient(name = "HelloService", targetNamespace = "http://wsserver/", wsdlLocation = "http://localhost:1212/hello?wsdl")
public class HelloService extends Service
{
private final static URL HELLOSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(wsclient.HelloService.class.getName());
static {
URL url = null;
try {
URL baseUrl;
baseUrl = wsclient.HelloService.class.getResource(".");
url = new URL(baseUrl, "http://localhost:1212/hello?wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location:
'http://localhost:1212/hello?wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
HELLOSERVICE_WSDL_LOCATION = url;
}
public HelloService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public HelloService() {
super(HELLOSERVICE_WSDL_LOCATION, new QName("http://wsserver/", "HelloService"));
}
/**
*
* @return
* returns Hello
*/
@WebEndpoint(name = "HelloPort")
public Hello getHelloPort() {
return super.getPort(new QName("http://wsserver/", "HelloPort"), Hello.class);
}
/**
*
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported
* features not in the <code>features</code> parameter will have their default values.
* @return
* returns Hello
*/
@WebEndpoint(name = "HelloPort")
public Hello getHelloPort(WebServiceFeature... features) {
return super.getPort(new QName("http://wsserver/", "HelloPort"), Hello.class, features);
}
}
2. 调用Web服务
现在我们可以通过构造一个HelloService类的实例来调用Web服务了,我们可以通过调用HelloService实例的getHelloPort()方法来获取Hello接口。然后我们可以像调用Java方法一样调用它的方法并获取相应的结果反馈:
package wsclient
public class HelloClient {
public static void main(String[] args) {
HelloService service = new HelloService();
Hello hello = service.getHelloPort();
String text = hello.sayHello("hany");
System.out.println(text);
}
}
3. 编译和运行
javac -d . *.java java wsclient/HelloClient
本文详细介绍如何使用Java快速构建并发布一个简单的WebService,包括添加注解、发布服务、检查WSDL文件,以及如何通过wsimport命令生成客户端代码并调用服务。
1433

被折叠的 条评论
为什么被折叠?



