Server Side
環境
resin-ee-2.1.16
jdk1.6.0_22
使用 jaxws-ri-2.2.8.zip
WEB-INF/lib/
gmbal-api-only.jar
ha-api.jar
jaxb-core.jar
jaxb-impl.jar
jaxws-api.jar
jaxws-rt.jar
management-api.jar
policy.jar
stax-ex.jar
streambuffer.jar
WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Edited By alubas -->
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<web-app>
WEB-INF/sun-jaxws.xml
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint
name="MyWs"
implementation="ws.MyWsImpl"
url-pattern="/services/MyWs">
</endpoint>
</endpoints>
使用 interface + implement 的組合
WEB-INF/ws/MyWs.java
package ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface MyWs{
@WebMethod String getHelloWorldAsString();
}
WEB-INF/ws/MyWsImpl.java
package ws;
import javax.jws.WebService;
//Service Implementation Bean
@WebService(endpointInterface = "ws.MyWs")
public class MyWsImpl implements MyWs{
@Override
public String getHelloWorldAsString() {
return "Hello World JAX-WS";
}
}
請在 WEB-INF/classes 編譯
[~/WEB-INF/classes]$ javac -cp . ws/MyWs.java
[~/WEB-INF/classes]$ javac -cp . ws/MyWsImpl.java
使用直接實作的方式
package ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
//Service Implementation Bean
@WebService
@SOAPBinding(style = Style.RPC)
public class MyWs{
@WebMethod
public String getHelloWorldAsString() {
return "Hello World JAX-WS";
}
}
請在 WEB-INF/classes 編譯
[~/WEB-INF/classes]$ javac -cp . ws/MyWs.java
可以用瀏覽器
http ://serviceURI/services/MyWs
Client Side
用 tool 把需要的檔案生出來 (在此為 Linux 環境下)
wsimport -p wsClient -keep http : //serviceURI/services/MyWs?wsdl
這裡的 services/MyWs 與 server-side 的 web.xml 和 sun-jaxws.xml 配置有關
相關檔案指定以 package wsClient 的結構生成
WEB-INF/classes/wsClient/MyWs.java
package wsClient;
import javax.jws.WebMethod;
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 = "MyWs", targetNamespace = "http://ws/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface MyWs {
/**
*
* @return
* returns java.lang.String
*/
@WebMethod
@WebResult(partName = "return")
public String getHelloWorldAsString();
}
WEB-INF/classes/wsClient/MyWsImplService.java
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 = "MyWsImplService", targetNamespace = "http://ws/", wsdlLocation = "http://serviceURI/services/MyWs?wsdl")
public class MyWsImplService extends Service{
private final static URL MYWSIMPLSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(wsClient.MyWsImplService.class.getName());
static {
URL url = null;
try {
URL baseUrl;
baseUrl = wsClient.MyWsImplService.class.getResource(".");
url = new URL(baseUrl, "http://serviceURI/services/MyWs?wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'http://serviceURI/services/MyWs?wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
MYWSIMPLSERVICE_WSDL_LOCATION = url;
}
public MyWsImplService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public MyWsImplService() {
super(MYWSIMPLSERVICE_WSDL_LOCATION, new QName("http://ws/", "MyWsImplService"));
}
/**
*
* @return
* returns MyWs
*/
@WebEndpoint(name = "MyWsImplPort")
public MyWs getMyWsImplPort() {
return super.getPort(new QName("http://ws/", "MyWsImplPort"), MyWs.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 MyWs
*/
@WebEndpoint(name = "MyWsImplPort")
public MyWs getMyWsImplPort(WebServiceFeature... features) {
return super.getPort(new QName("http://ws/", "MyWsImplPort"), MyWs.class, features);
}
}
我載了一個 testWS 的 servlet 叫用這個 service
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import wsClient.*;
public class testWS extends HttpServlet{
PrintWriter out;
public void init(ServletConfig conf) throws ServletException{
super.init(conf);
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
out = res.getWriter();
out.print(req.getParameter("doPost"));
}
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
out = res.getWriter();out.print("doGet");
MyWsImplService myWsImplService = new MyWsImplService();
MyWs myWs = myWsImplService.getMyWsImplPort();
out.println(myWs.getHelloWorldAsString() + System.currentTimeMillis());
}
}
可以用瀏覽器確認執行結果
http://URI/servlet/testWS
後記:
在 server 端
如果提供服務的主體沒有 @SOAPBinding(style = Style.RPC) 的宣告
wsimport 預設會以 @SOAPBinding(style = Style.DOCUMENT) 的方式來生成相關檔案