struts中redirect与dispatch的区别

对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中包含的数据。该解决技巧极力推荐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值