采用struts2防止重复提交后无法采用request.getParameter("xxx")得到页面隐藏框值解决方案(转)
采用struts2防止重复提交后无法采用request.getParameter("xxx")得到页面隐藏框值解决方案
?
????? 采用struts2防止重复提交方案采用的是
http://blog.csdn.net/mzyp/archive/2009/07/15/4350512.aspx
?
????? 该方案采用后,后来有一次页面增加一个批量调度按钮,需要从该页面取得某隐藏框值,结果同事试了多种方案也未解决该问题,其中包括
0.??????? <action name="BatchSchedule" method="batchSchedule">
?????????? <!--<interceptor-ref name="completeStack"/>? -->
?????????? <!--<interceptor-ref name="execAndWait"/>-->
?????????? <!--? 此段代码为作用是将request请求的参数传递到 action 中 -->????
?????????? <!--<interceptor-ref name="model-driven"/>???????? -->??????????
?????????? <!--<interceptor-ref name="params"/>?????????? -->
????????? <!-- <result name="wait">jsp/ds_dm_mgr/wait.jsp</result>? -->??
?????????? <result name="error" type="redirect-action">SchedulersList</result>
?????????? <result name="success" type="redirect-action">SchedulersList</result>
??????? </action>
他又试了加上 <interceptor-ref name="servletConfig"></interceptor-ref> 用两种方式也得不到request,
1.HttpServletRequest request = ServletActionContext.getRequest();
2.HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
?
???? 经过一番努力,我终于解决该问题,JSP及相关JAVA文件都没有改变,只改了struts.xml一个地方,参见如下:
??????? <action name="BatchSchedule" method="batchSchedule">
?????????? <interceptor-ref name="completeStack"/>
?????????? <interceptor-ref name="execAndWait"/>
?????????? <interceptor-ref name="alias"/> <!--就加了此句-->
?????????? <result name="wait">jsp/ds_dm_mgr/wait.jsp</result>??????????????
?????????? <result name="error" type="redirect-action">SchedulersList</result>
?????????? <result name="success" type="redirect-action">SchedulersList</result>
??????? </action>
理论来源于
浅谈Struts2拦截器的原理与实现
???? 开始,我对解决该问题也没有把握,当看到上述资料中 有“ Alias Interceptor 在不同请求之间将请求参数在不同名字件转换,请求内容不变”,我看到一丝亮光,只有亮光当然还不行,经过几轮测试,这个亮光终于变成了康庄大道。
?????
后记:
???? 以上方案又经严格测试,发现不够稳定。
???? 最终方案返璞归真:定义一个私有变量,变量与jsp页面隐藏框名称相同,并增加get/set方法。
???? 至于我同事提出的原来写法有
????? ServletContext ctx = request.getSession().getServletContext();??
???? 由于request得不到,所以这种方式得到 ServletContext更是无从谈起!
???? 我解决方案如下:
???? 原来由于公共action已经写有
????????? public class BaseAction extends ActionSupport implements SessionAware,???
????????? ServletRequestAware, ServletResponseAware{
?????????????? .........
????????? }
??? 我又增加了一个实现接口类ServletContextAware,也即
????????? public class BaseAction extends ActionSupport implements SessionAware,???
????????? ServletRequestAware, ServletResponseAware ,ServletContextAware {
???????????? .......
???????????? protected ServletContext context;
???????????? public void setServletContext(ServletContext arg0) {
?????????????????? this.context = arg0;???
???????????? }??????????????????????
?
?????????????????? .........
????????? }
???? 由于 SchedulerAction继承于 BaseAction,故可直接引用context解决了这一个难题。
???? 从后来应用效果来看:超赞^_^
?
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mzyp/archive/2009/08/13/4437750.aspx