面向Java開發人員的Ajax:Java對象序列化 (1)

發表于:2007-06-10來源:作者:點擊數: 標簽:
本文我們討論 Ajax 開發 的基礎知識,但是將側重于許多 Java Web 開發人員最關心的問題:為客戶機生成數據。 多數 Java 開發人員已經把模型-視圖-控制器(MVC)模式應用在他們的 Web 應用程序上。在傳統的 Web 應用程序中,視圖組件由 JSP 或者其他表示技術

 

 

 

 

 

 

 

 

本文我們討論 Ajax 開發的基礎知識,但是將側重于許多 Java Web 開發人員最關心的問題:為客戶機生成數據。

多數 Java 開發人員已經把模型-視圖-控制器(MVC)模式應用在他們的 Web 應用程序上。在傳統的 Web 應用程序中,視圖組件由 JSP 或者其他表示技術(例如 Velocity 模板)構成。

這些表示組件動態地生成全新的 HTML 頁面,替代用戶以前正在查看的頁面,從而更新用戶界面。但是,在 Java Web 應用程序使用 Ajax UI 的情況下,基于從 XMLHttpRequest 的響應接收到的數據,JavaScript 客戶端代碼對于更新用戶看到的內容負有最終責任。從服務器的角度來看,視圖成為它響應客戶機請求而發送的數據表示。

本文側重于可以用來生成 Java 對象以數據為中心的視圖的技術。我將演示可以把 JavaBeans 變成 XML 文檔的各種方法,并且討論每種方法的優劣。您將看到為什么 XML 并不總是最好的途徑:對于簡單的 Ajax 請求來說,傳輸純文本更好。

最后,我還將介紹 JavaScript 對象標注(JSON)。JSON 允許數據以序列化的 JavaScript 對象圖的形式傳輸,在客戶端代碼中處理序列化的 JavaScript 對象圖極為容易。

關于示例

我將使用一個示例應用程序和幾個用例來演示這里討論的技術特性和技術。圖 1 顯示的極為簡單的數據模型可以表示示例用例。這個模型代表在線商店中的顧客帳戶。顧客擁有以前訂單的集合,每個訂單包含幾個商品。



雖然 XMLHttpRequest 對于發送數據使用的格式沒有做任何限制,但是對于多數目的來說,只發送傳統的表單數據是適合的,所以我的討論集中在服務器的響應上。

響應也可以有基于文本的格式,但是正如它的名字表示的,XMLHttpRequest 具有內置的處理 XML 響應數據的能力。這使 XML 成為 Ajax 響應的默認選擇,所以我們從 XML 格式開始討論。

從 Java 類產生 XML

把 Ajax 響應作為 XML 來傳遞有許多原因:每個支持 Ajax 的瀏覽器都有導航 XML 文檔的方法,也有許多服務器端技術可以處理 XML 數據。

通過制定一個方案,描述要交換的文檔類型,在 Ajax 客戶端和服務器端之間很容易定義合約,而且如果服務器端架構采用面向服務的方式,那么使用 XML 也可以允許非 Ajax 客戶機使用您提供的數據。

我將考慮從 Java 對象產生 XML 數據的三種方法,并討論每種方法的優劣。

自行進行序列化

首先,可以從對象圖以編程的方式生成 XML。這種方式可以簡單到只是在每個 JavaBean 類中實現 toXml() 方法即可。然后就可以選擇合適的 XML API,讓每個 bean 提供表示自己狀態的元素,并遞歸地對自己的成員調用對象圖。

顯然,這種方式無法擴展到大量的類,因為每個類都需要專門編寫自己的 XML 生成代碼。從好的方面來看,這是一個實現起來簡單的方式,沒有額外的配置支出或者更復雜的構建過程支出,任何 JavaBean 圖都可以只用幾個調用就變成 XML 文檔。

我曾把XML標記字符串連接在一起,實現了toXml()方法。上次我就提到過,這是個糟糕的方法,因為它把確保標記配對、實體編碼等工作的負擔放在每個 toXml() 方法的代碼中。

在 Java 平臺上有幾個 XML API 可以替您做這些工作,這樣您就可以把精力集中在 XML 的內容上。清單 1 用 JDOM API 實現了在線商店示例中表示訂單的類中的 toXml()(請參閱 圖 1)。

清單 1. Order 類的 toXml() 的 JDOM 實現


public Element toXml()
{

Element elOrder = new Element("order");
elOrder.setAttribute("id",id);

elOrder.setAttribute
("cost",getFormattedCost());

Element elDate =
new Element("date").addContent(date);
elOrder.addContent(elDate);

Element elItems = new Element("items");
for (Iterator iter =
items.iterator() ; iter.hasNext() ; )
{
elItems.addContent(iter.next().toXml());
}
elOrder.addContent(elItems);

return elOrder;
}




在這里可以看到用 JDOM 創建元素、使用屬性和添加元素內容有多么簡單。遞歸地調用復合 JavaBean 的 toXml() 方法是為了取得它們子圖的 Element 表示。例如,items 元素的內容是通過調用 Order 聚合的每個 Item 對象上的 toXml() 得到的。

一旦所有的 JavaBean 都實現了 toXml() 方法,那么把任意對象圖序列化成 XML 文檔并返回給 Ajax 客戶機就簡單了,如清單 2 所示。

清單 2. 從 JDOM 元素生成 XML 響應


public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws java.io.IOException,
ServletException
{

String custId =
req.getParameter("username");
Customer customer =
getCustomer(custId);

Element responseElem =
customer.toXml();
Document responseDoc =
new Document(responseElem);

res.setContentType("application/xml");
new XMLOutputter().output
(responseDoc,res.getWriter());
}




JDOM 再次把工作變得非常簡單。只需要在對象圖返回的 XML 元素外面包裝一個 Document,然后用 XMLOutputter 把文檔寫入 servlet 響應即可。清單 3 顯示了用這種方式生成的 XML 示例,用 JDOM Format.getPrettyFormat() 對 XMLOutputter進行初始化,格式化得非常好。在這個示例中,顧客只做了一個訂單,包含兩個商品。

清單 3. 代表顧客的 XML 文檔


encoding="UTF-8"?>

James Hyrax

cost="$349.98">
08-26-2005


Oolong 512MB
CF Card

512 Megabyte Type 1
CompactFlash card.
Manufactured by Oolong
Industries
$49.99


Fujak Superpix72 Camera
7.2 Megapixel digital
camera featuring six
shooting modes and 3x
optical zoom. Silver.
$299.99






1 2 3 4 下一頁>>




原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97