天天看点

[Java web]-- struts2(5)

1.拦截器  类似于Filter
   :旨在拦截Action,抽取多个Action中的重复的冗余的功能。
 ===============================================================================================
 2.拦截器开发:
   2.1 定义拦截器类
        implements Interceptor{
 /**
 * 销毁方法
 */
 public void destroy() {
 }
 /**
 * 初始化方法
 */
 public void init() {
 }
 /**
 *拦截器的主体逻辑:Action中重复功能的抽取 
 *param ai:
 *       //获取值栈,进而可以通过值栈获取需要的数据,进行相关的功能处理
 ValueStack vs=ai.getStack();
 //重复功能处理完毕后,如果没有非法环节,则放行:使请求继续进行
 ai.invoke();
 */
 public String intercept(ActionInvocation ai) throws Exception {
 //获取值栈,进而可以通过值栈获取需要的数据,进行相关的功能处理
 ValueStack vs=ai.getStack();
 //重复功能处理完毕后,如果没有非法环节,则放行:使请求继续进行
 ai.invoke();
 //返回值作用:在出现非法操作后,通过返回值,选择跳转错误视图
 //一旦调用了ai.invoke(),则已放行,则返回值失去意义
 return null;
 }
   }
   2.2 配置,引用拦截器:
 <!-- 声明拦截器 -->
 <interceptors>
 <!-- 声明拦截器 -->
 <interceptor name="inter35" class="com.c35.interceptor.MyInterceptor"></interceptor>
 </interceptors>
 <action name="action1" class="com.c35.action.MyAction1" method="query">
 <!-- 引用拦截器 -->
 <interceptor-ref name="inter35"></interceptor-ref>
 <result name="queryok">/index.jsp</result>
 </action>
   2.3 细节:
       *拦截器中的:ai.invoke();执行后续的流程(后续的拦截器,或Action)
  *<action name="action1" class="com.c35.action.MyAction1" method="query">
 <!-- 引用拦截器 -->
 <interceptor-ref name="inter36"></interceptor-ref>
 <interceptor-ref name="inter35"></interceptor-ref>
 <result name="queryok">/index.jsp</result>
 </action>
 如上:拦截器的引用顺序是inter36 --> inter35 ,则执行顺序和引用顺序一致,也会先执行
      inter36之后执行inter35
  *在拦截调用链中,如果中途某一个拦截器没有ai.invoke(),即此拦截器中断了请求,则后续的
   所有的拦截器及Action都不会执行,而是通过此拦截器的return xx;选择错误视图
  *拦截器只限当前包的Action使用
   2.4 拦截器栈:将多个拦截器定义在一个栈中,以栈为单位整体引用拦截器
       *<interceptors>
 <!-- 声明拦截器 -->
 <interceptor name="inter35" class="com.c35.interceptor.MyInterceptor"></interceptor>
 <interceptor name="inter36" class="com.c35.interceptor.MyInterceptor2"></interceptor>
 <!-- 声明拦截器栈:打包零散的拦截器 -->
 <interceptor-stack name="interS">
 <interceptor-ref name="inter35"></interceptor-ref>
 <interceptor-ref name="inter36"></interceptor-ref>
 </interceptor-stack>
 </interceptors>
  *<action name="action1" class="com.c35.action.MyAction1" method="query">
 <!-- 引用拦截器栈 -->
 <interceptor-ref name="interS"></interceptor-ref>
 <result name="queryok">/index.jsp</result>
 <result name="error35">/error.jsp</result>
 </action>
   2.5 默认拦截器栈
 <!-- 声明默认栈 :将某个拦截器栈,制定为默认栈,即此栈中的所有拦截器默认拦截该包中所有的Action
 把拦截器栈:interS  制定为了当前包的默认栈,则interS栈中的所有拦截器会默认拦截当前包
 中的所有Action。
 -->
 <default-interceptor-ref name="interS"></default-interceptor-ref>
 *细节:
 1.如果某个Action已经单独引用了拦截器:
    <action name="action1" class="com.c35.action.MyAction1" method="query">
 <interceptor-ref name="inter35"></interceptor-ref> 
 <result name="queryok">/index.jsp</result>
 <result name="error35">/error.jsp</result>
 </action>
  则默认拦截器栈对其失效。
 2.在添加自定义拦截器时,为保证系统拦截器不失效,将系统栈添加到自定义栈中
    <!-- 声明拦截器栈:打包零散的拦截器 -->
 <interceptor-stack name="interS">
 <!-- 将系统默认栈加入到自定义的拦截器栈中 -->
 <interceptor-ref name="defaultStack"></interceptor-ref>
 <interceptor-ref name="inter35"></interceptor-ref>
 <interceptor-ref name="inter36"></interceptor-ref>
 </interceptor-stack>
 然后用此栈去拦截Action,既保证了自定义拦截器有效,有保证了系统功能不丢失
 (为Action引用自定义拦截器时,要加上系统拦截器栈:defaultStack)
 =============================================================================================
 3.拦截粒度更精确:方法拦截器,以Action中的方法为单位进行拦截
    3.1定义类:
         extends MethodFilterInterceptor{
 @Override
 protected String doIntercept(ActionInvocation ai) throws Exception {
 System.out.println("method interceptor");
 ai.invoke();//放行
 return null;
 }
 }
 3.2配置:
    <!-- 声明方法拦截器 -->
     <interceptors>
     <interceptor name="methodInter" class="com.c35.interceptor.MyMethodInterceptor">
     <!-- 指定方法拦截器要拦截的方法,或不拦截的方法 -->
     <!-- <param name="includeMethods">insert,update,delete</param> -->
     <param name="excludeMethods">query</param>
     </interceptor>
     </interceptors>
 <action name="method35_*" class="com.c35.action.MyAction3" method="{1}">
     <!-- 引用拦截器 -->
     <interceptor-ref name="methodInter"></interceptor-ref>
     <interceptor-ref name="defaultStack"></interceptor-ref>
     <result name="queryok">/index.jsp</result>
     <result name="updateok">/index.jsp</result>
     <result name="insertok">/index.jsp</result>
     <result name="deleteok">/index.jsp</result>
     </action>
 ==============================================================================================      

继续阅读