本文项目代码:https://download.csdn.net/download/qq_43499543/19350232
@SessionAttributes
通过在控制器类的相应方法上标注@SessionAttributes
注解,可将模型数据保存到HttpSession
中,以便多个请求之间公用该模型属性。
1)controller
模型属性user
会保存到ModelMap
中,因为标注了@SessionAttributes
,所以随后会被保存到HttpSession
中
@Controller
@RequestMapping("user")
@SessionAttributes(value = "user")
public class MyController {
@RequestMapping("sessionAttributes")
public String sessionAttributes(ModelMap model){
User user = new User("pp","123");
model.put("user",user);
return "../success"; //因为在类上标注了@RequestMapping("user"),如果不加../会访问user/success.jsp,访问不到
}
}
2)index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
<a href="${pageContext.request.contextPath}/user/sessionAttributes">Session Attributes</a><br>
</html>
3)success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>成功!</h2>
${sessionScope.user.name}
</body>
</html>
4)运行,点击超链接,获取到了user的name属性
@ModelAttribute
如果想让一个方法在控制器类的所有处理方法之前执行,可以通过在该方法上标注@ModelAttribute
来实现
1)controller
@Controller
public class ModelAttributeController {
@ModelAttribute
public User getUser(Model model){
User user = new User("haha","321");
model.addAttribute("user",user);
return user;
}
@RequestMapping("modelAttribute")
public String modelAttribute(User user){
System.out.println(user);
return "success";
}
}
2)在index.jsp中添加
<a href="modelAttribute">Model Attribute</a>
3)运行,点击超链接,可以看到控制台输出值不为空。
显然因为在执行modelAttribute()
方法前执行了标注有@ModelAttribute
的方法getUser()
初始化一个了user
装入了model
中并返回了该对象,被传递给了modelAttribute
方法。