日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaEE5 Jax-ws 学习(Soap webservice)

發布時間:2024/4/17 java 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaEE5 Jax-ws 学习(Soap webservice) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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;
  • /**
  • ?*?@author?birds
  • ?*?@since?Nov?27,?2008?9:20:16?PM
  • ?*/
  • @WebService
  • public?class?HelloQuick?{
  • ????public?HelloQuick()?{
  • ????}
  • ????@WebMethod
  • ????public?String?show()?{
  • ????????return?"SHOW?YOU!";
  • ????}
  • }
  • //?上面的代碼,足夠簡單,?在HelloQuick類上面?,有一個?Annotation修飾?@WebService
  • 這個修飾必須是 javax.jws.WebService?, ?javax.jws.WebServiceProvider 其中一個,
  • 默認構造函數必須有一個。
  • 業務方法 show() 函數上面有一個 @WebMethod修飾,,如果這個函數有參數,就需要增加參數的修飾
  • 比方說: show(@WebParam(name = "msg")?String msg){}? 多了一個參數
  • 知道更多的細節,參考 jax-ws的文檔,
  • ?????? 建立環境 : 這里使用 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?{
  • ????????????//?Parse?the?descriptor?file?and?build?endpoint?infos
  • ????????????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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。