SpringMVC Model


處理模型數據

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的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM