W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
ModelMap
類其實就是一個豪華版的 Map
,它使得你為視圖展示需要所添加的對象都遵循一個顯而易見的約定被命名。請看下面這個 Controller
實現,并請注意,添加到ModelAndView
中去的對象都沒有顯式地指定鍵名。
public class DisplayShoppingCartController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
List cartItems = // 拿到一個CartItem對象的列表
User user = // 拿到當前購物的用戶User
ModelAndView mav = new ModelAndView("displayShoppingCart"); <-- 邏輯視圖名
mav.addObject(cartItems); <-- 啊哈,直接添加的對象,沒有指定名稱
mav.addObject(user); <-- 啊哈再來一次
return mav;
}
}
ModelAndView
內部使用了一個ModelMap
類,它是Map
的一個實現,會自動為添加進來的對象生成一個鍵名。為添加對象生成名稱的策略是,若添加對象是一個純Java bean(a scalar object),比如User
,那么使用對象類的短類名(short class name)來作為該對象的名稱。下面是一些例子,展示了為添加到ModelMap
實例中的純Java對象所生成的名稱:
x.y.User
實例,為其生成的名稱為user
x.y.Registration
實例,為其生成的名稱為registration
x.y.Foo
實例,為其生成的名稱為foo
java.util.HashMap
實例,為其生成的名稱為hashMap
。這種情況下,顯式地聲明一個鍵名可能更好,因為hashMap
的約定并非那么符合直覺null
值將導致程序拋出一個IllegalArgumentException
參數非法異常。若你所添加的(多個)對象有可能為null
值,那你也需要顯式地指定它(們)的名字啥?鍵名不能自動變復數形式么?
Spring Web MVC的約定優(yōu)于配置支持尚不能支持自動復數轉換。這意思是,你不能期望往ModelAndView
中添加一個Person
對象的List
列表時,框架會自動為其生成一個名稱people
。
這個決定是經過許多爭論后的結果,最終“最小驚喜原則”勝出并為大家所接受。
為集合Set
或列表List
生成鍵名所采取的策略,是先檢查集合的元素類型、拿到第一個對象的短類名,然后在其后面添加List
作為名稱。添加數組對象也是同理,盡管對于數組我們就不需再檢查數組內容了。下面給出的幾個例子可以闡釋一些東西,讓集合的名稱生成語義變得更加清晰:
x.y.User
元素類型的數組x.y.User[]
,為其生成的鍵名是userList
x.y.User
元素類型的數組x.y.Foo[]
,為其生成的鍵名是fooList
x.y.User
元素類型的數組java.util.ArrayList
,為其生成的鍵名是userList
x.y.Foo
元素類型的數組java.util.HashSet
,為其生成的鍵名是fooList
java.util.ArrayList
則根本不會被添加Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: