[url]http://blog.youkuaiyun.com/zrzlxln/archive/2009/04/17/4087993.aspx[/url]
最近一直在学习WebWork,学习了result类型之后,对dispatcher和redirect做个比较。
1.讲讲它们各自的工作原理
重定向的工作原理:通过在HTTP头把一个302的HTTP返回码和新的位置一并发送至浏览器,然后浏览器将自动发出一个指向这个新位置的HTTP请求。
dispatcher result的工作原理:它发出一个内部的对资源的请求,只通过一个请求为浏览器生成最终的视图。
2.通过一个购买在线书籍的例子进行说明,这一区别相当重要。
假设有以下配置(dispatcher result):
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success">order-confirmation.jsp</result>
</action>
这个时候用户单击了结账的按钮---链接至/checkoutorder.action----账单被处理并且显示一个确认的页面。这意味着如果用户单击了浏览器的刷新按钮,账单将会再次被结付----这并不是用户最期待的结果。
接下来,看看另外一个配置(redirect):
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp</result>
</action>
使用以上这个配置,当用户结账的时候,浏览器最终的位置将会是order-confirmation.jsp。这意味着重新装载该页面并不会导致结账的动作再次被触动,但是,order-confirmation.jsp页面得不到action类中包含的数据。
为了解决上述这两个问题:防止表单重复提交和在redirect下得到action类中包含的数据。提出下面两个方案(最后一个方案比较推荐)
方案一:对配置做如下改动:
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp?confirmationNumber= ${confirmationNumber}</result>
</action>
方案二:重定向至另一个action,具体配置如下:
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">confirmation.action?confirmationNumber= ${confirmationNumber}</result>
</action>
<action name="confirmation" class="org.eliot.Confirmation">
<result name="success">order-confimation.jsp</result>
</action>
这个配置完全解决了表单重复提交。这是因为confirmation action只是一个简单的的读取动作的action。同时也得到了action中包含的数据。该解决技巧极力推荐。
最近一直在学习WebWork,学习了result类型之后,对dispatcher和redirect做个比较。
1.讲讲它们各自的工作原理
重定向的工作原理:通过在HTTP头把一个302的HTTP返回码和新的位置一并发送至浏览器,然后浏览器将自动发出一个指向这个新位置的HTTP请求。
dispatcher result的工作原理:它发出一个内部的对资源的请求,只通过一个请求为浏览器生成最终的视图。
2.通过一个购买在线书籍的例子进行说明,这一区别相当重要。
假设有以下配置(dispatcher result):
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success">order-confirmation.jsp</result>
</action>
这个时候用户单击了结账的按钮---链接至/checkoutorder.action----账单被处理并且显示一个确认的页面。这意味着如果用户单击了浏览器的刷新按钮,账单将会再次被结付----这并不是用户最期待的结果。
接下来,看看另外一个配置(redirect):
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp</result>
</action>
使用以上这个配置,当用户结账的时候,浏览器最终的位置将会是order-confirmation.jsp。这意味着重新装载该页面并不会导致结账的动作再次被触动,但是,order-confirmation.jsp页面得不到action类中包含的数据。
为了解决上述这两个问题:防止表单重复提交和在redirect下得到action类中包含的数据。提出下面两个方案(最后一个方案比较推荐)
方案一:对配置做如下改动:
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp?confirmationNumber= ${confirmationNumber}</result>
</action>
方案二:重定向至另一个action,具体配置如下:
<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">confirmation.action?confirmationNumber= ${confirmationNumber}</result>
</action>
<action name="confirmation" class="org.eliot.Confirmation">
<result name="success">order-confimation.jsp</result>
</action>
这个配置完全解决了表单重复提交。这是因为confirmation action只是一个简单的的读取动作的action。同时也得到了action中包含的数据。该解决技巧极力推荐。