一、@ModelAttribute
- 用法
- 代码例子
abstract public class CommonController {
@ModelAttribute
public void MyModelAttribute(Model model){
model.addAttribute("model", "MyModel");
}
@ModelAttribute
public void newUser(Model model){
User user = new User();
user.setName("myUser");
user.setId(1);
model.addAttribute("myUser", user);
}
}
@Controller
public class MyController {
@RequestMapping("init")
@ResponseBody
public String init(){
return "init";
}
@RequestMapping("user")
@ResponseBody
public void getUser(@ModelAttribute("myUser")User user){
System.out.println(user.toString());
}
@ModelAttribute("modelAndMapping")
@RequestMapping("yes")
public String modelAttributeAndRequestMapping(){
return "yes1";
}
}
- yes.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>yes.jsp</title>
</head>
<body>
${modelAndMapping}
</body>
</html>
二、@SessionAttributes和@SessionAttribute
-
作用:作用是将指定的Model中的键值对添加至session中,方便在下一次请求中使用
该注解只能作用与类上
。 -
@SessionAttributes注解设置的参数有3类方式去使用它:
//通过 @SessionAttributes 注解将Model中attrName为 "user","id","name" 的值添加至 session 中
@SessionAttributes(value = {"user","id","name"})
@Controller
public class UserController {
@ModelAttribute("user")
public User login(){
User user = new User();
user.setName("loginYES");
user.setId(2);
return user;
}
@RequestMapping("newUser")
public String testHandler(Model model){
model.addAttribute("id",23);
model.addAttribute("name","kk");
return "result";
}
@ResponseBody
@RequestMapping("iisLogin")
//通过@SessionAttribute来获取,则正常获取到
public String isLogin(@ModelAttribute("user") User user) {
if (user.getName() != null) {
return "isLogin!";
} else return "isLogin??";
}
}
@Controller
public class MyController {
@ResponseBody
@RequestMapping("isLogin")
public String isLogin(@ModelAttribute("user") User user,HttpSession httpSession){
if(user.getName()!=null){
return "isLogin!";
}
else return "isLogin??";
}
}
- result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>result</title>
</head>
<body>
${sessionScope.user.id}
${sessionScope.user.name}
<br/>
${sessionScope.id}
${sessionScope.name}
</body>
</html>
@SessionAttributes 是将model设置到session中去。
@SessionAttribute 是从session获取之前设置到session中的数据。
四、@RequestAttribute
- 作用:用在方法入参上,
从request中取对应的值,至于request中是怎么存在该属性的,方式多种多样,拦截器中预存、ModelAttribute注解预存、请求转发带过来的
。
尝试访问一个request中不存在的值时,@RequestAttribute抛出异常
:
@RequestMapping("/demo1")
public String demo1(@RequestAttribute String name){
System.out.println(name);
return "test";
}
- 请求request中预存属性的方式:
- 方式一.ModelAttribute注解
@ModelAttribute
public void storeEarly(HttpServletRequest request){
request.setAttribute("name","lvbinbin");
}
- 方式二.拦截器中request.setAttribute()
public class SimpleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(" Simple Interceptor preHandle");
request.setAttribute("name",24);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(" Simple Interceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(" Simple Interceptor afterCompletion");
}
}
- 方式三.请求转发,转发过来的请求属性中存在;
- @RequestAttribute属性required
@RequestAttribute属性required默认为true, request.getAttribute获取不到参数就会抛出异常 ServletRequestBindingException ;当 required设置为false,即使没有从request中获取到就忽略跳过,赋值为null;
- @RequestAttribute和@RequestParam和@RequestBody
参考文章