采用struts2防止重复提交后无法采用request.getParameter("xxx")得到页面隐藏框值解决方案


      采用struts2防止重复提交方案采用的是

http://blog.csdn.net/mzyp/archive/2009/07/15/4350512.aspx


      该方案采用后,后来有一次页面增加一个批量调度按钮,需要从该页面取得某隐藏框值,结果同事试了多种方案也未解决该问题,其中包括

0.        <action name="BatchSchedule" class="vs.dascsl.action.datatransfer.SchedulerAction" 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" class="vs.dascsl.action.datatransfer.SchedulerAction" 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解决了这一个难题。

     从后来应用效果来看:超赞^_^

    


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值