[Bài đọc] Redirect và Flash Attributes

2. Spring MVC

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

Your email address will not be published.