posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          XFire傳入傳出自定義類型和集合類型學習筆記

          Posted on 2008-03-03 11:27 semovy 閱讀(2710) 評論(0)  編輯  收藏 所屬分類: WebService

          工程結構圖

          首先建立一個web工程作為Service端,在classpath中加載XFire Jar包,并編寫web.xml如下

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.4" 
              xmlns
          ="http://java.sun.com/xml/ns/j2ee" 
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee 
              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >
              
              
          <servlet>
                
          <servlet-name>XFire Servlet</servlet-name>
                
          <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
                
          <load-on-startup>0</load-on-startup>
              
          </servlet>
              
          <servlet-mapping>
                
          <servlet-name>XFire Servlet</servlet-name>
                
          <url-pattern>/services/*</url-pattern>
              
          </servlet-mapping>
            
          <welcome-file-list>
              
          <welcome-file>index.jsp</welcome-file>
            
          </welcome-file-list>
          </web-app>

          編寫Service接口:

          package Test;

          import java.util.List;

          public interface IHelloWorldService {
            
          public User HelloWorld(User user); //傳入和返回自定義類型
            public List HelloWorldList(); //返回集合類型
          }

          編寫Service實現類:

          package Test;
          import java.util.ArrayList;
          import java.util.List;
          public class HelloWorldServiceImpl implements IHelloWorldService {

              
          public User HelloWorld(User user) {
                
          if(user.getUsername().equals("gaoxiang")){
                    
          return new User("welcome gaoxiang","1234");
                }

                
          else{
                    
          return new User("wrong name","1234");
                }

              
              }


              
          public List HelloWorldList() {
                  
                  List a
          =new ArrayList();
                  User u1
          =new User("1","1");
                  User u2
          =new User("2","2");
                  User u3
          =new User("3","3");
                  a.add(u1);
                  a.add(u2);
                  a.add(u3);
                  
          return a;
              }


          }

          為返回類型和傳入類型配置aegis映射IHelloWorldService.aegis.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <mappings>
              
          <mapping>
                  
          <method name="HelloWorld">
                      
          <parameter index="0" componentType="Test.User"/>
                  
          </method>
            
                  
          <method name="HelloWorld">
                      
          <return-type componentType="Test.User"/>
                  
          </method>
                  
          <method name="HelloWorldList">
                      
          <return-type componentType="Test.User"/>  <!-- 定義返回集合類型中元素的type -->
                  
          </method>
              
          </mapping>
          </mappings>

          在src目錄下建立META-INF/xfire目錄,并在其編寫service.xml

          <beans>
          <!--  第一種方式配置
          <service xmlns="http://xfire.codehaus.org/config/1.0">
          <name>HelloService</name>
            <namespace>http://xfire.sttudy/HelloService</namespace>
            <serviceClass>Test.IHelloWorldService</serviceClass>
            <implementationClass>Test.HelloWorldServiceImpl</implementationClass>
          </service>
          -->
          <!-- 使用Spring方式配置 -->
          <bean name="HelloService" class="org.codehaus.xfire.spring.ServiceBean">
           
          <property name="serviceBean" ref="echo"/>
           
          <property name="serviceClass" value="Test.IHelloWorldService"/>
          <property name="inHandlers">
          <list>
          <ref bean="addressingHandler"/>
          </list>
          </property>
          </bean>
          <bean id="echo" class="Test.HelloWorldServiceImpl"/>
          <bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler"/>
          </beans>

          User.java

          package Test;

          public class User {
             
          private String username;
             
          private String password;
             
          public User(){
                 
             }

             
          public User(String username,String password){
                 
          this.username=username;
                 
          this.password=password;
                 
             }

          public String getPassword() {
              
          return password;
          }

          public void setPassword(String password) {
              
          this.password = password;
          }

          public String getUsername() {
              
          return username;
          }

          public void setUsername(String username) {
              
          this.username = username;
          }

          }


          測試WSDL:

          http://localhost:8080/XFireStudy/services/IHelloWorldService?wsdl

          新建Client工程

          使用MyEclipse的自動生成Web Service Client功能(file-new-other-myeclipse-web service-web service client)生成Client代碼,需要說明的是,也會生成一個User類,但這個類不是服務端的POJO,而是通過JAXB2綁定的,稍微復雜,讀取方式由原來的getUsername()轉換成getUsername().getValue();因為getUsername()返回的是一個JAXBElement對象

          編寫測試代碼:

          package client;

          import java.util.List;

          import javax.xml.bind.JAXBElement;
          import javax.xml.namespace.QName;

          import test.IHelloWorldServiceClient;
          import test.IHelloWorldServicePortType;
          import test.User;



          public class TestWS {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args) {
                  IHelloWorldServiceClient client
          =new IHelloWorldServiceClient();
                  IHelloWorldServicePortType helloService
          =client.getIHelloWorldServiceHttpPort();
                  
                  
          //構造user對象稍微復雜些,因為使用了JAXB2綁定,其中QName()參數分別是targetNameSpace和property name
                  User user = new User();
                  JAXBElement
          <String> name = new JAXBElement<String>(new
                  QName(
          "http://Test""username"),String.class,"gaoxiang");
                  JAXBElement
          <String> password = new JAXBElement<String>(new
                  QName(
          "http://Test""password"),String.class,"1234");
                  user.setUsername(name);
                  user.setPassword(password);
                  System.out.println(helloService.helloWorld(user).getUsername().getValue());
                  
                  
                  List
          <User> a=helloService.helloWorldList().getUser();
                  
          for(User u1:a){
                      System.out.println(u1.getUsername().getValue());
                  }

              }


          }

          主站蜘蛛池模板: 南皮县| 黔东| 新野县| 高密市| 烟台市| 日喀则市| 辽阳市| 兴化市| 农安县| 称多县| 托克逊县| 黄浦区| 夏河县| 吉首市| 铜山县| 庆阳市| 镇巴县| 尉氏县| 黔东| 九江县| 平安县| 邳州市| 开平市| 苏尼特右旗| 抚宁县| 岳阳县| 清水县| 抚远县| 咸丰县| 家居| 玉林市| 长寿区| 禄劝| 平遥县| 绍兴市| 津南区| 临漳县| 天峻县| 汝阳县| 商都县| 陆良县|