切換語言為:簡體

詳解 @SessionAttributes 用處及在訂單場景中的應用

  • 爱糖宝
  • 2024-06-21
  • 2086
  • 0
  • 0

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,可以在完成表單處理後清理會話,避免不必要的資料保留。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.