`

WebWork Result Type :dispatcher和redirect的区别

    博客分类:
  • J2EE
阅读更多
http://blog.csdn.net/zrzlxln/archive/2009/04/17/4087993.aspx


最近一直在学习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中包含的数据。该解决技巧极力推荐。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics