- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
4.5 重定向和 Flash 属性
作为一名经验丰富的 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(); }
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论