axis1.4發佈返回複雜類型的webservice服務+代碼訪問+客戶端訪問

本文轉載自:http://blog.csdn.net/bestcxx/article/details/52434817

如果還沒有接觸過axis,可以先看入門文章

axis1-myeclipse/eclipse-入門級別-資源、流程、常見問題


0、首先在myeclipse中新建一個web項目 webserviceAxis1



1、爲項目 webserviceAxis1 引入 axis1 必須的幾個jar包



2、創建實體類 TheUser.java  注意需要序列化即實現接口Serializable,這對於在webservice 中傳遞實體類型是必須的


TheUser.java 的內容如下

[java] view plain copy
  1. package com.demo.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class TheUser implements Serializable {  
  6.   
  7.     /** 
  8.      * 提供序列化編號,遠程調用時要用到 
  9.      */  
  10.     private static final long serialVersionUID = -971720598087640397L;  
  11.   
  12.     private String username;  
  13.     private int age;  
  14.     public String getUsername() {  
  15.         return username;  
  16.     }  
  17.     public void setUsername(String username) {  
  18.         this.username = username;  
  19.     }  
  20.     public int getAge() {  
  21.         return age;  
  22.     }  
  23.     public void setAge(int age) {  
  24.         this.age = age;  
  25.     }  
  26.     @Override  
  27.     public String toString() {  
  28.         // TODO Auto-generated method stub  
  29.         return "username="+username+" ;age="+age;  
  30.     }  
  31.   
  32. }  

3、然後是編寫webservice要發佈的方法所在的類 TheUserWsddAction.java



TheUserWsddAction.java 的代碼如下:

[java] view plain copy
  1. package com.demo.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.LinkedHashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.xml.registry.infomodel.User;  
  9.   
  10. import com.demo.model.TheUser;  
  11.   
  12.   
  13. /** 
  14.  * 提供webservice方法 
  15.  * 將操作各種複雜的數據類型 
  16.  * @author WuJieJecket 
  17.  * 
  18.  */  
  19. public class TheUserWsddAction {  
  20.     /** 
  21.      * 提供一個簡單類型的方法,便於比對 
  22.      * @param username 
  23.      * @return 
  24.      */  
  25.     public String getEasyEg(String username){  
  26.         return "You write "+username;  
  27.     }  
  28.   
  29.       
  30.     /** 
  31.      * webservice中僅返回一個實體類型 
  32.      * @param username 
  33.      * @param age 
  34.      * @return TheUser 
  35.      */  
  36.     public TheUser getTheUser(String username,int age){  
  37.         TheUser theu=new TheUser();  
  38.         theu.setUsername(username);  
  39.         theu.setAge(age);  
  40.         return theu;  
  41.           
  42.     }  
  43.       
  44.     /** 
  45.      * webservice中返回 List<TheUser> 類型 
  46.      * @param username 
  47.      * @param length 
  48.      * @return List TheUser 
  49.      */  
  50.     public List<TheUser> getTheUserList(String username,int size){  
  51.         List<TheUser> theuserlist=new ArrayList<TheUser>();  
  52.           
  53.         for(int i=0;i<size;i++){  
  54.             TheUser tuser=new TheUser();  
  55.             tuser.setUsername(username+size);  
  56.             tuser.setAge(i);  
  57.               
  58.             theuserlist.add(tuser);  
  59.         }  
  60.           
  61.         return theuserlist;  
  62.           
  63.     }  
  64.   
  65.     /** 
  66.      * webservice中返回 User[]數據 類型 
  67.      * @param username 
  68.      * @param length 
  69.      * @return User[] 
  70.      */  
  71.     public TheUser[] getTheUserGroup(String username,int length){  
  72.         TheUser[] usergroups =new TheUser[length];  
  73.         for(int i=0;i<length;i++){  
  74.             TheUser tuser=new TheUser();  
  75.             tuser.setUsername(username+length);  
  76.             tuser.setAge(i);  
  77.             usergroups[i]=(TheUser) tuser;  
  78.         }  
  79.         return usergroups;  
  80.           
  81.     }  
  82.       
  83.     /** 
  84.      * webservice中返回 Map<String,TheUser>數據 類型 
  85.      * @return 
  86.      */  
  87.     public Map<String,TheUser> getTheUserMap(){  
  88.         Map<String, TheUser> theusermap=new LinkedHashMap<String, TheUser>();  
  89.         TheUser tusera=new TheUser();  
  90.         TheUser tuserb=new TheUser();  
  91.           
  92.         tusera.setAge(20);  
  93.         tuserb.setAge(20);  
  94.           
  95.         tusera.setUsername("namea");  
  96.         tuserb.setUsername("nameb");  
  97.           
  98.         theusermap.put("tusera", tusera);  
  99.         theusermap.put("tuserb", tuserb);  
  100.         return theusermap;  
  101.           
  102.     }  
  103. }  

4、爲了把webservice服務發佈出去,我們需要修改項目的web.xml 的內容,具體參考

http://blog.csdn.net/bestcxx/article/details/52300248 中的

    8、在自己的項目中使用WSDD方式發佈webservice服務,如其所言


如果你還記得axis 這個項目,把他的web.xml文件找出來,複製裏面的內容,替換掉helloworldweb.xml (頭部可以保留編碼格式<?xml version="1.0" encoding="UTF-8"?>,內部的AdminServlet可以註釋掉,儘管沒有啥影響)

這裏我把我的項目的文件貼出來,如果你看的看上面的文章,可以直接複製粘貼到你的web.xml文件中

[html] view plain copy
  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2.   
  3. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web  
  4. Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">  
  5.   
  6. <web-app>  
  7.   <display-name>Apache-Axis</display-name>  
  8.       
  9.     <listener>  
  10.         <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>  
  11.     </listener>  
  12.       
  13.   <servlet>  
  14.     <servlet-name>AxisServlet</servlet-name>  
  15.     <display-name>Apache-Axis Servlet</display-name>  
  16.     <servlet-class>  
  17.         org.apache.axis.transport.http.AxisServlet  
  18.     </servlet-class>  
  19.   </servlet>  
  20.   
  21.    
  22.   
  23.   <servlet>  
  24.     <servlet-name>SOAPMonitorService</servlet-name>  
  25.     <display-name>SOAPMonitorService</display-name>  
  26.     <servlet-class>  
  27.         org.apache.axis.monitor.SOAPMonitorService  
  28.     </servlet-class>  
  29.     <init-param>  
  30.       <param-name>SOAPMonitorPort</param-name>  
  31.       <param-value>5001</param-value>  
  32.     </init-param>  
  33.     <load-on-startup>100</load-on-startup>  
  34.   </servlet>  
  35.   
  36.   <servlet-mapping>  
  37.     <servlet-name>AxisServlet</servlet-name>  
  38.     <url-pattern>/servlet/AxisServlet</url-pattern>  
  39.   </servlet-mapping>  
  40.   
  41.   <servlet-mapping>  
  42.     <servlet-name>AxisServlet</servlet-name>  
  43.     <url-pattern>*.jws</url-pattern>  
  44.   </servlet-mapping>  
  45.   
  46.   <servlet-mapping>  
  47.     <servlet-name>AxisServlet</servlet-name>  
  48.     <url-pattern>/services/*</url-pattern>  
  49.   </servlet-mapping>  
  50.   
  51.   <servlet-mapping>  
  52.     <servlet-name>SOAPMonitorService</servlet-name>  
  53.     <url-pattern>/SOAPMonitor</url-pattern>  
  54.   </servlet-mapping>  
  55.   
  56.  <!-- uncomment this if you want the admin servlet -->  
  57.    
  58.    
  59.    
  60.   
  61.     <session-config>  
  62.         <!-- Default to 5 minute session timeouts -->  
  63.         <session-timeout>5</session-timeout>  
  64.     </session-config>  
  65.   
  66.     <!-- currently the W3C havent settled on a media type for WSDL;  
  67.     http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft  
  68.     for now we go with the basic 'it's XML' response -->  
  69.   <mime-mapping>  
  70.     <extension>wsdl</extension>  
  71.      <mime-type>text/xml</mime-type>  
  72.   </mime-mapping>  
  73.     
  74.   
  75.   <mime-mapping>  
  76.     <extension>xsd</extension>  
  77.     <mime-type>text/xml</mime-type>  
  78.   </mime-mapping>  
  79.   
  80.   <welcome-file-list id="WelcomeFileList">  
  81.     <welcome-file>index.jsp</welcome-file>  
  82.     <welcome-file>index.html</welcome-file>  
  83.     <welcome-file>index.jws</welcome-file>  
  84.   </welcome-file-list>  
  85.   
  86. </web-app>  

5、編寫 wsdd 文件,目錄是WEB-INF 目錄下


其實只需要一個加載服務的wsdd和一個去處服務的wsdd即可,我這裏有4個是自己做其他實驗用的(名字什麼不重要,必須是wsdd結尾)。

我做的一個實驗是看在一個wsdd文件中是否可以同時發佈兩個service方法,所以添加了一個HelloWorldWSDD.java


HelloWorldWSDD.java 的內容如下

[java] view plain copy
  1. package com.demo.action;  
  2.   
  3. /** 
  4.  * Axis1 
  5.  * WSDD發佈webservice 測試 
  6.  * @author WuJieJecket 
  7.  * 
  8.  */  
  9. public class HelloWorldWSDD {  
  10.   
  11.     /** 
  12.      * 方法1 
  13.      * param String name 
  14.      * return "your name is "+name 
  15.      */  
  16.     public String getName(String name){  
  17.         return "Your name is "+name;  
  18.     }  
  19.       
  20.     /** 
  21.      * 方法2 
  22.      * param int age 
  23.      * return age+10 
  24.      */  
  25.     public int getAge(int age){  
  26.         return 10+age;  
  27.     }  
  28.       
  29. }  

然後是wsdd 文件

deployall.wsdd

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/"  
  3.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  4.     <service name="HelloWorldWSDD" provider="java:RPC">  
  5.         <parameter name="className" value="com.demo.action.HelloWorldWSDD" />  
  6.         <!-- 指定方法名暴露 -->  
  7.         <parameter name="allowedMethods" value="getName" />  
  8.         <parameter name="scope" value="request" />  
  9.     </service>  
  10.     <service name="TheUserWsddAction" provider="java:RPC">  
  11.         <parameter name="className" value="com.demo.action.TheUserWsddAction" />  
  12.         <!-- * 代表所有的方法都暴露 -->  
  13.         <parameter name="allowedMethods" value="*" />  
  14.         <parameter name="scope" value="request" />  
  15.          <!-- 這裏的urn:TheUser和new QName("urn:TheUser", "TheUser")這裏是對應的 -->  
  16.         <beanMapping qname="myNSD:TheUser" xmlns:myNSD="urn:TheUser" languageSpecificType="java:com.demo.model.TheUser"/>  
  17.     </service>  
  18. </deployment>  

undeploy.wsdd

[html] view plain copy
  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">  
  2.     <service name="HelloWorldWSDD"/>  
  3.     <service name="TheUserWsddAction"/>  
  4. </undeployment>  

6、啓動服務,爲了更爲真實的實現那種效果,我把目前的項目打了war包,丟到了本地的tomcat服務器



然後在DOS環境中執行wsdd服務加載的命令-注意項目名和端口號

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/webserviceAxis1/servlet/AxisServlet deployall.wsdd



然後訪問一下,看發佈是否成功

http://localhost:8080/webserviceAxis1/services

如下就成功了


7.生成客戶端代碼,還是再DOS環境下運行

D:\tomcat7\webapps\webserviceAxis1\WEB-INF>Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java http://localhost:8080/webserviceAxis1/services/TheUserWsddAction?wsdl




8、將客戶端代碼複製到另外的一個項目中,同時需要引入那8個jar包


你會發現,相較而言,多了一個TheUser.java 當然這個類的位置你是可以自己決定的

因爲本次發佈的webservice方法含有複雜的返回類型


然後對代碼做一點更改,即報錯的地方有兩種

一個是 TheUser_pkg.TheUser 改爲TheUser

另一個是org.apache.xml.xml_soap.MapItem.class;改爲  Map.class


9.最後是測試類

TheAxis1Test.java

[java] view plain copy
  1. import java.rmi.RemoteException;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import javax.xml.namespace.QName;  
  7. import javax.xml.rpc.ParameterMode;  
  8. import javax.xml.rpc.ServiceException;  
  9.   
  10. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUser;  
  11. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionService;  
  12. import localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddActionServiceLocator;  
  13.   
  14. import org.apache.axis.client.Call;  
  15. import org.apache.axis.client.Service;  
  16. import org.apache.axis.encoding.XMLType;  
  17. import org.apache.axis.encoding.ser.BeanDeserializerFactory;  
  18. import org.apache.axis.encoding.ser.BeanSerializerFactory;  
  19. import org.junit.Ignore;  
  20. import org.junit.Test;  
  21.   
  22. public class TheAxis1Test {  
  23.       
  24.         private static final String url="http://localhost:8080/webserviceAxis1/services/TheUserWsddAction";  
  25.           
  26.         /** 
  27.          * 最簡單的,入參爲一個 string , 反參爲一個 string 
  28.          * @throws ServiceException 
  29.          * @throws RemoteException 
  30.          */  
  31.         @Test  
  32.         //@Ignore  
  33.         public void testgetEasyEg() throws ServiceException, RemoteException{  
  34.             //獲取Service 對象-創建服務    
  35.             Service service=new Service();  
  36.               
  37.             //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  38.             Call call=(Call) service.createCall();    
  39.               
  40.             //設置遠程調用樁-設置請求地址    
  41.             call.setTargetEndpointAddress(url);    
  42.               
  43.           //設置遠程操作方法名    
  44.             /**  
  45.             * 設置調用的方法和方法的命名空間;  
  46.             * 因爲這裏是手動發佈到webroot目錄下的,所以命名空間和請求地址一致  
  47.             * 當然null也可以,因爲本身它就沒有設置命名空間,一般方法的命名空間是  
  48.             * 包名倒寫組成,如com.hoo.service,ns=http://service.hoo.com  
  49.             *  getSayHello 是要調用的方法名      
  50.             */    
  51.            call.setOperationName(new QName(null,"getEasyEg"));    
  52.              
  53.          //設置參數,執行遠程方法    
  54.           String result=(String)call.invoke(new Object[]{"Jecket"});  
  55.           System.out.println(result);  
  56.         }  
  57.           
  58.         /** 
  59.          * 入參爲 String,int 
  60.          * 反參爲 TheUser 
  61.          * @throws ServiceException  
  62.          * @throws RemoteException  
  63.          */  
  64.         /** 
  65.          * @throws ServiceException 
  66.          * @throws RemoteException 
  67.          */  
  68.         /** 
  69.          * @throws ServiceException 
  70.          * @throws RemoteException 
  71.          */  
  72.         @Test  
  73.         //@Ignore  
  74.         public void testgetTheUser() throws ServiceException, RemoteException{  
  75.             //獲取Service 對象-創建服務    
  76.             Service service=new Service();  
  77.               
  78.             //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  79.             Call call=(Call) service.createCall();    
  80.               
  81.             //設置遠程調用樁-設置請求地址    
  82.             call.setTargetEndpointAddress(url);    
  83.               
  84.             //這裏的QName的ns和wsdd文件中的對應  
  85.             QName qn = new QName("urn:TheUser""TheUser");  
  86.               
  87.             //這裏是將對象序列化和反序列化的配置  
  88.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  89.   
  90.             //設置要調用的方法的名字  
  91.             call.setOperationName("getTheUser");  
  92.               
  93.             /* 
  94.              * 這裏客戶端和服務器端共用一個User,在實際開發中 
  95.              * 客戶端和服務器端在不同的機器上,所以User對象可能不一樣 
  96.              * 需要我們根據WebService的wsdl分析對象的屬性 
  97.              */  
  98.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  99.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  100.             call.setReturnClass(TheUser.class);  
  101.             TheUser tuser = (TheUser) call.invoke(new Object[] {"Jecket",20});  
  102.             System.out.println("你獲取了tuser ,名字是:"+tuser.getUsername()+" 年齡是 "+ tuser.getAge()+" 其他信息 "+tuser.getClass());  
  103.              
  104.               
  105.         }  
  106.           
  107.         /** 
  108.          * 入參爲  String , int 
  109.          * 反參爲 List<TheUser> 
  110.          * @throws ServiceException 
  111.          * @throws RemoteException 
  112.          *  
  113.          */  
  114.         @Test  
  115.         //@Ignore  
  116.         public void testgetTheUserList() throws ServiceException, RemoteException{  
  117.             //獲取Service 對象-創建服務    
  118.             Service service=new Service();  
  119.               
  120.             //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  121.             Call call=(Call) service.createCall();    
  122.               
  123.             //設置遠程調用樁-設置請求地址    
  124.             call.setTargetEndpointAddress(url);    
  125.               
  126.             //這裏的QName的ns和wsdd文件中的對應  
  127.             QName qn = new QName("urn:TheUser""TheUser");  
  128.               
  129.             //這裏是將對象序列化和反序列化的配置  
  130.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  131.   
  132.             //設置要調用的方法的名字  
  133.             call.setOperationName("getTheUserList");  
  134.               
  135.               
  136.             /* 
  137.              * 這裏客戶端和服務器端共用一個User,在實際開發中 
  138.              * 客戶端和服務器端在不同的機器上,所以User對象可能不一樣 
  139.              * 需要我們根據WebService的wsdl分析對象的屬性 
  140.              */  
  141.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  142.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  143.               
  144.             //設置返回值屬性  
  145.             call.setReturnClass(List.class);  
  146.             List<TheUser> tus = (List<TheUser>) call.invoke(new Object[] {"Jecket",20});  
  147.               
  148.             for(TheUser tu: tus){  
  149.                 System.out.println("調用 getTheUserList() 你獲取了tu ,名字是:"+tu.getUsername()+" 年齡是 "+ tu.getAge()+" 其他信息 "+tu.getClass());  
  150.             }  
  151.               
  152.         }  
  153.         /** 
  154.          * 入參爲:String , int 
  155.          * 反參爲:數組  
  156.          * @throws ServiceException  
  157.          * @throws RemoteException  
  158.          */  
  159.         /** 
  160.          * @throws ServiceException 
  161.          * @throws RemoteException 
  162.          */  
  163.         @Test  
  164.         //@Ignore  
  165.         public void testgetTheUserGroup() throws ServiceException, RemoteException{  
  166.             //獲取Service 對象-創建服務    
  167.             Service service=new Service();  
  168.               
  169.             //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  170.             Call call=(Call) service.createCall();    
  171.               
  172.             //設置遠程調用樁-設置請求地址    
  173.             call.setTargetEndpointAddress(url);    
  174.               
  175.             //這裏的QName的ns和wsdd文件中的對應  
  176.             QName qn = new QName("urn:TheUser""TheUser");  
  177.               
  178.             //這裏是將對象序列化和反序列化的配置  
  179.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  180.              
  181.             //設置要調用的方法的名字  
  182.             call.setOperationName("getTheUserGroup");  
  183.               
  184.             /* 
  185.              * 這裏客戶端和服務器端共用一個User,在實際開發中 
  186.              * 客戶端和服務器端在不同的機器上,所以User對象可能不一樣 
  187.              * 需要我們根據WebService的wsdl分析對象的屬性 
  188.              */  
  189.             call.addParameter("username", XMLType.XSD_STRING, ParameterMode.IN);  
  190.             call.addParameter("age", XMLType.XSD_INTEGER, ParameterMode.IN);  
  191.               
  192.             //設置返回值屬性  
  193.             call.setReturnClass(TheUser[].class);  
  194.               
  195.             TheUser[] tu=(TheUser[]) call.invoke(new Object[] {"Jecket",20});  
  196.               
  197.             for(TheUser tus:tu){  
  198.                 System.out.println("調用了getTheUserGroup() 方法 ,年齡:"+tus.getAge()+"  姓名:"+tus.getUsername()+" 所屬的類:"+tus.getClass());  
  199.             }  
  200.               
  201.             //理解數據的類型  
  202.             /*String[] a={"1","2"}; 
  203.             for(String b:a){ 
  204.                 System.out.println(b); 
  205.             }*/  
  206.         }  
  207.           
  208.         @Test  
  209.         //@Ignore  
  210.         public void testgetTheUserMap() throws ServiceException, RemoteException{  
  211.             //獲取Service 對象-創建服務    
  212.             Service service=new Service();  
  213.               
  214.             //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  215.             Call call=(Call) service.createCall();    
  216.               
  217.             //設置遠程調用樁-設置請求地址    
  218.             call.setTargetEndpointAddress(url);    
  219.               
  220.             //這裏的QName的ns和wsdd文件中的對應  
  221.             QName qn = new QName("urn:TheUser""TheUser");  
  222.               
  223.             //這裏是將對象序列化和反序列化的配置  
  224.             call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  225.              
  226.             //設置要調用的方法的名字  
  227.             call.setOperationName("getTheUserMap");  
  228.               
  229.             //設置返回值屬性  
  230.             call.setReturnClass(Map.class);  
  231.               
  232.             Map<String, TheUser> maps = (Map<String, TheUser>) call.invoke(new Object[]{});  
  233.            /*  
  234.             TheUser ta=(TheUser)maps.get("tusera"); 
  235.             TheUser tb=(TheUser)maps.get("tuserb"); 
  236.             System.out.println("調用了getTheUserMap() 方法 ,年齡:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass()); 
  237.             System.out.println("調用了getTheUserMap() 方法 ,年齡:"+tb.getAge()+"  姓名:"+tb.getUsername()+" 所屬的類:"+tb.getClass()); 
  238.            */   
  239.              
  240.             //遍歷  Map 的方法  
  241.             Iterator it=maps.keySet().iterator();  
  242.             while(it.hasNext()){  
  243.                 TheUser ta=maps.get(it.next());  
  244.                 System.out.println("調用了getTheUserMap() 方法 ,年齡:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());  
  245.             }  
  246.               
  247.         }  
  248.           
  249.         /** 
  250.          * 使用webservice客戶端進行調用 
  251.          * 返回的對象都是 object 
  252.          * @throws ServiceException  
  253.          * @throws RemoteException  
  254.          */  
  255.         @Test  
  256.         //@Ignore  
  257.         public void testhere() throws ServiceException, RemoteException{  
  258.             TheUserWsddActionService tuwas=new TheUserWsddActionServiceLocator();  
  259.             localhost.webserviceAxis1.services.TheUserWsddAction.TheUserWsddAction tuwa=tuwas.getTheUserWsddAction();  
  260.             String r=tuwa.getEasyEg("nihao");  
  261.             System.out.println(r);  
  262.             Object[] a=tuwa.getTheUserList("Jecket"10);  
  263.             for(Object ob:a){  
  264.                 TheUser ta=(TheUser)ob;  
  265.                 System.out.println("年齡:"+ta.getAge()+"  姓名:"+ta.getUsername()+" 所屬的類:"+ta.getClass());  
  266.             }  
  267.         }  
  268.       
  269.   
  270. }  


10、以上的例子入參都是簡單的參數,比如String、int,如果是實體類、list等呢?

本例子爲後續補充,不再贅述發佈過程,只寫出方法和調用方法

被調用的方法代碼:

[java] view plain copy
  1. /** 
  2.      * 入參爲 實體類 
  3.      * @param theUser 
  4.      * @return 
  5.      */  
  6.     public TheUser getByTheUser(TheUser theUser){  
  7.         return theUser;  
  8.     }  
  9.     /** 
  10.      * 入參爲list類型 
  11.      * @param list 
  12.      * @return 
  13.      */  
  14.     public TheUser getByListTheUser(List<TheUser> list){  
  15.         return list.get(0);  
  16.     }  
  17.     /** 
  18.      * 入參爲map類型 
  19.      * @param map 
  20.      * @return 
  21.      */  
  22.     public TheUser getByMapTheUser(Map<String,TheUser> map){  
  23.         return map.get("theUser0");  
  24.     }  

調用webservice方法的代碼

[java] view plain copy
  1. /** 
  2.      * 入參爲實體類 
  3.      * @throws ServiceException 
  4.      * @throws RemoteException 
  5.      */  
  6.     @Test  
  7.     //@Ignore  
  8.     public void testGetByTheUser() throws ServiceException, RemoteException{  
  9.         //獲取Service 對象-創建服務    
  10.         Service service=new Service();  
  11.           
  12.         //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  13.         Call call=(Call) service.createCall();    
  14.           
  15.         //設置遠程調用樁-設置請求地址    
  16.         call.setTargetEndpointAddress(url);    
  17.           
  18.         //這裏的QName的ns和wsdd文件中的對應  
  19.         QName qn = new QName("urn:TheUser""TheUser");  
  20.           
  21.         //這裏是將對象序列化和反序列化的配置  
  22.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  23.          
  24.         //設置要調用的方法的名字  
  25.         call.setOperationName("getByTheUser");  
  26.           
  27.         call.addParameter("TheUser", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  28.         //設置返回值屬性  
  29.         call.setReturnClass(TheUser.class);  
  30.           
  31.         TheUser theUser=new TheUser();  
  32.         theUser.setAge(10);  
  33.         theUser.setUsername("jecket");  
  34.           
  35.         TheUser theUser2=new TheUser();  
  36.         theUser2 = (TheUser)call.invoke(new Object[]{theUser});  
  37.         System.out.println("theUser2.name="+theUser2.getUsername());  
  38.         
  39.           
  40.     }  
  41.       
  42.     /** 
  43.      * 入參爲List類型 
  44.      * @throws ServiceException 
  45.      * @throws RemoteException 
  46.      */  
  47.     @Test  
  48.     //@Ignore  
  49.     public void testGetByListTheUser() throws ServiceException, RemoteException{  
  50.         //獲取Service 對象-創建服務    
  51.         Service service=new Service();  
  52.           
  53.         //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  54.         Call call=(Call) service.createCall();    
  55.           
  56.         //設置遠程調用樁-設置請求地址    
  57.         call.setTargetEndpointAddress(url);    
  58.           
  59.         //這裏的QName的ns和wsdd文件中的對應  
  60.         QName qn = new QName("urn:TheUser""TheUser");  
  61.           
  62.         //這裏是將對象序列化和反序列化的配置  
  63.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  64.          
  65.         //設置要調用的方法的名字  
  66.         call.setOperationName("getByListTheUser");  
  67.           
  68.         call.addParameter("list", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  69.         //設置返回值屬性  
  70.         call.setReturnClass(TheUser.class);  
  71.           
  72.         TheUser theUser=new TheUser();  
  73.         theUser.setAge(10);  
  74.         theUser.setUsername("jecket");  
  75.         List<TheUser> list=new ArrayList<TheUser>();  
  76.         list.add(theUser);  
  77.         TheUser theUser2=new TheUser();  
  78.         theUser2 = (TheUser)call.invoke(new Object[]{list});  
  79.         System.out.println("theUser2.name="+theUser2.getUsername());  
  80.         
  81.           
  82.     }  
  83.       
  84.     /** 
  85.      * 入參爲Map類型 
  86.      * @throws ServiceException 
  87.      * @throws RemoteException 
  88.      */  
  89.     @Test  
  90.     //@Ignore  
  91.     public void testGetByMapTheUser() throws ServiceException, RemoteException{  
  92.         //獲取Service 對象-創建服務    
  93.         Service service=new Service();  
  94.           
  95.         //通過 Service 對象獲取遠程調用對象Call-創建調用句柄    
  96.         Call call=(Call) service.createCall();    
  97.           
  98.         //設置遠程調用樁-設置請求地址    
  99.         call.setTargetEndpointAddress(url);    
  100.           
  101.         //這裏的QName的ns和wsdd文件中的對應  
  102.         QName qn = new QName("urn:TheUser""TheUser");  
  103.           
  104.         //這裏是將對象序列化和反序列化的配置  
  105.         call.registerTypeMapping(TheUser.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class);  
  106.          
  107.         //設置要調用的方法的名字  
  108.         call.setOperationName("getByMapTheUser");  
  109.           
  110.         call.addParameter("map", XMLType.XSD_ANYTYPE, ParameterMode.IN);  
  111.         //設置返回值屬性  
  112.         call.setReturnClass(TheUser.class);  
  113.           
  114.         TheUser theUser=new TheUser();  
  115.         theUser.setAge(10);  
  116.         theUser.setUsername("jecket");  
  117.         Map<String,TheUser> map=new HashMap<String,TheUser>();  
  118.         map.put("theUser0", theUser);  
  119.         TheUser theUser2=new TheUser();  
  120.         theUser2 = (TheUser)call.invoke(new Object[]{map});  
  121.         System.out.println("theUser2.name="+theUser2.getUsername());  
  122.         
  123.           
  124.     }  


特別需要強調的是,在以實體類作爲入參或者反參的時候,需要將建立的實體類序列化,即實體類是這樣的,implements Serializable

[html] view plain copy
  1. import java.io.Serializable;  
  2.   
  3. public class TheUser implements Serializable {  
  4.   
  5.     /**  
  6.      * 提供序列化編號,遠程調用時要用到  
  7.      */  
  8.     private static final long serialVersionUID = -971720598087640397L;  
  9.   
  10.     private String username;  
  11.     private int age;  
  12.     public String getUsername() {  
  13.         return username;  
  14.     }  
  15.     public void setUsername(String username) {  
  16.         this.username = username;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.     @Override  
  25.     public String toString() {  
  26.         // TODO Auto-generated method stub  
  27.         return "username="+username+" ;age="+age;  
  28.     }  
  29.   
  30. }  






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章