DomainModel接收參數

使用DomainModel 的方式,DomainModel這個詞以前給大家解釋過,叫做域模型,所謂的域模型就是在我們的項目裏面,在這個問題域裏面,真正存在的那些個實體的概念,比如說最簡單的寫一個BBS系統,真正存在的實體的概念就會包括 版塊(category) ,帖子(article)  等等這一類的,這就是實體概念,平時我們用Action接受到一個參數,大家可以想想看,我們用它幹嘛了?就是接收到一個參數之後將其賦到某一個對象上,讓後將其存到數據庫裏面,就是這樣的,這是經常用的。既然name和age到時候,總是要交給某個 user對象,那麼我們是不是可以這樣來用了,

我們來看第二種接收參數的方法,部署好 08 項目,訪問

http://localhost:8080/Struts2_0800_DomainModelParamInput/

結果如下

[轉載]8_用DomainModel接收參數

第二種是使用 Domain  Model 接受參數,大家注意看 我這裏點擊 添加用戶後的 地址欄,如下圖所示:

[轉載]8_用DomainModel接收參數

它的參數是怎麼傳的了?它仍然是調用了user下面的user.action ,去找 ,打開 struts.xml

如下圖所示:

[轉載]8_用DomainModel接收參數

這個處理類仍然叫 UserAction.java ,調用了它的add()方法,

[轉載]8_用DomainModel接收參數

在這個方法裏面我們直接輸出的是user.getName 和user.getAge()這個是什麼意思了?在UserAction.java 這個Action裏面,它存在的就不是直接的屬性了,存在的是一個user,這個user來源於我們的另外一個包,叫做model包,model當然指的就是我們的域模型,這個域模型很簡單,如下圖所示:

[轉載]8_用DomainModel接收參數

它裏面定義了 name和 age 屬性, 這樣了我們在 UserAction.java處理類中就不用 存 那麼多屬性了,如果一個域模型裏面有200多個屬性,當然有點誇張了,那你是不是要在這個UserAction裏面寫上200多個屬性,然後還要寫setter和getter方法啊,然後你本身另外的那個model裏面還需要寫 這些屬性,這樣太麻煩了,所以了我們乾脆用 域模型,直接我們寫 User 的一個對象 user,當然不要忘了 提供setter和getter方法,也不要去new User 對象,因爲Struts 2 會幫助我們new的,所以你不用管了,當我們這樣寫的時候,就可以直接往user裏面賦值了,就是在地址欄中 user.name = a &user.age=8  這樣來寫,就可以完成屬性的賦值了,相當於調用了setUser().setName() ,先setUser()把user的值設好,再調用setName(),將其name的值設好,同樣的看一下 後臺,我們依然可以接受到name和age的值,如下圖所示:

[轉載]8_用DomainModel接收參數

這就是用域模型直接來接受這個參數,關於域模型這裏頭了還有一點深入的概念,試帶着大家說一下,現在問大家這麼一個問題,就是說一般的你的輸入是不是正好可以跟域模型匹配在一起?我輸入了三個參數,我的域模型就正好有三個屬性,一定是這樣嗎?不一定,舉個最常見的例子,我們寫用戶註冊的時候,一般都這麼寫,用戶名,用戶密碼,還有一個叫密碼確認,如果站在域模型的角度,也就是說站在我們真正分析業務實體的角度,user這個類,它應該就有兩個屬性,一個是username,一個是password,它沒有什麼密碼確認這一項,能理解這個意思吧。所以了這個時候,麻煩事就出來了,大家這個時候用域模型可以用上嗎?是用不上的。此時

第一種方式就是直接用屬性接收,接收完了之後,你如果有 user,你就new 一個,把這些屬性傳給他這是一種方式,

還有一種方式是我們可以使用 vo ,或者有的人叫它do ,還有人叫它dto ,vo叫ValueObject ,do叫DataObject(數據對象),dto叫datatransferObject(數據傳輸對象)

嚴格來講這幾個還是有一點細小的區別的,好假如說我們有這麼一個對象,叫UserDTO,其實了你可以這麼來寫,它除了name和password之外,它還可以有一個confirmingPassword,如下圖所示:

[轉載]8_用DomainModel接收參數

然後我們在Action裏面接收的時候就不再寫 DomainModel了,將其寫成

private UserDTO userDTO ;

 

大家想想看,這個時候我們前臺輸入進來的參數是不是又跟它相匹配了,在相應的處理方法裏面處理完了之後了,再根據相應的 UserDTO生成一個user對象,怎麼生成 了?是不是從DTO裏面拿出相應的參數來填充到user裏面去,就可以了。

畫個圖,

[轉載]8_用DomainModel接收參數

我就從Action開始畫,就是action在調用它的execute()方法的時候,注意了,這個時候大家是知道的它裏面有一個DTO對象,它其實會首先把DTO對象給填充好,會調用它的setter方法,setter完之後,這個DTO對象就完成了,接下來你還可以把這個DTO了整體的交到我們的DomainModel裏面去,而這個裏面很可能有這樣一個方法,就是這個時候我可以new它的一個DomainModel出來了,new 它的時候,很可能是這樣一個方法,這個方法就是newDomainModel(DTO),但是了我把DTO交給你,如果我們寫的更加直白一點,就是我要new 一個User()出來,然後了把UserDTO 傳進去,即 new User (UserDTO dto) ,大家想想看,對應的這個user會不會new 出來?當然會了,爲什麼了?因爲UserDTO裏面的那些個屬性,你在這個方法裏面完全可以全都複製到我們的User裏面去,所以這個User對象就產生了,爲什麼這個對象叫DataTransferObject ,叫數據傳輸對象,因爲大家可以看看,它幹了什麼了?他就是把這個參數接受過來,然後在new DomainModel的時候,在吧這個參數交給 DomainModel,相對應的參數,有些參數一一不對應,這個時候你就需要在這個方法裏面作出相應的處理,所以這個DTO的作用就是接收了一下,傳遞了一下,這個就叫DTO 。什麼時候用?只能是你的參數傳過來的時候跟我們的DomainModel匹配不上,這個時候可以有兩種方式,第一種是用屬性接收過來,再給DomainModel,第二種方式就是使用DTO。

用DomainModel來接收參數,做法就是你有一個DomainModel在裏面的話,你往裏面傳參數的時候就直接帶上DomainModel的名字(如 user),就是什麼什麼點什麼,就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章