天天看點

WebService複雜類型資料傳輸(dom4j方式)

        WebService在傳遞資料的時候隻能傳遞字元串,當我們傳回一些簡單的字元串時我們可以直接傳回,但是當我們想傳回比如List,Map等複雜類型的資料時拼接字元串就是個很麻煩的工作,這時我們就用到了dom4j這個工具。

        當我們從資料庫中查詢出很多個對象類型時,我們一般都存放在List中。像這種資料就很難用拼接字元串的形式進行傳遞。我的解決辦法就是利用dom4j把它寫成一個xml格式的字元串,然後在用戶端再利用dom4j解釋。

        假如我們從資料庫中查詢的是一個Student對象,該對象有name和agel兩個屬性,我們将大量的Student對象儲存在List中。下面我們想利用dom4j把List資料變成如下格式的xml檔案類型的字元串:

[xhtml:showcolumns:firstline[1]] view plain copy print ? ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.       <root>  
  3.           <student>  
  4.               <name>張三</name>  
  5.               <age>26</age>  
  6.           </student>  
  7.           <student>  
  8.               <name>趙四</name>  
  9.               <age>34</age>  
  10.           </student>  
  11.       </root>  

<?xml version="1.0" encoding="UTF-8"?>

<root>

<student>

<name>張三</name>

<age>26</age>

</student>

<student>

<name>趙四</name>

<age>34</age>

</student>

</root>

 webservice端java代碼如下:

[java:showcolumns:firstline[1]] view plain copy print ? ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. import java.util.List;  
  2. import org.dom4j.Document;  
  3. import org.dom4j.DocumentHelper;  
  4. import org.dom4j.Element;  
  5. import org.dom4j.io.OutputFormat;  
  6. import vo.UnitPO;  
  7. import DAO.unitDao;  
  8. public class Service02 {     
  9.     public String method(){  
  10.         Document document = DocumentHelper.createDocument();  
  11.         Element root = document.addElement("root");  
  12.         Element stuElement = null;  
  13.         Element nameElement = null;  
  14.         Element ageElement = null;  
  15.         //第一個student節點   
  16.         stuElement = root.addElement("student");  
  17.         //添加兩個子節點   
  18.         nameElement = stuElement.addElement("name");  
  19.         ageElement = stuElement.addElement("age");     
  20.         //向兩個子節點中添加文本内容   
  21.         nameElement.addText("張三");  
  22.         ageElement.addText("26");  
  23.         //同理第二個student節點   
  24.         stuElement = root.addElement("student");         
  25.         nameElement = stuElement.addElement("name");  
  26.         ageElement = stuElement.addElement("age");     
  27.         nameElement.addText("趙四");  
  28.         ageElement.addText("34");  
  29.         try {  
  30.             OutputFormat format = OutputFormat.createPrettyPrint();  
  31.             // 設定XML檔案的編碼格式   
  32.             format.setEncoding("UTF-8");  
  33.             return document.asXML();  
  34.         } catch (Exception e) {  
  35.             System.out.println(e.getMessage());  
  36.             return "error";  
  37.         }  
  38.     }  
  39. }  

import java.util.List;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import vo.UnitPO;

import DAO.unitDao;

public class Service02 {

public String method(){

Document document = DocumentHelper.createDocument();

Element root = document.addElement("root");

Element stuElement = null;

Element nameElement = null;

Element ageElement = null;

//第一個student節點

stuElement = root.addElement("student");

//添加兩個子節點

nameElement = stuElement.addElement("name");

ageElement = stuElement.addElement("age");

//向兩個子節點中添加文本内容

nameElement.addText("張三");

ageElement.addText("26");

//同理第二個student節點

stuElement = root.addElement("student");

nameElement = stuElement.addElement("name");

ageElement = stuElement.addElement("age");

nameElement.addText("趙四");

ageElement.addText("34");

try {

OutputFormat format = OutputFormat.createPrettyPrint();

// 設定XML檔案的編碼格式

format.setEncoding("UTF-8");

return document.asXML();

} catch (Exception e) {

System.out.println(e.getMessage());

return "error";

}

}

}

        這樣就将我們想傳送的複雜資料變成了xml格式是字元串,下面在用戶端就可以解釋出我們想要的資料了。

client端java代碼如下:

[java:showcolumns:firstline[1]] view plain copy print ? ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. import java.io.StringReader;  
  2. import java.util.List;  
  3. import org.dom4j.Document;  
  4. import org.dom4j.Element;  
  5. import org.dom4j.io.SAXReader;  
  6. import webservice.Service02Proxy;  
  7. public class Test {  
  8.     public static void main(String[] args) {         
  9.         try{  
  10.             //建立代理類   
  11.             Service02Proxy proxy = new Service02Proxy();  
  12.             //接受傳過來的XML字元串   
  13.             String str = proxy.method();  
  14.             //解釋該字元串   
  15.             StringReader read = new StringReader(str);  
  16.             SAXReader reader = new SAXReader();  
  17.             Document doc = reader.read(read);   
  18.             Element root = doc.getRootElement();  
  19.             //該節點由多個student構成,是以傳回值是List類型   
  20.             List list = root.elements("student");   
  21.             for(int i = 0;i < list.size();i++){  
  22.                 Element student = (Element)list.get(i);  
  23.                 Element name = student.element("name");  
  24.                 Element age = student.element("age");  
  25.                 //列印得到的資料   
  26.                 System.out.println(name.getTextTrim()+":"+age.getTextTrim());  
  27.             }  
  28.         }catch(Exception e){  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32. }  

import java.io.StringReader;

import java.util.List;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import webservice.Service02Proxy;

public class Test {

public static void main(String[] args) {

try{

//建立代理類

Service02Proxy proxy = new Service02Proxy();

//接受傳過來的XML字元串

String str = proxy.method();

//解釋該字元串

StringReader read = new StringReader(str);

SAXReader reader = new SAXReader();

Document doc = reader.read(read);

Element root = doc.getRootElement();

//該節點由多個student構成,是以傳回值是List類型

List list = root.elements("student");

for(int i = 0;i < list.size();i++){

Element student = (Element)list.get(i);

Element name = student.element("name");

Element age = student.element("age");

//列印得到的資料

System.out.println(name.getTextTrim()+":"+age.getTextTrim());

}

}catch(Exception e){

e.printStackTrace();

}

}

}

控制台輸出為:

                   張三:26

                   趙四:34

       每種程式設計語言可能接受時用的類型不同,但方法大同小異。代碼如有問題,歡迎給予評價。