SpringMVC 控制器向視圖傳值的方式

在SpringMVC中,控制器向視圖傳值通常有三中方式,分別是經過ModelAndView、ModelMap、Session,下面將講述三種傳值方式java

ModelAndView

將控制器方法的返回值設爲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變量做爲控制器方法的形參,在其中添加要傳遞到頁面的數據。此處用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

若是把須要的數據放入到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>
相關文章
相關標籤/搜索