1. 程式人生 > >SpringMVC 控制器向檢視傳值的方式

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

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

ModelAndView

將控制器方法的返回值設為ModelAndView,並且向ModelAndView中新增資料,在檢視的requestScope中將可以訪問到放入的資料。
控制器方法示例如下:

@RequestMapping("/getTime")
    public ModelAndView getTime(){
        String viewName = "success";

        //向ModelAndView中構造方法傳入的引數為目標檢視的名稱
ModelAndView modelAndView = new ModelAndView(viewName); modelAndView.addObject("time", new Date()); return modelAndView; }

在目標檢視中可以訪問到該變數

<h1>${requestScope.time}</h1>

ModelMap

使用ModelMap需要有一個ModelMap變數作為控制器方法的形參,在其中新增要傳遞到頁面的資料。此處用ModelMap和Map都是可以的。
示例程式碼如下:

@RequestMapping("/getCity")
    public String getCity(Map<String,Object> map){
        map.put("address","NingBo");
        return "success";
    }

同樣這麼寫也是可以的

@RequestMapping("/getCity")
    public String getCity(ModelMap map){
        map.put("address","NingBo");
        return "success"
; }

其實,無論是ModelMap還是Map,甚至是不傳遞引數,僅僅是返回目標檢視名稱,SpringMVC都會把它轉換陳ModelAndView傳遞給檢視。

在ModelAndView的原始碼中可以看到,ModelAndView有兩個成員變數,分別是view和Model

private Object view;
private ModelMap model;

分別代表了目標檢視和攜帶的引數,其中的引數會由SpringMVC把ModelMap 中的鍵值對逐個放到Request中,也就是為什麼放入到ModelAndView或ModelMap中的資料最終能在requestScope中訪問到的原因。

Session

如果把需要的資料放入到Session中,那麼檢視自然能訪問到該資料。SpringMVC將值放入Session中的方法是新增SessionAttributes註解。

@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>