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

來源:互聯網
上載者:User

本文我們討論 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進行初始化,格式化得非常好。在這個樣本中,顧客只做了一個訂單,包含兩個商品。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.