@SessionAttributes 和 @SessionAttribute的区别

简介: @SessionAttributes 和 @SessionAttribute的区别

@SessionAttributes 和 @SessionAttribute的区别


Spring MVC中有两个长得非常像的注解:@SessionAttributes 和 @SessionAttribute。

我们先看下@SessionAttributes的定义:


@SessionAttributes用于在请求之间的HTTP Servlet会话中存储model属性。 它是类型级别的注解,用于声明特定控制器使用的会话属性。


这通常列出应透明地存储在会话中以供后续访问请求的模型属性的名称或模型属性的类型。


举个例子:


@SessionAttributes("user")
public class LoginController {
  @ModelAttribute("user")
  public User setUpUserForm() {
    return new User();
  }
}


我们可以看到@SessionAttributes是类注解,他用来在session中存储model。 如上面的例子,我们定义了一个名为“User”的model并把它存储在Session中。


@SessionAttribute的定义:


如果您需要访问全局存在(例如,在控制器外部(例如,通过过滤器)管理)并且可能存在或可能不存在的预先存在的会话属性,则可以在方法参数上使用@SessionAttribute注释,例如 以下示例显示:


@Controller
@RequestMapping("/user")
public class UserController {
   /*
    * Get user from session attribute
    */
   @GetMapping("/info")
   public String userInfo(@SessionAttribute("user") User user) {
      System.out.println("Email: " + user.getEmail());
      System.out.println("First Name: " + user.getFname());
      return "user";
   }
}


@SessionAttribute只是获取存储在session中的属性。如果要设置(添加删除)session的属性,则要考虑将org.springframework.web.context.request.WebRequest或javax.servlet.http.HttpSession注入到控制器方法中。


@SessionAttributes中绑定的model可以通过如下几个途径获取:


  • 在视图中通过request.getAttribute或session.getAttribute获取
  • 在后面请求返回的视图中通过session.getAttribute或者从model中获取
  • 自动将参数设置到后面请求所对应处理器的Model类型参数或者有@ModelAttribute注释的参数里面。


@SessionAttributes用户后可以调用SessionStatus.setComplete来清除,这个方法只是清除SessionAttribute里的参数,而不会应用Session中的参数。


@Controller
@SessionAttributes("pet") 
public class EditPetForm {
    // ...
    @PostMapping("/pets/{id}")
    public String handle(Pet pet, BindingResult errors, SessionStatus status) {
        if (errors.hasErrors) {
            // ...
        }
            status.setComplete(); 
            // ...
        }
    }
}
相关文章
|
6月前
for in 和 for of的区别
for in 和 for of的区别
1982 3
|
7月前
|
编译器
self.***和_***的使用和区别
self.***和_***的使用和区别
48 0
|
7月前
MTP3 和 MTP3B 的区别
【4月更文挑战第11天】
82 0
MTP3 和 MTP3B 的区别
|
JavaScript 小程序
bindtap和catchtap的区别?
在微信小程序中,bindtap 和 catchtap 都是用于绑定点击事件的属性,但它们在事件冒泡和事件捕获方面有所不同。
|
安全 C#
C#委托事件的区别
C#委托事件的区别
172 0
|
JSON 数据格式
for...in/for...each/for...of的区别
for...in/for...each/for...of的区别
138 0
for...in/for...each/for...of的区别
|
算法 IDE Unix
C和C++的区别
C和C++的区别
199 0
<T>和<?>区别
简要讲述一下<T>和<?>区别,以及<T>的用法
<T>和<?>区别
|
JavaScript 前端开发 索引
for...in和for...of的区别
前言 在JavaScript中遍历数组通常是使用for...i循环,在ES5具有遍历数组功能的还有forEach、map、filter、some、every、reduce、reduceRight等。 for...in和for...of是两种增强型循环,for...in是ES5标准,在ES6中新增了for...of的循环方式。
119 0
for...in和for...of的区别
rsaCheckV2 和rsaCheckV1的区别分享
说明: 目前支付宝的SDK验签方法主要有两种一种是rsaCheckV1一种是rsaCheckV2 两种验签方法用于不同的接口的返回参数验签 1.rsaCheckV1验签方法   rsaCheckV1验签方法主要用于支付接口的返回参数的验签比如:当面付,APP支付,手机网站支付,电脑网站支付 这些接口都是使用rsaCheckV1方法验签的 2.
3629 11
下一篇
DataWorks