SpringMVC——處理模型數據

Spring MVC 提供了以下幾種途徑輸出模型數據


一、ModelAndView
處理方法返回值類型爲ModelAndView時。方法體即可通過該對象添加模型數據。即包含視圖信息,有包含模型數據信息

@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
    private static final String SUCCESS = "success";
    /**
     * 目標方法的返回值可以是 ModelAndView 類型。 
     * 其中可以包含視圖和模型信息
     * SpringMVC 會把 ModelAndView 的 model 中數據放入到 request 域對象中. 
     * @return
     */
    @RequestMapping(value="/testModelAndView")
    public ModelAndView testModelAndView(){
        String viewName = SUCCESS;
        ModelAndView modelAndView = new ModelAndView(viewName);
        //添加模型數據到 modelAndView 中。
        modelAndView.addObject("time", new Date());
        return modelAndView;
    }
}

index.jsp

<a href="springmvc/testModelAndView">test ModelAndView </a>

success.jsp

 time: ${requestScope.time }

顯示結果

time: Thu Sep 07 09:30:27 CST 2017

二、Map及Model
入參爲Model、ModelMap或Map 。處理方法返回時,Map中的數據會自動添加到模型中

@RequestMapping("/test")
 public String test(Map<String,Object> map,Model model,ModelMap modelMap){ 
     map.put("names", Arrays.asList("caoyc","zhh","cjx"));
     model.addAttribute("time", new Date());
     modelMap.addAttribute("city", "ChengDu");
     modelMap.put("gender", "male");
     return "hello";
 }

jsp

names:${requestScope.names }
<br/>time:${requestScope.time}
 <br/>city:${requestScope.city }
 <br/>gender:${requestScope.gender }

三、@SessionAttributes
將模型中的某個屬性暫存到HttpSession中,以便多個請求之間可以共享這個屬性。此註解在類上標註。
1、names:這是一個字符串數組。裏面應寫需要存儲到session中數據的名稱。
2、types:根據指定參數的類型,將模型中對應類型的參數存儲到session中
3、value:其實和names是一樣的。

@SessionAttributes(value={"user"},types={String.class})
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {

    private static final String SUCCESS = "success";
    /**
     * @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外(實際上使用的是 value 屬性值),
     * 還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中(實際上使用的是 types 屬性值)
     * 注意: 該註解只能放在類的上面. 而不能修飾放方法. 
     */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Map<String, Object>map){
        User user = new User("Tom","123123","上海",12);
        map.put("user", user);
        map.put("school", "school");
        return SUCCESS;
    }
}

jsp

 request user: ${requestScope.user } 
     <br>
    session user: ${sessionScope.user } 
    <br>
    request school: ${requestScope.school } 
     <br>
    session school: ${sessionScope.school } 

結果

request user: User [username=Tom, password=123123, email=上海, age=12] 
session user: User [username=Tom, password=123123, email=上海, age=12] 
request school: school 
session school: school

四、@ModelAttributes
方法入參標註該註解。入參的對想就會放到數據模型中。
有此註解標記得方法會在每個目標方法之前被springmvc 調用。

@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {

    private static final String SUCCESS = "success";
    /**
     * 1. 有 @ModelAttribute 標記的方法, 會在每個目標方法執行之前被 SpringMVC 調用! 
     */
    @ModelAttribute
    public void getUser(@RequestParam(value="id",required=false) Integer id,
            Map<String, Object>map){
        if (id!=null) {
            User user = new User(1, "Tom", "123123", "[email protected]", 12);
            System.out.println("模擬數據庫查詢:"+user);
            map.put("user", user);
        }
    }
    /**
     * 運行流程:
     * 1. 執行 @ModelAttribute 註解修飾的方法: 從數據庫中取出對象, 把對象放入到了 Map 中. 鍵爲: user
     * 2. SpringMVC 從 Map 中取出 User 對象, 並把表單的請求參數賦給該 User 對象的對應屬性.
     * 3. SpringMVC 把上述對象傳入目標方法的參數. 
     */
    @RequestMapping("/testModelArrtibutes")
    public String testModelArrtibutes(User user){
        System.out.println("修改: " + user);
        return SUCCESS;

    }
}

inde.jsp

<form action="springmvc/testModelArrtibutes" method="post">
        <input type="hidden" name="id" value="1"/>
        username: <input type="text" name="username" value="Tom"/>
        <br>
        email: <input type="text" name="email" value="[email protected]"/>
        <br>
        age: <input type="text" name="age" value="12"/>
        <br>
        <input type="submit" value="Submit"/>
    </form>

結果

模擬數據庫查詢:User [id=1, username=Tom, password=123123, email=tom@atguigu.com, age=12]
修改: User [id=1, username=Tom, password=123123, email=tom@atguigu.com, age=20]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章