處理模型數據
ModelAndView:處理方法返回值類型為ModelAndView時,方法體即可通過該對象添加模型數據。
@ModelAttribute:方法入參標注了該注解后,入參對象會放到數據模型中
Map、Model:入參為org.springframework.ui.Model/ModelMap或java.util.Map時,數據會自動添加到數據模型中
ModelAndView添加數據模型方法
addObject(String attributeName,ObjectattributeValue)
addAllObjects(Map<String,?> modelMap)
@ModelAttribute
可以定義在入參中也可以定義在方法上
Spring mvc在調用目標方法前,會先逐個調用方法級別上的標注了@ModelAttribute的方法,並將方法的返回值添加到模型中
public class UserController {
@ModelAttribute(“user”)
public User getUser(){
User user = new User();
user.setId(100);
return user;
}
@RequestMapping(value= "/handle62")
public String handle62(@ModelAttribute(“user”)Useruser) {
return "user/showUser";
}
}
訪問UserController中任何一個請求處理方法前,spring mvc都會先執行getUser()方法,並將返回值以user為鍵添加到模型中,執行handle62后,模型數據填充覆蓋user對象
@SessionAttributes
如果希望多個請求之間共享某個模型數據,可以在控制器類標注@SessionAttributes,spring mvc會將模型中對應的屬性暫存到httpSession中
@SessionAttributes(“user”)
public class UserController {
@ModelAttribute(“user”)
publicUser getUser(){
Useruser = new User();
User.setUserId(“1001”);
returnuser;
}
@RequestMapping(“/handle71”)
public String handle71(@ModelAttribute(“user”)User user) {
user.setName(“John”);
return “redirect:/user/handle71.html”;
}
@RequestMapping(value= "/handle72")
public String handle72(ModelMapmodelMap,SessionStatus sessionStatus) {
User user = (User)modelMap.get(“user”);
If(user!=null){
user.setName(“jetty”);
sessionStatus.setComplete();
}
return "user/showUser";
}
}
Spring mvc在調用處理方法前,在請求線程中自動一個隱含的模型對象,調用所有在方法級別標注了@ModelAttribute的方法,並將方法返回值添加到隱含模型中,查看Session中是否存在@SessionAttributes(“xxx”)所指定的xxx屬性,如果有,將其添加到隱含模型中,如果隱含模型已經存在xxx屬性,該步驟會覆蓋隱含模型中已有的屬性值。
對應標注了@ModelAttribute(“xxx”)方法的入參按如下流程
如果隱含模型包含了xxx屬性,將其賦給該入參,再用請求消息填充該入參對象直接返回,否則如果xxx是會話屬性,即處理類定義出標注了@SessionAttributes(“xxx”),則嘗試從該會話中獲取該屬性,並將其值賦給入參,然后再用請求填充該入參對象,如會話中找不到xxx屬性,則拋出HttpSessionRequiredException,如果隱含模型不存在xxx屬性,且xxx也不是會話屬性,則創建入參的對象實例,在用請求填充該入參。
@SessionAttributes 允許指定多個屬性。你可以通過字符串數組的方式指定多個屬性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 還可以通過屬性類型指定要 session 化的 ModelMap 屬性,如 @SessionAttributes(types = User.class),當然也可以指定多個類,如@SessionAttributes(types = {User.class,Dept.class}),還可以聯合使用屬性名和屬性類型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。
@SessionAttributes需要清除時,使用SessionStatus.setComplete();來清除。注意,它只清除@SessionAttributes的session,不會清除HttpSession的數據