读书人

施用redirect避免重复提交 ,struts1.x

发布时间: 2012-09-10 22:20:12 作者: rapoo

使用redirect避免重复提交 ,struts1.x struts2.x

?

?

?

避免重复提交这个问题在Web应用开发领域应该是一个老生常谈的问题了,主流的一些Web应用框架也提供了方便使用的功能来实现这个需求,比如Struts的Token。但是有些时候,可能用户确实需要刷新提交之后所转到的页面,比如假设如下的需求:用户注册了一个账号,但是这个账号需要管理员批准才可以进行工作,于是,用户在注册页面填写了详细信息之后,提交,转到详细信息页面,然后刷新这个页面来查看自己的状态。此时,我觉得使用redirect是非常方便的。

以下是redirect在Struts1和Struts2中的实现:

?

Struts1

在Struts1中,有一个org.apache.struts.action.ActionRedirect的类,这个类是ActionForward类的子类,是专门用来做redirect跳转的。使用起来非常的简单,只需在你的Action类的方法中,返回一个ActionRedirect类的实例即可。

----------------------------------------------------

ActionRedirect redirect = new ActionRedirect(mapping.findForward("detailAction")); // 这里是在struts-config.xml文件中定义的<forward>节点的name属性
??????? redirect.addParameter("id", user.getId()); //这里是要在url后面附加的参数名称及其值

return redirect;

----------------------------------------------------

?

Struts2:

在Struts2中,情况有所不同。但是Struts2里面的方式,更加的合理,因为不需要在Action代码中编码来完成,完全是通过配置完成的。在配置文件struts.xml中,

----------------------------------------------------

??????? <action name="userCreate" method="create" type="redirect-action">
??????????????? <param name="actionName">userDetail</param>
??????????????? <param name="namespace">/</param>
??????????????? <param name="parse">true</param>
??????????????? <param name="user.id">${user.id}</param>
??????????? </result>
??????? </action>
??????? <action name="userDetail" method="detail" type="redirect"> <param name="location">foo.jsp</param> <param name="parse">false</param></result>

<package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters">   <-- Pass parameters (reportType, width and height) -->   <!--   The redirect-action url generated will be :   /genReport/generateReport.jsp?reportType=pie&width=100&height=100   -->   <action name="gatherReportInfo" type="redirect">         <param name="location">generateReport.jsp</param>         <param name="namespace">/genReport</param>         <param name="reportType">pie</param>         <param name="width">100</param>         <param name="height">100</param>      </result>   </action></package>

----------------------------------------------------
另外,对于比如查询统计这样的功能,用户刷新页面的几率是非常大的,这种情况下,建议使用get方式来提交form,以避免IE那个总是跳出来的对话框。

相比于forward方式的跳转而言,redirect的跳转会在浏览器地址栏暴露更多的信息,可能会被使用者恶意篡改,所以在使用redirect的时候,要对数据在后台进行更加严格和全面的校验。

?

以下是实验代码的链接,在压缩包中,去掉了struts相关的lib包,如果要在本地运行这个实验应用,只需把对应struts版本的struts<version>-blanck-<version>.war里面的lib目录下的jar文件取出则可。

实验在Windows XP SP2, resin-3.2.1, Sun JDK 1.5, struts 1.2.9/struts 2.0.11.1下运行通过。如果是使用struts1,需要把应用编译成Java 1.4格式的(如果是使用Eclipse,只需修改应用的compile level即可)。

?

转载: http://www.blogjava.net/yoda/archive/2009/01/12/250931.html

读书人网 >编程

热点推荐