• struts2默认拦截器之prepare


    http://blogwarning.iteye.com/blog/1390172

    在struts2的struts-default.xml中定义了一个name为prepare拦截器,实现类是com.opensymphony.xwork2.interceptor.PrepareInterceptor,它的作用是为实现了com.opensymphony.xwork2.Preparable接口的action调用相关方法。该拦截器有两个参数:alwaysInvokePrepare,firstCallPrepareDo,两者的类型都是boolean,默认值分别是true,false。

    该拦截器的核心代码如下:

    Java代码  收藏代码
    1. public String doIntercept(ActionInvocation invocation) throws Exception {  
    2.     Object action = invocation.getAction();  
    3.     if (action instanceof Preparable) {  
    4.         try {  
    5.             String[] prefixes;  
    6.             if (firstCallPrepareDo) {  
    7.                 prefixes = new String[] {ALT_PREPARE_PREFIX, PREPARE_PREFIX};  
    8.             } else {  
    9.                 prefixes = new String[] {PREPARE_PREFIX, ALT_PREPARE_PREFIX};  
    10.             }  
    11.             PrefixMethodInvocationUtil.invokePrefixMethod(invocation, prefixes);  
    12.         }  
    13.         catch (InvocationTargetException e) {  
    14.             /* 
    15.              * The invoked method threw an exception and reflection wrapped it 
    16.              * in an InvocationTargetException. 
    17.              * If possible re-throw the original exception so that normal 
    18.              * exception handling will take place. 
    19.              */  
    20.             Throwable cause = e.getCause();  
    21.             if (cause instanceof Exception) {  
    22.                 throw (Exception) cause;  
    23.             } else if(cause instanceof Error) {  
    24.                 throw (Error) cause;  
    25.             } else {  
    26.                 /* 
    27.                  * The cause is not an Exception or Error (must be Throwable) so 
    28.                  * just re-throw the wrapped exception. 
    29.                  */  
    30.                 throw e;  
    31.             }  
    32.         }  
    33.         if (alwaysInvokePrepare) {  
    34.             ((Preparable) action).prepare();  
    35.         }  
    36.     }  
    37.     return invocation.invoke();  
    38. }  

    该代码的逻辑非常简单,如果action实现了com.opensymphony.xwork2.Preparable接口,则在调用setXXX和execute()方法之前调用系列方法。如果firstCallPrepareDo为true,则调用prepareDoXXX方法,否则调用prepareXXX方法(XXX为action对应的方法)。接下来查看alwaysInvokePrepare状态,如果其值为true则调用com.opensymphony.xwork2.Preparable接口的prepare方法。最后将action转交给下一个拦截器。

  • 相关阅读:
    WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
    TCP 流模式与UDP数据报模式(转)
    hibernate 检索方式
    【UVA】1449-Dominating Patterns(AC自己主动机)
    软件项目工作流程图
    iOS7 UIKit动力学-碰撞特性UICollisionBehavior 下
    东莞无人工厂变成现实,中国无人工厂将非常快普及,保住世界工厂地位
    小米手机与魅族的PK战结果 说明了什么
    python Debug 单步调试
    合并两个排序的单链表
  • 原文地址:https://www.cnblogs.com/lbangel/p/3094255.html
Copyright © 2020-2023  润新知