返回介绍

4.5 重定向和 Flash 属性

发布于 2025-04-22 20:09:59 字数 1706 浏览 0 评论 0 收藏

作为一名经验丰富的 servlet/ JSP 程序员,必须知道转发和重定向的区别。转发比重定向快,因为重定向经过客户端,而转发没有。但是,有时采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。

使用重定向的另一个场景是避免在用户重新加载页面时再次调用同样的动作。例如,在 annotated1 中,当提交产品表单时,saveProduct 方法将被调用,并执行相应的动作。在一个真实的应用程序中,这可能包括将所述产品加入到数据库中。但是,如果在提交表单后重新加载页面,saveProduct 就会被再次调用,同样的产品将可能被再次添加。为了避免这种情况,提交表单后,你可能更愿意将用户重定向到一个不同的页面。这个网页任意重新加载都没有副作用。例如,在 annotated1 中,可以在提交表单后,将用户重定向到一个 ViewProduct 页面。

在 annotated2 中,ProductController 类中的 saveProduct 方法以如下所示的行结束:

return "redirect:/view-product/" + savedProduct.getId();

这里,使用重定向而不是转发来防止当用户重新加载页面时 saveProduct 被二次调用。

使用重定向的一个不便的地方是:无法轻松地传值给目标页面。而采用转发,则可以简单地将属性添加到 Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以 Model 中的一切都在重定向时丢失。好在,Spring 3.1 版本以及更高版本通过 Flash 属性提供了一种供重定向传值的方法。

要使用 Flash 属性,必须在 Spring MVC 配置文件中有一个<annotation-driven/>元素。然后,还必须在方法上添加一个新的参数类型 org.springframework.web.servlet.mvc.support. RedirectAttributes。清单 4.10 展示了更新后的 saveProduct 方法。

清单 4.10 使用 Flash 属性

@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(); }

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。