[Bài đọc] Redirect và Flash Attributes
Là một lập trình viên chuyên nghiệp Servlet/JSP, bạn cần phân biệt được sự khác nhau giữa forward và redirect. Forward nhanh hơn redirect bởi vì redirect yêu cầu một chuyến khứ hồi tới server còn forward thì không cần. Tuy nhiên có những trường hợp sử dụng redirect sẽ tốt hơn. Một trong số đó là khi bạn cần chuyển hướng tới một trang web ở bên ngoài như một trang web khác. Bạn không thể sử dụng forward để chuyển hướng mục tiêu là trang web bên ngoài, do vậy redirect là lựa chọn duy nhất của bạn.
Một trường hợp khác khi bạn muốn sử dụng redirect thay vì forward là khi bạn muốn tránh gọi lại cùng action khi người dùng reload lại trang. Ví dụ, khi người dùng submit form Product , phương thức saveProduct () sẽ được gọi và thực hiện các xử lý trong nó. Trong ứng dụng thực tế thì phương thức này sẽ thực hiện thêm product vào cơ sở dữ liệu.
Tuy nhiên nếu bạn tải lại trang sau khi thực hiện submits form, phương thức saveProduct sẽ bị gọi lại và cùng một product sẽ được thêm vào lần nữa. Để tránh điều này, sau khi submit form bạn nên sử dụng redirect để người dùng chuyển sang một trang khác. Trang khác này yêu cầu phải không ảnh hưởng khi reload lại trang. Cụ thể, bạn có thể để người dùng redirect về trang ViewProduct sau khi submit form.
Ví dụ:
return "redirect:/view-product/" + savedProduct.getId();
Ở đây bạn sử dụng redirect thay vì forward để ngăn phương thức saveProduct() bị gọi nhiều lần khi người dùng tải lại trang.
Một điểm là khi bạn sử dụng redirect sẽ khó khăn trong việc chuyển giá trị tới trang khác. Với forward, bạn có thể dễ dàng thêm các thuộc tính vào đối tượng Model và đối tượng đó sẽ được truy cập bởi view. Mặc dù redirect là một chuyến khứ hồi tới server nhưng mọi thứ trong Model sẽ mất khi bạn sử dụng redirect . May mắn là từ phiên bản Spring 3.1 tạo ra một cách để giữ các giá trị khi sử dụng redirect bằng cách sử dụng flash attributes.
Để sử dụng flash attributes bạn phải thêm annotation @EnableWebMvc trong lớp cấu hình Spring MVC. Và sau đó bạn phải thêm mới một đối số thuộc kiểu org.springframework.web.servlet.mvc.support.RedirectAttributes vào phương thức của bạn.
Phương thức saveProduct trong lớp ProductController như sau:
@RequestMapping(value = "save-product", method = RequestMethod.POST)
public String saveProduct(ProductForm productForm,
RedirectAttributes redirectAttributes) {
logger.info("saveProduct called");
// no need to create and instantiate a ProductForm
// create Product
Product product = new Product();
product.setName(productForm.getName());
product.setDescription(productForm.getDescription());
try {
product.setPrice(new BigDecimal(productForm.getPrice()));
} catch (NumberFormatException e) {
}
// add product
Product savedProduct = productService.add(product);
redirectAttributes.addFlashAttribute("message",
"The product was successfully added.");
return "redirect:/view-product/" + savedProduct.getId();
}
Leave a Reply