StrutsCatalog系列(4)--DTO實現

/**
作者:Puneet Agarwal
譯者:Rifoo Technology(http://www.rifoo.com
時間:2005-11-09
備註:轉載請保留以上聲明
**/

問題 

  • 在一個J2EE應用中,我們通常要在WEB層和EJB層之間傳輸業務數據。數據傳輸對象 (DTO)通常是我們所採用的一種方式,而不是去重複的頻繁調用一個實體bean的方法。在Struts中,Action-Form是一種DTO實現的形式之一。它扮演着一箇中間倉庫的角色,用來存儲客戶端的數據以及EIS層的相關業務數據。 但是在不同的層之間傳遞ActionForm是一種糟糕的做法。

一種方法是將Form Bean中的值以方法參數的形式傳到一個SessionBean。這種方式沒有任何技術上的錯誤。但是我們不得不頻繁的修改SessionBean的方法甚至是一些需要改變的接口定義。所以我們推薦一種更好的方法是copy數據到一個DTO中,然後傳遞這個相同的bean到EJB層。理想狀態下,這個DTO應該傳到SessionBean (session façade), 在SessionBean中會和EntityBean直接打交道。

最佳實踐

  • 在一個分層的系統中,一個層中的類應該只和同層的其他類進行交互,或者和鄰近層中的類進行交互。這個意味着Action-Form類應該只被用在表現層和控制層中。 我們可以手動的組裝這個傳輸對象,或者編寫一個實用方法來透明的處理它。

有兩種可行的方法將數據組裝到DTO中:

  • 創建一個自己的"Value或Transfer Object",將Action-Form中的數據copy到這個對象裏來,這裏要注意數據類型的轉換。這種方式使得我們反覆的重複類似的操作。 

  • 實用 Commons包中的"BeanUtil" 類。 它使用JAVA反射技術來實現。

   根據調查,程序員們多數使用第一種方式,這種方式使得每次都是重複的勞動,讓編碼工作變得枯燥無味。在copy的時候,要手工處理DTO setter方法裏的數據類型轉換,將它們轉爲合適的業務類型。 例如,一個Form bean接收到來自客戶層的所有String類型的字段,但是在它們上執行任何業務操作之前,要將它們轉換成不同的JAVA類型或原始類型。  

我們能夠使用BeanUtils類中的copyProperties()方法來處理。該方法可以複製一個bean中的數據到另一個bean,這個目標bean是以Value或傳輸對象形式提供的變量名。它可以減輕我們在數據類型轉換上的負擔,它能夠透明的在源bean和目標bean之間轉換字段類型。

發佈了84 篇原創文章 · 獲贊 2 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章