[精]Preparable接口和自定义拦截器总结

Struts2的Action在实现com.opensymphony.xwork2.Preparable接口后,就可以重写prepare()方法此时在Action中,prepare()方法的执行点是在:setXxx()和execute()的执行之前比如需求:在执行Action的方法前,接收前台隐藏域传过来的值,再根据该值执行相应逻辑如前台传过来ID,我们根据ID查找数据库对应的用户信息,再跳转到modify()中修改信息但实际的运行过程中发现,通过Debug断点调试得知prepare()方法接收到的ID值是零即前台隐藏域中的ID值没有传过来,事实上问题就出在默认的defaultStack拦截器栈上其实defaultStack无法接收prepare()需要的数据,而应借助paramsPrepareParamsStack拦截器栈事实上使用prepare拦截器之前,应先调用params拦截器,prepare()才能接收到表单数据基于这个思路,于是可以通过各种手段将params拦截器放置在prepare拦截器之前即可比如将defaultStack中的所有拦截器拷贝到struts.xml的我们自定义的myStack拦截器栈中再按照paramsPrepareParamsStack拦截器栈中的params和prepare顺序修改二者位置即可。

 

1.拦截器类

@SuppressWarnings("unchecked")  

    public    class TrainingInterceptor  extends AbstractInterceptor{  

        @Override  

        public String intercept(ActionInvocation invocation) throws Exception {  

             String result="nologin";  

             logger.error("拦截器前");   

            HttpServletRequest request = ServletActionContext.getRequest();  

            HttpSession session = request.getSession();  

            Object object=session.getAttribute("SALESMAN");  

            if (object!=null) {  

              result=invocation.invoke();  

            }  

             logger.error("拦截器后");   

            return result;  

        }  

 

    }

 

 

 

2.实现Preparable接口的action

 public     class PublicAction extends ActionSupport implements Preparable{   

    public PublicAction(){  

       logger.error("bbb");}  

public    void prepare() throws Exception {  

logger.error("aaaaaaa");  

}

 

 

 

情况1action配置上拦截器输出日志:   

09:53:40,788 ERROR [PublicAction] bbb

09:53:40,789 ERROR [TrainingInterceptor] 拦截器前

09:53:40,789 ERROR [TrainingInterceptor] 拦截器后

很显然prepare()方法没有走。

 

 

 

情况2action去掉上拦截器输出日志:   

09:56:42,999 ERROR [PublicAction] bbb

09:56:55,054 ERROR [PublicAction] aaaaaaa

这次prepare()方法走了。

 

 

 

3.推翻原有(上述观点)

原有观点:使用时特别注意:(自定义拦截器能和此接口一起使用,否则此接口无效)

现有观点:原有观点错误,如下,我配置拦截器错误,原先是只配置了我自定义的拦截器,没有配置公共总的拦截器,所以就等于没有配置struts默认的拦截器,而Preparable接口的实现就是stuts2默认拦截器中的一个,所有就没有走,造成我原有的那种观点。现在好了,都走了,

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值