Spring MVC 模型ModelMap

2018-07-26 14:40 更新

ModelMap類其實(shí)就是一個(gè)豪華版的 Map,它使得你為視圖展示需要所添加的對(duì)象都遵循一個(gè)顯而易見的約定被命名。請(qǐng)看下面這個(gè) Controller實(shí)現(xiàn),并請(qǐng)注意,添加到ModelAndView中去的對(duì)象都沒有顯式地指定鍵名。

public class DisplayShoppingCartController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {

        List cartItems = // 拿到一個(gè)CartItem對(duì)象的列表
        User user = // 拿到當(dāng)前購(gòu)物的用戶User

        ModelAndView mav = new ModelAndView("displayShoppingCart"); <-- 邏輯視圖名

        mav.addObject(cartItems); <-- 啊哈,直接添加的對(duì)象,沒有指定名稱
        mav.addObject(user); <-- 啊哈再來(lái)一次

        return mav;
    }
}

ModelAndView內(nèi)部使用了一個(gè)ModelMap類,它是Map的一個(gè)實(shí)現(xiàn),會(huì)自動(dòng)為添加進(jìn)來(lái)的對(duì)象生成一個(gè)鍵名。為添加對(duì)象生成名稱的策略是,若添加對(duì)象是一個(gè)純Java bean(a scalar object),比如User,那么使用對(duì)象類的短類名(short class name)來(lái)作為該對(duì)象的名稱。下面是一些例子,展示了為添加到ModelMap實(shí)例中的純Java對(duì)象所生成的名稱:

  • 添加一個(gè)x.y.User實(shí)例,為其生成的名稱為user
  • 添加一個(gè)x.y.Registration實(shí)例,為其生成的名稱為registration
  • 添加一個(gè)x.y.Foo實(shí)例,為其生成的名稱為foo
  • 添加一個(gè)java.util.HashMap實(shí)例,為其生成的名稱為hashMap。這種情況下,顯式地聲明一個(gè)鍵名可能更好,因?yàn)?code>hashMap的約定并非那么符合直覺
  • 添加一個(gè)null值將導(dǎo)致程序拋出一個(gè)IllegalArgumentException參數(shù)非法異常。若你所添加的(多個(gè))對(duì)象有可能為null值,那你也需要顯式地指定它(們)的名字

啥?鍵名不能自動(dòng)變復(fù)數(shù)形式么?

Spring Web MVC的約定優(yōu)于配置支持尚不能支持自動(dòng)復(fù)數(shù)轉(zhuǎn)換。這意思是,你不能期望往ModelAndView中添加一個(gè)Person對(duì)象的List列表時(shí),框架會(huì)自動(dòng)為其生成一個(gè)名稱people

這個(gè)決定是經(jīng)過(guò)許多爭(zhēng)論后的結(jié)果,最終“最小驚喜原則”勝出并為大家所接受。

為集合Set或列表List生成鍵名所采取的策略,是先檢查集合的元素類型、拿到第一個(gè)對(duì)象的短類名,然后在其后面添加List作為名稱。添加數(shù)組對(duì)象也是同理,盡管對(duì)于數(shù)組我們就不需再檢查數(shù)組內(nèi)容了。下面給出的幾個(gè)例子可以闡釋一些東西,讓集合的名稱生成語(yǔ)義變得更加清晰:

  • 添加一個(gè)帶零個(gè)或多個(gè)x.y.User元素類型的數(shù)組x.y.User[],為其生成的鍵名是userList
  • 添加一個(gè)帶零個(gè)或多個(gè)x.y.User元素類型的數(shù)組x.y.Foo[],為其生成的鍵名是fooList
  • 添加一個(gè)帶零個(gè)或多個(gè)x.y.User元素類型的數(shù)組java.util.ArrayList,為其生成的鍵名是userList
  • 添加一個(gè)帶零個(gè)或多個(gè)x.y.Foo元素類型的數(shù)組java.util.HashSet,為其生成的鍵名是fooList
  • 一個(gè) 空的 java.util.ArrayList則根本不會(huì)被添加


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)