在SpringMVC中,控制器向視圖傳值通常有三中方式,分別是經過ModelAndView、ModelMap、Session,下面將講述三種傳值方式java
將控制器方法的返回值設爲ModelAndView,而且向ModelAndView中添加數據,在視圖的requestScope中將能夠訪問到放入的數據。
控制器方法示例以下:markdown
@RequestMapping("/getTime") public ModelAndView getTime(){ String viewName = "success"; //向ModelAndView中構造方法傳入的參數爲目標視圖的名稱 ModelAndView modelAndView = new ModelAndView(viewName); modelAndView.addObject("time", new Date()); return modelAndView; }
在目標視圖中能夠訪問到該變量session
<h1>${requestScope.time}</h1>
使用ModelMap須要有一個ModelMap變量做爲控制器方法的形參,在其中添加要傳遞到頁面的數據。此處用ModelMap和Map都是能夠的。
示例代碼以下:app
@RequestMapping("/getCity") public String getCity(Map<String,Object> map){ map.put("address","NingBo"); return "success"; }
一樣這麼寫也是能夠的spa
@RequestMapping("/getCity") public String getCity(ModelMap map){ map.put("address","NingBo"); return "success"; }
其實,不管是ModelMap仍是Map,甚至是不傳遞參數,僅僅是返回目標視圖名稱,SpringMVC都會把它轉換陳ModelAndView傳遞給視圖。code
在ModelAndView的源碼中能夠看到,ModelAndView有兩個成員變量,分別是view和Modelxml
private Object view; private ModelMap model;
分別表明了目標視圖和攜帶的參數,其中的參數會由SpringMVC把ModelMap 中的鍵值對逐個放到Request中,也就是爲何放入到ModelAndView或ModelMap中的數據最終能在requestScope中訪問到的緣由。ci
若是把須要的數據放入到Session中,那麼視圖天然能訪問到該數據。SpringMVC將值放入Session中的方法是添加SessionAttributes註解。get
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface SessionAttributes { String[] value() default {}; Class<?>[] types() default {}; }
以上爲SessionAttributes的源碼,能夠看到該註解目標是類,因此要把該註解放到控制器前
有兩個屬性,其中value表示要放入session中的鍵。types表示要自動放入session中的類類型。
注意,放入SessionAttributes還有一個條件是該值要手動放入request,也就是ModelAndView中源碼
@SessionAttributes(types = {java.lang.String.class},value = {"city","time"})
這句註釋的意思是自動把放入ModelAndView中的值爲String類型的鍵值對放入Session中,同時把鍵爲city和time的鍵值對也放入Session中。
而後,在該會話的全部頁面均可以訪問到這些屬性了。
<h1>${sessionScope.names}</h1>