SessionAttributes
註解它用於指定那些模型屬性應該被儲存在 HTTP 會話(Session)中。這對於在多個請求之間保持資料狀態非常有用,尤其是在表單提交和資料回顯的場景中。
業務說明:
考慮一個線上購物平臺,使用者需要填寫一個包含多個步驟的訂單表單。這個表單可能包括使用者資訊、收貨地址、支付方式等部分。我們希望使用者在填寫過程中,即使在不同頁面間跳轉,之前填寫的資訊也能夠被保留。
1. 定義訂單表單的資料模型:
public class OrderForm { private String customerName; private String shippingAddress; private PaymentMethod paymentMethod; // 標準的 getter 和 setter } public enum PaymentMethod { CREDIT_CARD, PAYPAL, BANK_TRANSFER }
2. 建立控制器使用 @SessionAttributes
註解:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.servlet.ModelAndView; @Controller @SessionAttributes("orderForm") // 將 OrderForm 儲存在會話中 public class OrderController { @GetMapping("/order") public ModelAndView showOrderForm(Model model) { model.addAttribute("orderForm", new OrderForm()); return new ModelAndView("orderForm"); } @PostMapping("/order/customer") public String submitCustomerInfo(@ModelAttribute("orderForm") OrderForm orderForm, RedirectAttributes redirectAttributes) { // 儲存客戶資訊到資料庫或其他儲存 redirectAttributes.addFlashAttribute("orderForm", orderForm); return "redirect:/order/shipping"; } @GetMapping("/order/shipping") public String showShippingForm(Model model) { model.addAttribute("orderForm", model.asMap().get("orderForm")); return "shippingForm"; } @PostMapping("/order/payment") public String submitPaymentInfo(@ModelAttribute("orderForm") OrderForm orderForm, SessionStatus status) { // 處理支付資訊 status.setComplete(); // 清除會話中的 OrderForm return "paymentResult"; } }
3. 建立表單的 HTML 頁面:
orderForm.html - 客戶資訊表單:
<form action="/order/customer" method="post"> <label for="customerName">Customer Name:</label> <input type="text" id="customerName" name="customerName" required> <button type="submit">Continue</button> </form>
shippingForm.html - 收貨地址表單:
<form action="/order/shipping" method="post"> <label for="shippingAddress">Shipping Address:</label> <input type="text" id="shippingAddress" name="shippingAddress" required> <button type="submit">Continue</button> </form>
paymentForm.html - 支付資訊表單:
<form action="/order/payment" method="post"> <label for="paymentMethod">Payment Method:</label> <select id="paymentMethod" name="paymentMethod" required> <option value="CREDIT_CARD">Credit Card</option> <option value="PAYPAL">PayPal</option> <option value="BANK_TRANSFER">Bank Transfer</option> </select> <button type="submit">Submit Payment</button> </form>
4. 處理表單提交:
在每個步驟中,表單資料被提交併透過 @ModelAttribute
繫結到 OrderForm
物件。使用 RedirectAttributes
在重定向後保留資料,然後在後續步驟中從會話中恢復資料。
總結:
@SessionAttributes
使得在使用者完成多步驟流程時,可以在不同請求之間保持表單狀態。它簡化了表單處理的程式碼,特別是對於跨多個頁面的表單。
透過使用
SessionStatus
,可以在完成表單處理後清理會話,避免不必要的資料保留。