@ModelAttribute注解作用在方法上或者方法的參數上,表示將被注解的方法的返回值或者是被注解的參數作為Model的屬性加入到Model中,然后Spring框架自會將這個Model傳遞給ViewResolver。Model的生命周期只有一個http請求的處理過程,請求處理完后,Model就銷毀了。
如果想讓參數在多個請求間共享,那么可以用到要說到的@SessionAttribute注解
SessionAttribute只能作用在類上
@Controller @RequestMapping("sc") @SessionAttributes("name") public class SessionController { @RequestMapping("session") public String sessions(Model model,HttpSession session){ model.addAttribute("name", "winclpt"); session.setAttribute("myName", "chke"); return "session"; }
上面的代碼將Model中的name參數保存到了session中(如果Model中沒有name參數,而session中存在一個name參數,那么SessionAttribute會講這個參數塞進Model中)
SessionAttribute有兩個參數:
String[] value:要保存到session中的參數名稱
Class[] typtes:要保存的參數的類型,和value中順序要對應上
所以可以這樣寫:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})
原理理解:它的做法大概可以理解為將Model中的被注解的attrName屬性保存在一個SessionAttributesHandler中,在每個RequestMapping的方法執行后,這個SessionAttributesHandler都會將它自己管理的“屬性”從Model中寫入到真正的HttpSession;同樣,在每個RequestMapping的方法執行前,SessionAttributesHandler會將HttpSession中的被@SessionAttributes注解的屬性寫入到新的Model中。
如果想刪除session中共享的參數,可以通過SessionStatus.setComplete(),這句只會刪除通過@SessionAttribute保存到session中的參數