6.springMVC访问作用域

六.访问作用域

1.访问request作用域

@ModelAttribute(key)

该注解默认操作request作用域

  • 当该注解标注在方法的参数上时
    • 表示默认将当前的方法的参数存储到request作用域中
    • 可以在request作用域中对该参数的数据进行读写
    • 存储到request作用域中数据的key即为注解的参数
    • 存储到request作用域中数据的value即为参数的值
    • 当方法的参数是一个对象,且该对象没有被任何注解所标注的时候
      • 默认自动增加@ModelAttribute(key)注解
    • 该注解的参数也可以省略,默认使用当前方法参数的变量名
    • 当注解的key与参数的变量名不一致时,注解属性不能省略
  • 当该注解标注在方法上时
    • 此时该方法不需要添加@RequestMapping(url)注解
    • 表示当前方法并不是用于直接访问的,而是与其他方法共同被访问
    • 而是此时不管运行当前Controller中的哪一个方法
    • 都会先执行当前方法
    • 表示方法会在当前Controller中任意一个方法被调用时优先执行
      • 即:不管运行哪一个方法,都会先执行被@ModelAttribute(key)所标注的方法
    • 应用场景
      • 当一个Contoller中多个方法需要处理同一个业务的时候
      • 可以将这个业务封装到一个方法中,使用该注解进行标注
    • 此时数据在request中存储方式如下
      • 存储数据的key即为当前注解的参数
      • 存储数据的value即为当前方法的返回值
@Controller
@RequestMapping("/req")
public class HttpServletRequestController {

    @RequestMapping("/f1")
    public String f1(HttpServletRequest request){
        User user = new User();
        user.setUsername("admin");
        request.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("/f2")
    public String f2(User user){
        user.setUsername("f2");
        return "scope";
    }

    @RequestMapping("/f3")
    public String f3(@ModelAttribute User user){
        user.setUsername("f3");
        return "scope";
    }

    @RequestMapping("/f4")
    public String f4(@ModelAttribute("u") User user){
        user.setUsername("f4");
        return "scope";
    }


    @ModelAttribute("users")
    public List<User> f5(){
        List<User> users = new ArrayList<>();
        User user = new User();
        user.setId(1);
        user.setUsername("admin");

        User user2 = new User();
        user2.setId(2);
        user2.setUsername("alice");

        User user3 = new User();
        user3.setId(3);
        user3.setUsername("jack");

        users.add(user);
        users.add(user2);
        users.add(user3);
        return users;
    }
}

2.访问session作用域

@SessionAttributes(key)

  • 当类被@SessionAttribute(key)进行标注的时候
    • 表示当操作作用域的数据的时候,如果遇到key为注解的参数的时候
    • 将会在session中进行操作,此时request作用域中仍然存在数据
    • 当方法的参数没有添加注解@ModelAttribute的时候
      • 此时作用域中如果没有数据
      • 则不会自动添加@ModelAttribute注解,返回null
    • 当方法的参数添加注解@ModelAttribute的时候
      • 表示一定会从session作用域中取数据
      • 如果session作用域中没有数据,则报错
    • 当执行清除session的操作的时候
      • 如果当前类使用@SessionAttributes进行标注之后
        • 则无法使用原有的方式进行清除
        • 需要使用Spring提供的对象SessionStatus进行清除操作
        • 该方法只会单独清理session中的数据
        • 不会影响到原有的request中的数据
      • 当类没有使用@SessionAttribute进行标注的时候
        • 仍然可以使用HttpSession提供的方法进行清除
@Controller
@SessionAttributes("user")
@RequestMapping("/session")
public class SessionController {

    @RequestMapping("/f1")
    public String f1(HttpSession session){
        User user = new User();
        user.setId(1);
        user.setUsername("admin");
        session.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("/f2")
    public void f2(HttpSession session){
        User user = (User) session.getAttribute("user");
        System.out.println(user);
    }

    @RequestMapping("/f3")
    public String f3(User user){
        user.setUsername("admin");
        return "scope";
        // 此时的数据是存放在request作用域中的
        // 因为当参数是一个对象的时候,默认添加@ModelAttribute注解
        // 此时可以在类上加一个@SessionAttributes(key)注解
        // 表示当操作作用域的数据的时候,如果遇到key为注解的参数的时候
        // 将会在session中进行操作,此时request作用域中仍然存在数据
    }

    @RequestMapping("/f4")
    public void f4(User user){
        System.out.println(user.getUsername());
        // 当参数没有添加注解的时候,此时作用域中如果没有数据
        // 则不会自动添加@ModelAttribute注解
        // 则返回null
    }

    @RequestMapping("/f5")
    public void f5(@ModelAttribute User user){
        System.out.println(user.getUsername());
        // 当参数添加了注解之后,表示一定会从session作用域中取数据
        // 如果session作用域中没有数据,则报错
    }

    @RequestMapping("/f6")
    public String f6(HttpSession session){
        session.invalidate();
        return "scope";
        // 在做清除session数据的操作的时候
        // 如果当前类使用@SessionAttributes进行标注之后
        // 则无法使用原有的方式进行清除
        // 当类没有使用@SessionAttribute进行标注的时候
        // 仍然可以使用HttpSession提供的方法进行清除
    }

    @RequestMapping("/f7")
    public String f7(SessionStatus status){
        // 当类被@SessionAttributes标注的时候
        // 需要使用Spring提供的对象SessionStatus进行清除操作
        // 该方法只会单独清理session中的数据
        // 不会影响到原有的request中的数据
        status.setComplete();
        return "scope";
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值