http://blog.csdn.net/birdsaction/article/details/3408350
JavaEE 5 相比 j2ee 1.4有了很大的改進,最大的是減少 XML繁雜的配置,增加了JavaSE 5.0 中 Annotation, EJB ,WebServices 都簡化了不少.
我們使用JAX-WS建立一個簡單的 WEB 服務 ,建立業務邏輯代碼 ,就是暴露給客戶的 服務的代碼.
到這里下載 JAX-WS 2.0的 包: https://jax-ws.dev.java.net/
package?com.birds.ws;import?javax.jws.WebMethod;import?javax.jws.WebService;@WebServicepublic?class?HelloQuick?{????public?HelloQuick()?{????}????@WebMethod????public?String?show()?{????????return?"SHOW?YOU!";????}}
?????? 建立環境 : 這里使用 Tomcat 6.0
????? ?需要編寫 配置 webapps/jaxws2/WEB-INF/Web.xml
??????
<?xml?version="1.0"?encoding="UTF-8"?><web-app?version="2.5"?????xmlns="http://java.sun.com/xml/ns/javaee"?????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?????http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??<listener>?????<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>??</listener>????<servlet>?????<servlet-name>fish</servlet-name>?????<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>??</servlet>????<servlet-mapping>?????<servlet-name>fish</servlet-name>?????<url-pattern>/quick</url-pattern>??</servlet-mapping>??????<welcome-file-list>????<welcome-file>index.jsp</welcome-file>??</welcome-file-list></web-app>
???????????? WSServletContextListener ,和 WSServlet 都是 系統運行需要的配置,
???????????? 還需要建立一個 sun-jaxws.xml?
????????????
?
<?xml?version="1.0"?encoding="UTF-8"?><endpoints?xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'????version='2.0'>????<endpoint?name='fish'?implementation='com.birds.ws.HelloQuick'????????url-pattern='/quick'?/></endpoints><!--???endpoint?一個端點,代表了一個服務,??name?=?fish??url-pattern="/quick"?-->
?????????? 下面是? com.sun.xml.ws.transport.http.servlet.WSServletContextListener 加載/WEB-INF/sun-jaxws.xml
??????????? 是 jax-ws 的源代碼。
?try?{????????????????????????DeploymentDescriptorParser<ServletAdapter>?parser?=?new?DeploymentDescriptorParser<ServletAdapter>(????????????????classLoader,new?ServletResourceLoader(context),?createContainer(context),?new?ServletAdapterList());????????????URL?sunJaxWsXml?=?context.getResource(JAXWS_RI_RUNTIME);????????????if(sunJaxWsXml==null)????????????????throw?new?WebServiceException(WsservletMessages.NO_SUNJAXWS_XML(JAXWS_RI_RUNTIME));????????????List<ServletAdapter>?adapters?=?parser.parse(sunJaxWsXml.toExternalForm(),?sunJaxWsXml.openStream());????????????delegate?=?createDelegate(adapters,?context);????????????context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);????????????????????}?catch?(Throwable?e)?{????????????logger.log(Level.SEVERE,????????????????WsservletMessages.LISTENER_PARSING_FAILED(e),e);????????????context.removeAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO);????????????throw?new?WSServletException("listener.parsingFailed",?e);????????}?// JAXWS_RI_RUNTIME 為? /WEB-INF/sun-jaxws.xml? 這個監聽器 主要是 解析 endpoints ,?delegate = createDelegate(adapters, context);? context.setAttribute(WSServlet.JAXWS_RI_RUNTIME_INFO,delegate);?這兩行代碼? 把解析的 endpoint 結果 放入 session中 ,給后面的 WSServlet使用,?下面是? com.sun.xml.ws.transport.http.servlet.WSServlet 部分源代碼.public void init(ServletConfig servletConfig) throws ServletException {
??????? super.init(servletConfig);
??????? delegate = getDelegate(servletConfig);
??? }// 這個地方就是取出 上面監聽器 解析sun-jaxws.xml 結果,delegate? 這個是 主要處理大部分邏輯的代碼 ,是 WSServletDelegate類看 WSServelt 的doPost方法,將會調用protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException {
??????? if (delegate != null) {
??????????? delegate.doPost(request,response,getServletContext());
??????? }
??? }這里便會訪問到 WSServletDelegate 的doPost方法?ServletAdapter target = getTarget(request);
??????????? if (target != null) {
??????????????? if (logger.isLoggable(Level.FINEST)) {
??????????????????? logger.finest(
??????????????????????? WsservletMessages.SERVLET_TRACE_GOT_REQUEST_FOR_ENDPOINT(target.name));
??????????????? }
??????????????? target.handle(context, request, response);
??????????? } else {
??????????????? Localizer localizer = getLocalizerFor(request);
??????????????? writeNotFoundErrorPage(localizer, response, "Invalid Request");
}這部分代碼 開始處理請求 并且生成WSDL服務當tomcat啟動成功后 在瀏覽器中輸入 http://localhost:8080/jaxws2/quick?wsdl將會顯示 WSDL xml服務結果.
<definitions?targetNamespace="http://ws.birds.com/"?name="HelloQuickService">?????<types>?????<xsd:schema><xsd:import?namespace="http://ws.birds.com/"?schemaLocation="http://localhost:8080/jaxws2/quick?xsd=1"/></xsd:schema></types>?????<message?name="show"><part?name="parameters"?element="tns:show"/></message>?????<message?name="showResponse"><part?name="parameters"?element="tns:showResponse"/></message>?????<portType?name="HelloQuick">?????<operation?name="show"><input?message="tns:show"/><output?message="tns:showResponse"/></operation></portType>?????<binding?name="HelloQuickPortBinding"?type="tns:HelloQuick"><soap:binding?transport="http://schemas.xmlsoap.org/soap/http"?style="document"/>?????<operation?name="show"><soap:operation?soapAction=""/>?????<input><soap:body?use="literal"/></input>?????<output><soap:body?use="literal"/></output></operation></binding>????<service?name="HelloQuickService">????<port?name="HelloQuickPort"?binding="tns:HelloQuickPortBinding"><soap:address?location="http://localhost:8080/jaxws2/quick"/></port></service></definitions>
??????????? 上面的tomcat 6.0可能啟動有錯誤 ,,這個需要把jax-ws 需要的幾個包復制到 tomcat6.0/endorsed 目錄下,這個目錄原本沒有,需要自己創建,主要是覆蓋java虛擬機默認的 加載jaxb-api.jar ,
可以看看 http://java.sun.com/j2se/1.5.0/docs/guide/standards/index.html?,
如果不是用tomcat做服務發布的話, 用普通的java命令的話 需要在java安裝目錄下 建立 這個endorsed目錄,把jar包放到下面,
jdk1.5 把叫做 "?Endorsed Standards Override Mechanism ".
?
// 下面是 客戶端代碼 ,用來調用創建好的服務
// 用 jdk提供的 wsimport 的命令 來生成 對應的客戶端服務代碼,,也可以自己編寫,如果你很清楚 jax-ws的機制。
wsimport -p com.birds.ws.myclient.HelloServices http://localhost:8080/jaxws2/quick?wsdl
-p 選項是 可以幫你生成包名.
?生成了六個文件
HelloQuick.class, HelloQuickService.class,ObjectFactory.class,package-info.class
Show.class, ShowResponse.class
如果想看到源代碼 可以加上 -keep 選項,
以上就可以方面的創建 客戶端服務代碼,不用自己手工編寫 下面就很容易的調用。public static void main(String[] args) {HelloQuickService HelloQuickService = new HelloQuickService();HelloQuick quick = HelloQuickService.getHelloQuickPort();System.out.println(quick.show());}這樣就是一個簡單的jax-ws 應用。
?
?
=========================================
http://piggy.iteye.com/blog/322585
前面一篇《jbossws快速入門》指出,使用jax-ws開發web service難度大大減低。本文再以Metro為示例,寫一個簡短的教程。
注:Metro,是GlassFish服務器的子項目,大家可以瀏覽jax-ws參考實現了解更多的信息。
Web Service EndPoint
Java代碼
?
package?helloservice;??? ???? ??@javax.jws.WebService(??? ??????????serviceName="HelloService",???? ??????????name="Hello",??? ??????????targetNamespace="http://www.jboss.org/example")??? ??public?class?HelloBean?{ ??????private?String?message?=?new?String("Hello,?");??? ???? ??????@javax.jws.WebMethod??? ??????public?String?sayHello(String?name)?{??? ??????????return?message?+?name?+?".";??? ??????}??? ??}????
package helloservice; @javax.jws.WebService( serviceName="HelloService", name="Hello", targetNamespace="http://www.jboss.org/example")
public class HelloBean {private String message = new String("Hello, "); @javax.jws.WebMethod public String sayHello(String name) { return message + name + "."; }
}
Deploy Web Service
在部署文件web.xml里加入監聽器及適配器。
Xml代碼
?
<listener>??????<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>??</listener>??<servlet>??????<servlet-name>HelloService</servlet-name>??????<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>??</servlet>??<servlet-mapping>??????<servlet-name>HelloService</servlet-name>??????<url-pattern>/hello</url-pattern>??</servlet-mapping>??
<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet><servlet-name>HelloService</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>HelloService</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>
還需要在部署文件sun-jaxws.xml描述EndPoint。
Xml代碼
?
<?xml?version="1.0"?encoding="UTF-8"?>??<endpoints?xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'?version='2.0'>????<endpoint??????name='HelloService'??????implementation='helloservice.HelloBean'??????url-pattern='/hello'/>??</endpoints>??
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'><endpointname='HelloService'implementation='helloservice.HelloBean'url-pattern='/hello'/>
</endpoints>
如果沒有配置,無法使用/hello進行訪問,但可以用HelloService?wsdl進行訪問到,這是適配器的作用。
總結
以上是生活随笔為你收集整理的JavaEE5 Jax-ws 学习(Soap webservice)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。