Spring学习笔记_45——@ControllerAdvice
Spring学习笔记_46——@InitBinder
Spring学习笔记_47——@RequestAttribute
文章目录
- @[toc]
- 1. 介绍
- 2. 场景
- 3. 源码
- 4. Demo
- 5. 补充
- 5.1 Model
- 5.2 Session
- 5.3 Cookie
- 5.4 总结
文章目录
- @[toc]
- 1. 介绍
- 2. 场景
- 3. 源码
- 4. Demo
- 5. 补充
- 5.1 Model
- 5.2 Session
- 5.3 Cookie
- 5.4 总结
1. 介绍
@SessionAttribute
注解作用于处理器类上,它允许开发者有选择地指定哪些模型属性需要存储到HTTP会话(Session)中,以便在多个请求之间共享这些数据。这通常用于需要跨多个页面或请求保持数据一致性的场景,如多步骤表单处理或向导式用户界面。
@SessionAttribute
注解指定属性名称就可以直接从当前Session的作用域中获取指定属性名称的值,
2. 场景
在基于SpringMVC或者SpringBoot开发Web应用程序时,如果不想通过HttpSession的getAttribute()方法从Session作用域中获取数据,而是直接通过指定的属性名称获取Session作用域中的属性值,从而实现与Servlet API进行解耦的目的
- 预填充表单数据:当用户访问一个表单页面时,可能需要从用户的会话中获取一些信息来预填充表单。例如,如果用户已经登录,可以从会话中获取用户名或用户ID等信息,并将其显示在表单中。
- 跨请求的数据共享:在一个多步骤的流程中(如一个多页的向导),可以将数据存储在会话中,然后在每个步骤之间传递这些数据,而不需要每次都通过表单或URL传递。
- 减少数据库查询:对于那些在多个请求中频繁使用的数据,可以考虑将它们存储在会话中,以减少对数据库的访问次数,提高应用性能。
3. 源码
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionAttribute {
// String类型的属性,用于指定在Session作用域中的属性的名称
@AliasFor("name")
String value() default "";
// String类型的属性,作用与value属性相同
@AliasFor("value")
String name() default "";
// boolean类型的属性,表示请求作用域中的属性是否必需
// true: 必需
// false: 非必需
// 如果为true,则当前请求域中没有对应的属性,就会抛出异常。
// 默认值为true
boolean required() default true;
}
4. Demo
在第一个请求中想Session中添加一个属性
@PostMapping("/login")
public String handleLogin(@RequestParam String username, @RequestParam String password, HttpSession session) {
// 假设这里进行了验证
User user = userService.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
session.setAttribute("user", user); // 将用户对象添加到会话中
return "redirect:/home";
} else {
return "loginError";
}
}
在第另一个Controller中使用
@Controller
@RequestMapping("/profile")
public class ProfileController {
@GetMapping
public String showProfile(@SessionAttribute("user") User user, Model model) {
model.addAttribute("user", user); // 将用户对象添加到模型中
return "profile"; // 返回视图名称
}
@PostMapping
public String updateProfile(@SessionAttribute("user") User user, @ModelAttribute User updatedUser, Model model) {
// 更新用户的某些属性
userService.updateUser(user.getId(), updatedUser);
model.addAttribute("user", updatedUser); // 更新后的用户对象
return "profile"; // 返回视图名称
}
}
5. 补充
5.1 Model
定义
Model
是一个接口,用于封装要传递给视图的数据。在 Spring MVC 中,Model
通常是一个 Map
,其中键是字符串,值是任意对象。控制器方法可以将数据添加到 Model
中,这些数据随后会被传递给视图进行渲染。
用途
- 数据传递:控制器方法将数据添加到
Model
中,以便视图可以使用这些数据进行渲染。 - 视图渲染:视图引擎(如 Thymeleaf、JSP 等)会从
Model
中提取数据并将其渲染成 HTML 页面。
5.2 Session
定义
Session
是一个 HTTP 会话,用于在多个请求之间保持状态。每个客户端连接到服务器时,服务器会创建一个唯一的会话标识符(通常是 cookies 中的一个 JSESSIONID),并将会话数据存储在服务器端。
用途
- 状态管理:在多个请求之间保持用户的状态信息,如用户身份、购物车内容等。
- 数据共享:在不同控制器方法之间共享数据,而不需要每次都通过 URL 或表单传递。
5.3 Cookie
定义
Cookie
是一种在客户端浏览器中存储小量数据的技术。每个 cookie 都有一个名称和一个值,并且可以设置过期时间、路径等属性。
用途
- 客户端存储:在客户端浏览器中存储少量数据,如用户偏好设置、会话标识符等。
- 跟踪用户:通过 cookie 可以跟踪用户的行为,如记录用户的登录状态、购物车内容等。
5.4 总结
- Model:用于在控制器和视图之间传递数据。
- Session:用于在多个请求之间保持状态信息,数据存储在服务器端。
- Cookie:用于在客户端浏览器中存储少量数据,数据存储在客户端。