SessionStatusMethodArgumentResolver
用于处理 @SessionAttributes
和 SessionStatus
的参数解析器。它通常用于在表单提交后清理会话属性,或者在跨多个请求的过程中管理会话状态。
业务场景:
假设你正在开发一个在线购物网站,用户可以浏览商品、添加商品到购物车、选择商品数量,并最终下单。在这个过程中,你可能需要在用户会话中存储购物车信息,并在用户完成购买后清理这些信息。
1. 定义购物车模型:
java
public class ShoppingCart {
private Map<Long, Integer> items = new HashMap<>();
// 标准的 getter 和 setter
public void addItem(Long productId, int quantity) {
items.put(productId, quantity);
}
public Map<Long, Integer> getItems() {
return items;
}
}
2. 创建控制器处理购物车:
java
import org.springframework.web.bind.annotation.*;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
@RequestMapping("/cart")
public class ShoppingCartController {
@ModelAttribute("cart")
public ShoppingCart cart() {
return new ShoppingCart();
}
@PostMapping("/add/{productId}")
public String addToCart(@RequestParam("quantity") int quantity,
@PathVariable Long productId,
@SessionAttribute("cart") ShoppingCart cart,
RedirectAttributes redirectAttributes) {
cart.addItem(productId, quantity);
redirectAttributes.addFlashAttribute("message", "Product added to cart");
return "redirect:/cart";
}
@GetMapping
public String showCart(Model model, @SessionAttribute("cart") ShoppingCart cart) {
model.addAttribute("cart", cart);
return "cart";
}
@PostMapping("/checkout")
public String checkout(@SessionAttribute("cart") ShoppingCart cart,
SessionStatus status) {
// 处理结账逻辑,保存订单等
status.setComplete(); // 清理购物车会话属性
return "checkout";
}
}
在这个控制器中,addToCart
方法用于添加商品到购物车,showCart
方法用于显示购物车中的商品列表,checkout
方法用于处理结账流程,并在完成购买后调用 SessionStatus
的 setComplete()
方法来清理会话中的购物车属性。
3. 配置 SessionAttributes
:
java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new SessionStatusMethodArgumentResolver());
}
}
在这个配置类中,我们添加了 SessionStatusMethodArgumentResolver
到 MVC 配置中,这样 Spring 就能够自动解析 SessionStatus
类型的参数。
4. 视图模板:
cart.html - 显示购物车内容:
html
<table>
<tr>
<th>Product ID</th>
<th>Quantity</th>
</tr>
<c:forEach var="entry" items="${cart.items}">
<tr>
<td>${entry.key}</td>
<td>${entry.value}</td>
</tr>
</c:forEach>
</table>
checkout.html - 结账页面:
html
<form action="/cart/checkout" method="post">
<button type="submit">Checkout</button>
</form>
总结:
SessionStatusMethodArgumentResolver
允许开发者在控制器方法中使用SessionStatus
对象来管理会话状态。- 它提供了一种机制来清理会话属性,例如在用户完成操作后不需要再保留的数据。
- 使用
SessionStatus
可以简化会话管理,避免内存泄漏,并提高应用程序的健壮性。