以下是书籍摘录" JSF 2.0:完整参考文献" (也见于Ed Burns' blog):
Michael Jouravlev在其有影响力的2004年8月的文章Redirect After Post中描述了许多Web应用程序存在的问题。他将问题描述如下:所有交互式程序都提供两个基本功能:获取用户输入并显示结果。 Web应用程序使用两种HTTP方法实现此行为:
POST
和GET
。当应用程序返回响应POST
请求的网页时,这个简单的协议就会被破坏。 POST方法的特殊性与不同浏览器的特性相结合,往往会导致令人不快的用户体验,并可能导致服务器应用程序的状态不正确。为了解决这个问题,Jouravlev描述了一种他称之为
POST-REDIRECT-GET
的技术,或简称为PRG模式。模式的规则如下:
- 从不显示回复
的网页POST
- 始终使用
加载页面GET
- 使用
从POST
GET
导航至REDIRECT
我们已经看到JSF违反了第一条规则,每个页面使用POST 从Servlet API通过
RequestDispatcher.forward()
方法导航。确实, 最流行的基于Java Servlet的Web框架,包括Struts,使用这种方法 导航。 HTTP纯粹主义者正确地指出这种方法违反了第一条规则 PRG模式。 JSF不仅违反了第一条规则,而且在JSF 2.0之前,它很难实现 做任何其他方式。感谢JBoss的Seam团队提供的另一个JSF贡献 现在用JSF更容易做PRG。
首先,我没有让自己解释他试图解决的问题。 (当应用程序返回响应POST请求的网页时协议如何被破坏)
其次,即使我非常清楚重定向是什么,POST
& GET
意味着,我面临的问题是什么,实质上会迫使我使用POST
从GET
导航到REDIRECT
我为什么要这样做(书摘&# 34; JSF 2.0:完整参考"续):
是否使用重定向在很大程度上取决于是什么 浏览器的地址栏中显示的内容很重要或者可能令人困惑 如果引用的页面不再与正在呈现的页面匹配。 何时使用重定向的另一个重要考虑因素是 性能。使用重定向将终止当前请求和 导致新的请求响应周期发生。如果页面有一个非常 大量的组件,这可能会有一个显着的性能 影响。重定向也可能需要额外往返 重新实例化已消失的任何请求范围的对象 下一个请求。