Spring MVC 模型ModelMap

2018-07-26 14:40 更新

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則根本不會被添加


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號