下面通过一个HelloWorld的例子来看看,JAX-WS 2.0 API的应用过程.程序是客户端传给服务端一个名字,经过服务端处理后,返回到客户端并打印出来.
一. 环境配置.
1. JDK 5.0 下载: http://java.sun.com/j2se/1.5.0/download.jsp
2. Java EE 5.0 App Server.
https://glassfish.dev.java.net/public/downloadsindex.html
本例中测试用了Build 37
下载完毕后请设置一下Path.还有例子中使用的命令对应于Cygwin,如果用Dos或Linux的话,请适当更改相应的形式.
例子中执行中的命令行以E:/jaxws20为基准,在其下面创造相对应的文件夹.
二.编写建立服务端
1. 实现类.
package endpoint;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService()
public class HelloWorld{
//the implementation class must have a default public constructor
public HelloWorld() {};
@WebMethod(operationName="sayHello", action="urn:SayHello")
public String sayHello(String name){
return "Hello "+ name + "!";
}
}
请注意实现类必须标注WebService(),还必须包括一个default public constructor.
2. 编译实现类.
编译前,创造相应文件夹build/classes/service来保存class文件.还请注意命令在同一行.
javac -classpath $GLASSFISH_HOME/lib/javaee.jar -d ./build/classes/service endpoint/HelloWorld.java
3. 生成相应文件
在E:/jaxws20下,执行下面的命令,注意事先生成/build/generated.
$GLASSFISH_HOME/bin/wsgen.bat-cp ./build/classes/service -keep -d ./build/classes/service -r ./build/generated -wsdl endpoint.HelloWorld
通过这个命令,会生成相对应的WSDL文件.
4. 打包
4.1 WEB-INF`结构准备
WEB-INF/classes/
WEB-INF/wsdl/
4.2 Web.xml
在WEB-INF/下,编写下面的文件.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<description>HelloWorld Service</description>
<display-name>HelloWorldWAR</display-name>
<servlet>
<description>Endpoint for HelloWorld Web Service</description>
<display-name>HelloWorldWebService</display-name>
<servlet-name>HelloWorldPort</servlet-name>
<servlet-class>endpoint.HelloWorld</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldPort</servlet-name>
<url-pattern>/HelloWorldService</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
4.3 拷贝文件
cp -r build/classes/service/endpoint ./WEB-INF/classes/
cp build/generated/* archive/WEB-INF/wsdl/
4.4打包
jar cvf helloworld-webservice.war WEB-INF/
5. 配置
先启动服务器,
asadmin.bat start-domain domain1
配置到服务器中,
asadmin.bat deploy --user admin --password adminadmin --host localhost --port 4848 --contextroot helloworld-webservice --upload=true --target server helloworld-webservice.war
三. 客户端
1. 客户端类.
在client/下,
package client;
import javax.xml.ws.WebServiceRef;
import endpoint.HelloWorldService;
import endpoint.HelloWorld;
public class WSClient{
@WebServiceRef(wsdlLocation=
"http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL")
static HelloWorldService service;
public static void main(String[] args){
try{
WSClient client = new WSClient();
client.callEndpoint(args[0]);
}catch(Exception e){
e.printStackTrace();
}
}
public void callEndpoint(String name){
try{
HelloWorld port = service.getHelloWorldPort();
System.out.println(port.sayHello(name));
}catch(Exception e){
e.printStackTrace();
}
}
}
2. 生成相关文件
在编译客户端类之前, 需要从服务端公开中的WSDL生成相关的文件.
wsimport.bat -keep -d ./build/classes/client http://localhost:8080/helloworld-webservice/HelloWorldService?WSDL
3. 编译客户端类
javac-d ./build/classes/client -classpath $GLASSFISH_HOME/lib/javaee.jar/;$GLASSFISH_HOME/lib/appserv-ws.jar/;./build/classes/client client/WSClient.java
四. 执行
在build/classes/client/下,
appclient.bat -mainclass client.WSClient Duke
你会看到如下反馈
Hello Duke!