1. 程式人生 > >Axis2傳遞、返回複雜型別的物件

Axis2傳遞、返回複雜型別的物件

上面的服務傳遞的是簡單資料型別,返回的也是簡單資料型別。下面我們用JavaBean 、List、Map、Array等返回值或引數完成WebService。

1、首先看看JavaBean模式的引數和返回值的WebService,JavaBean程式碼如下:

程式碼 複製程式碼 package com.hoo.entity; import java.io.Serializable; /** * <b>function:</b>User Entity * @author hoojo * @createDate Dec 16, 2010 10:20:02 PM * @file User.java * @package com.hoo.entity * @project AxisWebService * @blog
http://blog.csdn.net/IBM_hoojo * @email [email protected] * @version 1.0 */publicclass User implements Serializable { privatestaticfinallong serialVersionUID =677484458789332877L; privateint id; private String name; private String email; private String address; //Constractor
//getter、setter @Override public String toString() { returnthis.id +"#"+this.name +"#"+this.email +"#"+this.address; } } 複製程式碼

沒有上面特別就是一個普通的Java物件,裡面提供一些屬性及getter、setter方法和toString方法(在顯示資料的時候有用),值得注意的是在遠端呼叫的Java物件都需要實現Serializable介面,這樣在網路中傳遞物件的時候就不會出現重複的JavaBean。用過或是瞭解EJB、RMI的朋友應該知道這點。序列化後的物件可以用io進行序列化寫入到檔案中,也可以反序列化解析到物件中的資料。

2、好,回正題。下面編寫WebService的伺服器端程式碼。

程式碼 複製程式碼 package com.hoo.service; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.hoo.entity.User; /** * <b>function:</b>axis WebService傳遞複雜型別資料 * @author hoojo * @createDate Dec 16, 2010 10:21:06 PM * @file ManagerUser.java * @package com.hoo.service * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email [email protected] * @version 1.0 */ @SuppressWarnings("deprecation") publicclass ManagerUser { public User getUserByName(String name) { User user =new User(); user.setId(new Date().getSeconds()); user.setName(name); user.setAddress("china"); user.setEmail(name +"@hoo.com"); return user; } publicvoid setUser(User user) { System.out.println(user); } public List<User> getUsers(int i) { List<User> users =new ArrayList<User>(); for (int j =0; j <= i; j++) { User user =new User(); user.setId(new Date().getSeconds()); user.setName("jack#"+ j); user.setAddress("china"); user.setEmail("jack"+ j +"@hoo.com"); users.add(user); } return users; } publicvoid setUserMap(Map<String, User> maps) { System.out.println(maps); } public User[] getUserArray(int i) { User[] users =new User[i]; for (int j =0; j < i; j++) { User user =new User(); user.setId(new Date().getSeconds()); user.setName("jack#"+ j); user.setAddress("china"); user.setEmail("jack"+ j +"@hoo.com"); users[j] = user; } return users; } publicvoid setUserArray(User[] users) { for (User u : users) { System.out.println(u); } } public Map<String, User> getUserMap() { Map<String, User> users =new HashMap<String, User>(); User user =new User(); user.setId(new Date().getSeconds()); user.setName("jack#"); user.setAddress("china"); user.setEmail("[email protected]"); users.put("A", user); user =new User(); user.setId(new Date().getSeconds()); user.setName("tom"); user.setAddress("china"); user.setEmail("[email protected]"); users.put("B", user); return users; } publicvoid setUsers(List<User> users) { for (User u : users) { System.out.println(u); } } } 複製程式碼

3、編寫wsdd文字釋出當前WebService,wsdd檔案程式碼如下:

程式碼 複製程式碼 <?xml version="1.0" encoding="UTF-8"?><deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><service name="ManagerUser" provider="java:RPC"><parameter name="className" value="com.hoo.service.ManagerUser"/><parameter name="allowedMethods" value="*"/><parameter name="scope" value="request"/><!-- 這裡的urn:User和new QName("urn:User", "User")這裡是對應的 --><beanMapping qname="myNSD:User" xmlns:myNSD="urn:User" languageSpecificType="java:com.hoo.entity.User"/></service></deployment> 複製程式碼

和上面的wsdd檔案不同的是,這裡多了beanMapping的配置。Qname是xml中規範限定名稱,由名稱空間url、本地名稱、字首組成,本地名稱是必需的且qname是不可變的。後面的myNSD(namespace)是必需的,是通過前面的qname指定的,myNSD後面的urn:User就和程式中的QName對應的第一個引數,第二個引數對應配置檔案中的qname的myNSD冒號後面的值。languageSpecificType是javaBean的類路徑。

4、釋出WebService,還是允許命令列:

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployComplex.wsdd

釋出後,在瀏覽器中請求:

就可以看到釋出的WebService和暴露的方法了。

5、客戶端程式碼的編寫,這次客戶端和以前有些不一樣。因為這裡設定了引數和返回值都是複雜型別,而不是簡單的型別了。程式碼如下:

程式碼 複製程式碼 package com.hoo.client; import java.rmi.RemoteException; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import javax.xml.rpc.ServiceException; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; import com.hoo.entity.User; /** * <b>function:</b>axis WebService傳遞複雜物件,客戶端 * @author hoojo * @createDate Dec 16, 2010 10:32:57 PM * @file UserServiceClient.java * @package com.hoo.client * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email [email protected] * @version 1.0 */ @SuppressWarnings("unchecked") publicclass UserServiceClient { privatestaticfinal String url ="http://localhost:8080/AxisWebService/services/ManagerUser"; privatestatic Service service =new Service(); publicstatic User getUser(String name) throws ServiceException, RemoteException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); QName qn =new QName("urn:User", "User"); //call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.registerTypeMapping(User.class, qn, BeanSerializerFactory.class, BeanDeserializerFactory.class); call.setOperationName("getUserByName"); /* * 這裡客戶端和伺服器端共用一個User,在實際開發中 * 客戶端和伺服器端在不同的機器上,所以User物件可能不一樣 * 需要我們根據WebService的wsdl分析物件的屬性 */ call.addParameter("name", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnClass(User.class); User user = (User) call.invoke(new Object[] { "jackson" }); return user; } publicstaticvoid setUser(User user) throws ServiceException, RemoteException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); //這裡的QName的ns和wsdd檔案中的對應 QName qn =new QName("urn:User", "User"); //這裡是將物件序列化和反序列化的配置 call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.setOperationName("setUser"); //設定引數型別 call.addParameter("user", qn, ParameterMode.IN); call.invoke(new Object[] { user }); } publicstatic List<User> getUsers(int i) throws ServiceException, RemoteException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); //這裡的QName的ns和wsdd檔案中的對應 QName qn =new QName("urn:User", "User"); //這裡是將物件序列化和反序列化的配置 call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.setOperationName("getUsers"); call.addParameter("i", XMLType.XSD_INT, ParameterMode.IN); call.setReturnClass(List.class); List<User> users = (List<User>) call.invoke(new Object[] { i }); return users; } publicstaticvoid setUsers(List<User> users) throws ServiceException, RemoteException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); //這裡的QName的ns和wsdd檔案中的對應 QName qn =new QName("urn:User", "User"); //這裡是將物件序列化和反序列化的配置 call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.setOperationName("setUsers"); call.addParameter("users", XMLType.XSD_ANYTYPE, ParameterMode.IN); call.invoke(new Object[] { users }); } publicstaticvoid setUserMap(Map<String, User> maps) throws ServiceException, RemoteException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); //這裡的QName的ns和wsdd檔案中的對應 QName qn =new QName("urn:User", "User"); //這裡是將物件序列化和反序列化的配置 call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.setOperationName("setUserMap"); call.addParameter("maps", XMLType.XSD_ANYTYPE, ParameterMode.IN); call.invoke(new Object[] { maps }); } publicstatic Map<String, User> getUserMap() throws RemoteException, ServiceException { Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); //這裡的QName的ns和wsdd檔案中的對應 QName qn =new QName("urn:User", "User"); //這裡是將物件序列化和反序列化的配置 call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(User.class, qn), new BeanDeserializerFactory(User.class, qn)); call.setOperationName("getUserMap"); //call.addParameter("null", XMLType.XSD_ANYTYPE, ParameterMode.IN); call.setReturnClass(Map.class); Map<String, User> maps = (Map<String, User>) call.invoke(new Object[]{}); return maps; } publicstatic User[] getUserArray(int

相關推薦

Axis2傳遞返回複雜型別物件

上面的服務傳遞的是簡單資料型別,返回的也是簡單資料型別。下面我們用JavaBean 、List、Map、Array等返回值或引數完成WebService。 1、首先看看JavaBean模式的引數和返回值的WebService,JavaBean程式碼如下: 程式碼 package com.hoo.

Python函式細節:多數量引數強制引數傳遞返回多值匿名/行內函數

1. 可接受任意數量引數的函式 接受任意數量的位置引數,使用引數*來解決 # rest是由所有其他位置引數組成的元組 def avg(first, *rest): return ( first + sum(rest) ) / (1+len(rest)) pri

axis1.4釋出返回複雜型別的引數

1、為專案 webserviceAxis1 引入 axis1 必須的幾個jar包 2、建立實體類 TheUser.java  注意需要序列化即實現介面Serializable,這對於在webservice 中傳遞實體型別是必須的 TheUser.java 的內

黑馬程式設計師——Java之String類基本資料型別物件包裝類等

    例如:parseInt("0", 10) 返回 0。        parseInt("473", 10) 返回 473。        parseInt("-0", 10) 返回 0。        parseInt("-FF", 16) 返回 -255。        parseInt("1100

axis2系列之傳輸複雜型別的資料

public static void main(String[] args) { RPCServiceClient client = null; try { client = new RPCServiceClient(); Options options = client.getOptio

C# LINQ去重複雜型別物件集合

通過使用LINQ方法語法中的Distinct(),可以去重簡單型別集合,如:int、string等。但如果要去重複雜型別集合,那麼 直接呼叫Distinct()方法是不行的。幸運的是,Distinct()方法可以新增自定義比較方式,簡單型別的去重無非就是型別比較,因為型別簡單

HashSet中儲存複雜型別物件

 這個話題還是從一個有問題的程式碼中引申出來的,原始碼如下: import java.util.*; class TreeSetTest {     public static void main(String[] args)     {         HashSet

JNI開發:傳遞返回String型別案例

          此篇以案例來講解JNI傳遞String引數並返回String返回值開發,Java函式傳遞“牛八少爺”到C/C++函式,C/C++函式給字串追加“歡迎你!”,並返回追加後的字串到java的函式;           主要程式碼如下:        

Axis2到底能否傳遞複雜型別引數【求指導篇】

    首先回顧一下,上篇部落格給大家巨集觀上介紹了webservice框架—Axis,Axis2,CXF,XFire。接下來我們對框架的實踐學習,其實,目前的階段,主要是會實踐,會應用。     並且上篇部落格中也提到,目前Apache中最流行的兩大Webservice框架——Axis2 VS CXF  

javaSE引數傳遞問題返回值問題內部類總結

 思維導圖  引數值傳遞問題 之前我們見到方法傳參一般傳遞的都是基本資料型別的引數,比如我要一個int型別,只需要在呼叫方法的時候傳一個int型別的數值就好了。但是當傳入引數需要一個引用資料型別,那麼該如何考慮呢? 類名作為傳入引數 class Studen

el表示式獲取物件屬性值 返回型別

實現 數字頁碼時 遇到的一個問題。 後端servlet 在request.setAttribute("page",page); page 為pagebean的例項物件,pagebean類中有int 格式屬性 pageNum; 前端 js 中 el表示式獲取到的pageNum 預設為 String 型別。導

Java後臺返回複雜資料大資料給前端解決辦法(返回json資料分類簡化前段操作)

背景分析: 面對當前多種的業務需求和雜亂無章的資料堆放,Java後臺處理變得尤為重要。對於資訊系統開發而言,歸根到底是對資料的分類與處理。通過從伺服器獲取資料,客戶給出需求,形成怎樣的表格,多樣化的靜態圖和動態圖,各種各樣資原始檔,這些需求都不是簡單的從資料庫中取出來就可以直接使用的,往

xFire開發webService返回複雜物件

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Intent傳遞複雜ArrayList物件(Parcelable)

自定義實體實現Parcelable介面 import android.os.Parcel; import android.os.Parcelable; /** * Created by HTT on 2017/10/25. */ public class Termi

使用泛型實現返回不同型別物件

本次功能的實現場景:讀取Yaml配置檔案,然後將其中的資訊轉換成指定的物件。 在這裡定義了一個Yaml的工具類,希望工具類的返回物件型別可以根據呼叫方法時傳入的物件型別來定義。 通過泛型實現 工具類: public class YamlUtil { p

JAVA基本資料型別引用資料型別-引數傳遞詳解

1:基本型別的引數傳值 對於基本資料型別,修改這個值並不會影響作為引數傳進來的那個變數,因為你修改的是方法的區域性變數,是一個副本。實參的精度級別應等於或低於形參的精度級別,否則報錯。 class JB{ void f(int x, int y){ x=x+1;

Android通過Parcelable傳遞複雜物件資料和簡單的物件資料

二次驗證:絕對有效 轉:https://blog.csdn.net/u014614038/article/details/56279075 Android推薦可以通過Parcelable來傳遞自定義的資料(),比如以下的資料體: public class GradeInfoForSear

typescript物件陣列函式的型別詳解

一、物件的型別:介面 概述:在面嚮物件語言中,介面(Interfaces)是一個很重要的概念,它是對行為的抽象,而具體如何行動需要由類(classes)去實現(implements) 1.介面使用 這個例子中定義了一個介面 Person,接著定義了一個變數 tom,它的

實現一個棧,要求實現出棧入棧返回最小值的時間複雜度為O(1)

  由棧的一些基本操作,很容易使出棧和入棧的時間複雜度為O(1),但是由於入棧資料元素順序不一定是有序的,故不能直接實現返回最小值的時間複雜度為O(1)。下面提供兩種方法: (一)設定一個特殊的資料結構型別,包括兩個棧_data棧和_mindata棧,_data棧和原來的棧

JSON——後端向前臺 select 標籤傳遞 list json型別物件時,前臺的處理

獲取 後臺的list json 物件 1.格式化 data 的json 資料         var json= JSON.stringify(data); 2.轉 json 資料