使用CXF來發布WebService

                  Apache CXF提供方便的Spring整合方法,可以通過注解、Spring標簽式配置來暴露Web Services和消費Web Services。

                  @WebService和@WebMethod是WSDL映射Annotation.這些Annotation將描述Web Service的WSDL文檔元素和JAVA源代碼聯系在一起。@SOAPBinding是一個綁定的annotation,用來說明網絡協議和格式

                  1、@WebService annotation的元素name,serviceName和targetNamespace成員用來描述wsdl:protType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。

                  2、@SOAPBinding是一個用來描述SOAP格式和RPC的協議的綁定Annotation.

                 3、@WebMethod Annotation的operationName成員描述了wsdl:operation,而且它的操作描述了WSDL文件中的SOAPAction頭部,這是客戶端必須要放入到SOAPHeader中的數值,SOAP1.1中的一種約束。

                  4、@WebParam Annotation的partName成員描述了WSDL文檔中的wsdl:part.

                  5、@WebResult Annotation的partName成員描述了wsdl:part用來返回WSDL文檔的值。

                  接下來通過一個實例來講解CXF的使用方法。

                  首先請下載最新版本的CXF下載地址是http://cxf.apache.org/

                   下載好了cxf后請設置好CXF_HOME的路徑和JAVA_HOME一樣,并在path中加入路徑,進入cmd后直接輸入cxf version可以看見版本號代表設置成功

                  在eclipse中新建一個web項目,開始我們的CXF之旅吧

                  在web項目中,個人感覺web.xml是骨架,是提綱,是一切之根本,所以請打開這個文件吧,在這里將加入我們的CXF的Servlet

           1    <!-- Spring ApplicationContext配置文件的路徑,可使用通配符,多個路徑用,號分隔
           2        此參數用于后面的Spring Context Loader -->
           3    <context-param>
           4        <param-name>contextConfigLocation</param-name>
           5        <param-value>classpath*:spring/applicationContext*.xml</param-value>
           6    </context-param>
           7
           8    <!--Spring ApplicationContext 載入 -->
           9    <listener>
          10        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          11    </listener>
          12    <!-- Spring 刷新Introspector防止內存泄露 -->
          13    <listener>
          14        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
          15    </listener>
          16
          17    <!-- CXF 配置 -->
          18    <servlet>
          19        <servlet-name>CXFServlet</servlet-name>
          20        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
          21    </servlet>
          22    <servlet-mapping>
          23        <servlet-name>CXFServlet</servlet-name>
          24        <url-pattern>/ws/*</url-pattern>
          25    </servlet-mapping>

           

                  在WEB-INF/lib中加入CXF的jar包。

                  在src/spring/中添加applicationContext-webservice.xml

                  內容如下

           1<?xml version="1.0" encoding="UTF-8"?>
           2<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           3    xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
           4    xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
           5    default-lazy-init="true">
           6
           7    <description>Apache CXF的Web Service配置</description>
           8
           9    <import resource="classpath:META-INF/cxf/cxf.xml" />
          10    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
          11    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
          12
          13    <!-- jax-ws endpoint定義  -->
          14    <jaxws:endpoint address="/tracedatasender"><!-- 你的webservice訪問路徑  -->
          15        <jaxws:implementor ref="traceDataSenderService" /><!--你要發布的service-->
          16    </jaxws:endpoint>
          17
          18    <!-- WebService的實現Bean定義 -->
          19    <bean id="traceDataSenderService" class="com.xxx.ws.impl.TraceDataSenderImpl" />
          20
          21
          22</beans>

                  對于CXF來說返回的結果是不支持集合的,如果你想返回集合,你必須要在包裝一次,只能返回一個對象,里面可以有集合屬性,這個太不好了。

                  好了,我們接下來只要實現我們的Service就好了我們去看看com.xxx.ws.impl.TraceDataSenderImpl吧

                 

           1/**
           2  2        大家請看聲明的定義
           3  3         serviceName聲明了service的名稱
           4  4         portName聲明了端口名稱
           5  5         endpointInterface聲明了接口ITraceDataSender
           6  6         targetNamespace聲明了訪問根路徑
           7  7         實現的方法很簡單就是插入數據到數據庫中
           8  8         數據是TraceData 
           9  9*/

          10 10@WebService(serviceName = "TraceDataSenderService", portName = "TraceDataSenderServicePort", endpointInterface = "com.xxx.ws.ITraceDataSender", targetNamespace = "http://localhost:8080/tracesender")
          11 11public class TraceDataSenderImpl implements ITraceDataSender {
          12 12public final String TASK_ID="2000001";
          13 13    public void addTraceDate(TraceData traceData) {
          14 14        // TODO Auto-generated method stub
          15 15        MyDBAccess dba = new MyDBAccess();
          16 16        dba.open();
          17 17        String tbn = "data_daily_"+this.getNow("yyyyMMdd");
          18 18        
          19 19         dba.update("INSERT INTO `"+tbn+"`(task_id,srcobject,destiobject," +
          20 20                "instance,stringvalue,ts,min,comment) VALUES("+TASK_ID+",'"+traceData.getArea()+
          21 21                "','"+traceData.getDestdesc()+"','"+traceData.getSrcFlag()+"','"+
          22 22                traceData.getDest()+"','"+traceData.getTs()+"',"+traceData.getIsReach()+
          23 23                ",'"+traceData.getTraceips()+"')");
          24 24        AddTraceResult result = new AddTraceResult();
          25 25        result.setSuccess(success);
          26 26        dba.close();
          28 28    }

          29 29}

           

                  涉及接口包括ITraceDataSender和數據TraceData,請看ITraceDataSender

          11/** *//**
          22 在這里定義好service的方法并聲明webservice相關信息
          33*/

          44@WebService(name = "TraceDataSenderService", targetNamespace = "http://localhost:8080/trancesender")
          55public interface ITraceDataSender {
          66 public AddTraceResult addTraceDate(TraceData traceData);
          77}

                  接下來是TraceData

           1
           2
           3import javax.xml.bind.annotation.XmlType;
           4
           5@XmlType(name = "TraceData", namespace = "http://localhost:8080/tracesender")
           6public class TraceData {
           7    String area;        
           8    String srcFlag;
           9    String dest;
          10    String destdesc;
          11    String traceips;
          12    String ts;
          13    String isReach;
          14    /**
          15     * 區域-運營商 對應srcobject
          16     * @return
          17     */

          18    public String getArea() {
          19        return area;
          20    }

          21    public void setArea(String area) {
          22        this.area = area;
          23    }

          24    /**
          25     * 運營商標記 對應instance
          26     * @return
          27     */

          28    public String getSrcFlag() {
          29        return srcFlag;
          30    }

          31    public void setSrcFlag(String srcFlag) {
          32        this.srcFlag = srcFlag;
          33    }

          34    /**
          35     * 目的地域名對應stringvalue
          36     * @return
          37     */

          38    public String getDest() {
          39        return dest;
          40    }

          41    public void setDest(String dest) {
          42        this.dest = dest;
          43    }

          44    /**
          45     * 目的地中文描述destobject
          46     * @return
          47     */

          48    public String getDestdesc() {
          49        return destdesc;
          50    }

          51    public void setDestdesc(String destdesc) {
          52        this.destdesc = destdesc;
          53    }

          54    /**
          55     * Trace IP列表格式ip地址(時間),ip地址(時間)
          56     * @return
          57     */

          58    public String getTraceips() {
          59        return traceips;
          60    }

          61    public void setTraceips(String traceips) {
          62        this.traceips = traceips;
          63    }

          64    /**
          65     * 測試時間對應ts格式yyyy-MM-dd HH:mm:ss
          66     * @return
          67     */

          68    public String getTs() {
          69        return ts;
          70    }

          71    public void setTs(String ts) {
          72        this.ts = ts;
          73    }

          74    /**
          75     * 是否可達對應min
          76     * @return
          77     */

          78    public String getIsReach() {
          79        return isReach;
          80    }

          81    public void setIsReach(String isReach) {
          82        this.isReach = isReach;
          83    }

          84    
          85
          86    
          87}

                  一個最簡單的webservice就可以發布了,啟動tomcat訪問http://localhost:8080/trancesender/ws/就能看到相關信息了,客戶端可以由CXF提供的工具自動生成。

           

                  打開命令行輸入如下信息 wsdl2java.bat -client -b build-client-binding.xml -exsh true http://localhost:8080/tracesender/ws/tracedatasender?wsdl 請確保你有了build-client-binding.xml 這個文件,此文件內容如下

          1<jaxws:bindings wsdlLocation="http://localhost:8080/tracesender/ws/tracedatasender?wsdl"
          2          xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
          3          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          4          xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
          5          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
          6  <jaxws:bindings  node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://localhost:8080/tracesender']">
          7  </jaxws:bindings>
          8</jaxws:bindings>

           

           




          posted on 2011-04-09 13:18 Cloud kensin 閱讀(3724) 評論(0)  編輯  收藏 所屬分類: Java

          <2011年4月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          相冊

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 长岛县| 无棣县| 枞阳县| 合江县| 庄浪县| 吴忠市| 松溪县| 榆社县| 临泽县| 巴彦淖尔市| 鸡东县| 台南市| 崇明县| 武夷山市| 那坡县| 阳西县| 宁津县| 宜川县| 潼南县| 南召县| 象州县| 石首市| 兴安盟| 华池县| 广东省| 南召县| 奉化市| 玛多县| 桂阳县| 临泉县| 武威市| 静安区| 中方县| 贡觉县| 南宫市| 武宁县| 上犹县| 资源县| 青浦区| 辉县市| 锦屏县|