0
点赞
收藏
分享

微信扫一扫

@ModelAttribute和@SessionAttributes和@SessionAttribute和@RequestAttribute

一叶轻舟okok 2022-02-25 阅读 33

一、@ModelAttribute

  1. 用法
  1. 代码例子
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

  1. 作用:作用是将指定的Model中的键值对添加至session中,方便在下一次请求中使用该注解只能作用与类上

  2. @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

  1. 作用:用在方法入参上,从request中取对应的值,至于request中是怎么存在该属性的,方式多种多样,拦截器中预存、ModelAttribute注解预存、请求转发带过来的

尝试访问一个request中不存在的值时,@RequestAttribute抛出异常

@RequestMapping("/demo1")
    public String demo1(@RequestAttribute String name){
        System.out.println(name);
        return "test";
    }
  1. 请求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");
    }
}
  • 方式三.请求转发,转发过来的请求属性中存在;
  1. @RequestAttribute属性required

@RequestAttribute属性required默认为true, request.getAttribute获取不到参数就会抛出异常 ServletRequestBindingException ;当 required设置为false,即使没有从request中获取到就忽略跳过,赋值为null;

  1. @RequestAttribute和@RequestParam和@RequestBody

参考文章

举报

相关推荐

.o和.a和.so

0 条评论