18.5 重定向和Flash属性
作为一个经验丰富的Servlet/JSP
程序员,必须知道转发和重定向的区别。转发比重定向快,因为重定向经过客户端,而转发没有。但是,有时采用重定向更好。
- 若需要引入到一个外部网站,则无法使用转发,因该使用重定向
- 另一个使用重定向的场景是避免在用户重新加载页面时再次调用同样的动作。
例如,在app18a
中,当提交产品表单时,saveProduct
方法将被调用,并执行相应的动作。在一个真实的应用程序中,这可能包括将所述产品加入到数据库中。但是,如果在提交表单后重新加载页面,saveProduct
就会被再次调用,同样的产品将可能被再次添加。为了避免这种情况,提交表单后,你可能更愿意将用户重定向到一个不同的页面。这个网页任意重新加载都没有副作用。例如,在app18a
中,可以在提交表单后,将用户重定向到一个ViewProduct
页面。
在app18b
中,ProductController
类中的saveProduct
方法以如下所示的行结束:
1 | return "redirect:/product_view/" + savedProduct.getId(); |
这里,使用重定向,而不是转发来防止当用户重新加载页面时,saveProduct
被二次调用。
使用重定向的一个不便的地方是:无法轻松地传值给目标页面。
而采用转发,则可以简单地将属性添加到Model
,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model
中的一切都在重定向时丢失。
幸运的是,Spring 3.1
版本以及更高版本通过Flash
属性提供了一种供重定向传值的方法。
要使用Flash
属性,必须在Spring MVC
配置文件中有一个<annotation-driven/>
元素。然后,还必须在方法上添加一个新的参数类型org.springframework.web.servlet.mvc.support.RedirectAttribute
。
下面的代码展示了更新后的saveProduct
方法。
使用Flash属性
1 | ( |
原文链接: 18.5 重定向和Flash属性