@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(); 
            // ...
        }
    }
}
相关文章
|
1月前
|
JavaScript 前端开发 索引
for in与for of的区别
for in与for of的区别
50 0
|
6月前
MTP3 和 MTP3B 的区别
【4月更文挑战第11天】
77 0
MTP3 和 MTP3B 的区别
|
6月前
|
索引
for each和for of的区别
for each和for of的区别
30 0
|
6月前
|
SQL 安全 Java
myabtis中#{} 和 ${} 的区别是什么
myabtis中#{} 和 ${} 的区别是什么
|
6月前
|
数据可视化 数据挖掘
jupternotebook和jupterLab有什么区别?
jupternotebook和jupterLab有什么区别?
696 0
|
存储
逻辑移位与算术移位的区别
用一句简单的话来说就是:逻辑移位不需要考虑符号位,算术移位需要考虑符号位,我们都知道。数在计算机中都是以补码的形式来存储的,这才造成了逻辑移位和算术移位的的差别。
321 0
|
JSON 数据格式
for...in/for...each/for...of的区别
for...in/for...each/for...of的区别
133 0
for...in/for...each/for...of的区别
|
算法 IDE Unix
C和C++的区别
C和C++的区别
196 0
@EnableEurekaClient上有@EnableDiscoveryClient区别
@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
936 0