<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 28,  comments - 13,  trackbacks - 0
    現(xiàn)在的項目中需要用到SOA概念的地方越來越多,最近我接手的一個項目中就提出了這樣的業(yè)務要求,需要在.net開發(fā)的客戶端系統(tǒng)中訪問java開發(fā)的web系統(tǒng),這樣的業(yè)務需求自然需要通過WebService進行信息數(shù)據(jù)的操作。下面就將我們在開發(fā)中摸索的一點經(jīng)驗教訓總結(jié)以下,以供大家參考.

    我們項目的整個架構(gòu)使用的比較流行的WSH MVC組合,即webwork2 + Spring + Hibernate;
    1.首先集成Apacha CXF WebService 到 Spring 框架中;
    apache cxf 下載地址:http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip
    在spring context配置文件中引入以下cxf配置
    	<import resource="classpath*:META-INF/cxf/cxf.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

    在web.xml中添加過濾器:
    	<servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>
    org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
    </servlet-mapping>


    2.開發(fā)服務端WebService接口:
    /**
    * WebService接口定義類.
    *
    * 使用@WebService將接口中的所有方法輸出為Web Service.
    * 可用annotation對設置方法、參數(shù)和返回值在WSDL中的定義.
    */
    @WebService
    public interface WebServiceSample {


    /**
    * 一個簡單的方法,返回一個字符串
    * @param hello
    * @return
    */
    String say(String hello);

    /**
    * 稍微復雜一些的方法,傳遞一個對象給服務端處理
    * @param user
    * @return
    */
    String sayUserName(
    @WebParam(name = "user")
    UserDTO user);

    /**
    * 最復雜的方法,返回一個List封裝的對象集合
    * @return
    */
    public
    @WebResult(partName="o")
    ListObject findUsers();

    }

    由簡單到復雜定義了三個接口,模擬業(yè)務需求;

    3.實現(xiàn)接口
    /**
    * WebService實現(xiàn)類.
    *
    * 使用@WebService指向Interface定義類即可.
    */
    @WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")
    public class WebServiceSampleImpl implements WebServiceSample {

    public String sayUserName(UserDTO user) {
    return "hello "+user.getName();
    }

    public String say(String hello) {
    return "hello "+hello;
    }

    public ListObject findUsers() {
    ArrayList<Object> list = new ArrayList<Object>();

    list.add(instancUser(1,"lib"));
    list.add(instancUser(2,"mld"));
    list.add(instancUser(3,"lq"));
    list.add(instancUser(4,"gj"));
    ListObject o = new ListObject();
    o.setList(list);
    return o;
    }

    private UserDTO instancUser(Integer id,String name){
    UserDTO user = new UserDTO();
    user.setId(id);
    user.setName(name);
    return user;
    }
    }


    4.依賴的兩個類:用戶對象與List對象
    /**
    * Web Service傳輸User信息的DTO.
    *
    * 分離entity類與web service接口間的耦合,隔絕entity類的修改對接口的影響.
    * 使用JAXB 2.0的annotation標注JAVA-XML映射,盡量使用默認約定.
    *
    */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "User")
    public class UserDTO {

    protected Integer id;

    protected String name;

    public Integer getId() {
    return id;
    }

    public void setId(Integer value) {
    id = value;
    }

    public String getName() {
    return name;
    }

    public void setName(String value) {
    name = value;
    }
    }

    關于List對象,參照了有關JWS的一個問題中的描述:DK6.0 自帶的WebService中 WebMethod的參數(shù)好像不能是ArrayList 或者其他List
    傳遞List需要將List 包裝在其他對象內(nèi)部才行 (個人理解 如有不對請指出) ,我在實踐中也遇到了此類問題.通過以下封裝的對象即可以傳遞List對象.
    /**
    * <p>Java class for listObject complex type.
    *
    * <p>The following schema fragment specifies the expected content contained within this class.
    *
    * <pre>
    * <complexType name="listObject">
    * <complexContent>
    * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
    * <sequence>
    * <element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
    * </sequence>
    * </restriction>
    * </complexContent>
    * </complexType>
    * </pre>
    *
    *
    */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "listObject", propOrder = { "list" })
    public class ListObject {

    @XmlElement(nillable = true)
    protected List<Object> list;

    /**
    * Gets the value of the list property.
    *
    * <p>
    * This accessor method returns a reference to the live list,
    * not a snapshot. Therefore any modification you make to the
    * returned list will be present inside the JAXB object.
    * This is why there is not a <CODE>set</CODE> method for the list property.
    *
    * <p>
    * For example, to add a new item, do as follows:
    * <pre>
    * getList().add(newItem);
    * </pre>
    *
    *
    * <p>
    * Objects of the following type(s) are allowed in the list
    * {@link Object }
    *
    *
    */
    public List<Object> getList() {
    if (list == null) {
    list = new ArrayList<Object>();
    }
    return this.list;
    }

    public void setList(ArrayList<Object> list) {
    this.list = list;
    }

    }


    5.WebService 服務端 spring 配置文件 ws-context.xml
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-autowire="byName" default-lazy-init="true">

    <jaxws:endpoint id="webServiceSample"
    address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/>

    </beans>


    WebService 客戶端 spring 配置文件 wsclient-context.xml
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://cxf.apache.org/jaxws
    http://cxf.apache.org/schemas/jaxws.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd"
    default-autowire="byName" default-lazy-init="true">

    <!-- ws client -->
    <bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
    factory-bean="identityValidateServiceClientFactory" factory-method="create" />

    <bean id="identityValidateServiceClientFactory"
    class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
    <property name="serviceClass"
    value="cn.org.coral.admin.service.IdentityValidateService" />
    <property name="address"
    value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
    </bean>

    </beans>

    6.發(fā)布到tomcat服務器以后通過以下地址即可查看自定義的webservice接口生成的wsdl:
    http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl

    7.調(diào)用WebService接口的Junit單元測試程序
    package test.coral.sample;

    import org.springframework.test.AbstractDependencyInjectionSpringContextTests;

    import cn.org.coral.biz.examples.webservice.WebServiceSample;
    import cn.org.coral.biz.examples.webservice.dto.UserDTO;

    public class TestWebServiceSample extends
    AbstractDependencyInjectionSpringContextTests {
    WebServiceSample webServiceSampleClient;

    public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
    this.webServiceSampleClient = webServiceSampleClient;
    }

    @Override
    protected String[] getConfigLocations() {
    setAutowireMode(AUTOWIRE_BY_NAME);
    //spring 客戶端配置文件保存位置
    return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
    }

    public void testWSClinet(){
    Assert.hasText(webServiceSampleClient.say(" world"));
    }
    }

    posted on 2008-03-16 21:40 Lib 閱讀(39143) 評論(5)  編輯  收藏 所屬分類: Java


    FeedBack:
    # Virusnyi Marketing
    2009-05-18 08:18 | Virusnyi Marketing
    Hi everyone. Our deeds determine us, as much as we determine our deeds.
    I am from Vietnam and learning to write in English, give true I wrote the following sentence: "Seo india wildnet technologies is india based seo india company, a seo india company providing cheap seo services in india.Search engine optimization pay per click ppc management post click marketing."

    With respect :P, Kala.  回復  更多評論
      
    # re: WebService開發(fā)筆記 1 -- 利用cxf開發(fā)WebService竟然如此簡單
    2011-08-02 16:14 | 靚女購物街
    最近項目用到CXF做開發(fā),學習下,謝謝  回復  更多評論
      
    # re: WebService開發(fā)筆記 1 -- 利用cxf開發(fā)WebService竟然如此簡單
    2011-11-23 11:04 | wanxkl
    不錯。,謝謝了  回復  更多評論
      
    # re: WebService開發(fā)筆記 1 -- 利用cxf開發(fā)WebService竟然如此簡單
    2012-06-07 16:30 | 鵝鵝鵝
    公司的分公司的  回復  更多評論
      
    # re: WebService開發(fā)筆記 1 -- 利用cxf開發(fā)WebService竟然如此簡單
    2014-12-22 15:05 | sd
    sdasd  回復  更多評論
      
    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910



    我的JavaEye博客
    http://lib.javaeye.com


    常用鏈接

    留言簿(2)

    隨筆分類

    文章分類

    FLASH

    Java

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 韩国免费一级成人毛片| 在线免费观看亚洲| 又爽又高潮的BB视频免费看| 亚洲精品无码国产片| 精品免费久久久久久成人影院| 亚洲熟妇少妇任你躁在线观看| 最近中文字幕无吗高清免费视频| 国产精品亚洲综合久久| 国产成人精品高清免费| 午夜成人无码福利免费视频| 国产成人亚洲精品影院| 成人爽a毛片免费| 亚洲激情校园春色| 成人午夜18免费看| 无人视频免费观看免费视频| 国产亚洲精品自在线观看| 久久免费视频观看| 久久久久精品国产亚洲AV无码| 9久9久女女免费精品视频在线观看| 亚洲国产精品成人精品软件| 久久亚洲精品无码| 亚洲制服丝袜在线播放| 免费99精品国产自在现线| 麻豆最新国产剧情AV原创免费| 色www永久免费| 亚洲另类精品xxxx人妖| 在线观看免费亚洲| 男女一边桶一边摸一边脱视频免费 | 亚洲国产成人高清在线观看| 最近中文字幕无免费| 久久亚洲色WWW成人欧美| 国产亚洲精品无码拍拍拍色欲| 最刺激黄a大片免费网站| 亚洲真人无码永久在线观看| 国产精品亚洲精品日韩已方| 最近2018中文字幕免费视频| 亚洲精品无码成人| 久久噜噜噜久久亚洲va久| 国产极品美女高潮抽搐免费网站| 日韩免费的视频在线观看香蕉| 亚洲一卡一卡二新区无人区|