本文主要是介绍struts中redirect与dispatch的区别(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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):
使用以上这个配置,当用户结账的时候,浏览器最终的位置将会是order-confirmation.jsp。这意味着重新装载该页面并不会导致结账的动作再次被触动,但是,order-confirmation.jsp页面得不到action类中包含的数据。<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp</result>
</action>
为了解决上述这两个问题:防止表单重复提交和在redirect下得到action类中包含的数据。提出下面两个方案(最后一个方案比较推荐)
方案一:对配置做如下改动:
方案二:重定向至另一个action,具体配置如下:<action name=“checkoutorder” class="org.eliot.CheckoutOrder">
<result name="success" type="redirect">order-confirmation.jsp?confirmationNumber= ${confirmationNumber}</result>
</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中包含的数据。该解决技巧极力推荐。
这篇关于struts中redirect与dispatch的区别(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!