Struts2框架之拦截器

1 Struts2框架拦截器的简介:

服务器启动时实例化"StrutsPrepareAndExecuteFilter", 读取struts所有的配置文件, 把struts.xml中的每一个action都实例化, 当一个请求访问的时候, "StrutsPrepareAndExecuteFilter"会把请求拦截下来, 匹配一个ActionMapper, 然后ActionMapper创建ActionProxy, 然后去执行默认拦截器栈, 再执行Action, 然后返回结果(有些拦截器需要做一些运行期的清理和监控工作, 后置拦截).

2 自定义拦截器:

创建一个自定义的拦截器类, 继承"com.opensymphony.xwork2.ActionInvocation"类

package com.rl.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        
        System.out.println("前置拦截...");
        //让拦截器走下去, 返回一个结果码
        String resultCode = arg0.invoke();
        System.out.println("后置拦截...");
        return resultCode;
    }
}

struts.xml配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true"></constant>
    
    <package name="person" extends="struts-default" namespace="/person">
    
    <!-- 配置拦截器 -->
        <interceptors>
            <interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
        </interceptors>
        
        <action name="save" class="com.rl.action.PersonAction1" method="save">
        <!-- 引用拦截器 -->
        <interceptor-ref name="myInterceptor"></interceptor-ref>
            <result name="success">/success.jsp</result>
            <result name="input">/form1.jsp</result>
        </action>
    </package>
</struts>

success.jsp页面的打印信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<%
    System.out.println("页面响应...");
%>
<h5>success</h5>
</body>
</html>

访问结果:

拦截器的执行顺序是: 前置拦截-->action动作类-->页面执行-->后置拦截

 

如果每个acting都要引用一次拦截器则太过繁琐, 解决方式:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true"></constant>
    
    <!-- 定义一个默认包
     -->
    <package name="basePackage" extends="struts-default" abstract="true">
        <interceptors>
        <!-- 定义一个自定义拦截器 -->
            <interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
            <!-- 定义一个自定义拦截器栈 -->
            <interceptor-stack name="rlStack">
            <!-- 拦截器栈里面默认拦截器和自定义拦截器(拦截器栈也可以引用过来) -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="myInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 配置默认拦截器栈为自定义拦截器栈 -->
        <default-interceptor-ref name="rlStack"></default-interceptor-ref>
    </package>
    
    <package name="person" extends="basePackage" namespace="/person">
    
        <action name="save" class="com.rl.action.PersonAction1" method="save">
            <result name="success">/success.jsp</result>
            <result name="input">/form1.jsp</result>
        </action>
    </package>
</struts>

以上配置则保证所有action都会使用"com.rl.interceptor.MyInterceptor", 如果有某些action不需要, 则需让自定义的拦截器类继承"com.opensymphony.xwork2.interceptor.MethodFilterInterceptor"

拦截器类:

package com.rl.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyInterceptor2 extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation arg0) throws Exception {
        
        System.out.println("前置拦截2...");
        //让拦截器走下去, 返回一个结果码
        String resultCode = arg0.invoke();
        System.out.println("后置拦截2...");
        return resultCode;
    }
}

"struts.xml"配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true"></constant>
    
    <!-- 定义一个默认包
     -->
    <package name="basePackage" extends="struts-default" abstract="true">
        <interceptors>
        <!-- 定义一个自定义拦截器 -->
            <interceptor name="myInterceptor" class="com.rl.interceptor.MyInterceptor"></interceptor>
            <interceptor name="myInterceptor2" class="com.rl.interceptor.MyInterceptor2"></interceptor>
            <!-- 定义一个自定义拦截器栈 -->
            <interceptor-stack name="rlStack">
            <!-- 拦截器栈里面默认拦截器和自定义拦截器(拦截器栈也可以引用过来) -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="myInterceptor"></interceptor-ref>
                <interceptor-ref name="myInterceptor2"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 配置默认拦截器为自定义拦截器栈 -->
        <default-interceptor-ref name="rlStack"></default-interceptor-ref>
    </package>
    
    <!-- 继承默认包
     -->
    <package name="person" extends="basePackage" namespace="/person">
    
        <action name="save" class="com.rl.action.PersonAction1" method="save">
            <result name="success">/success.jsp</result>
            <result name="input">/form1.jsp</result>
        </action>
        <action name="delete" class="com.rl.action.PersonAction1" method="delete">
        <!-- 配置要排除的拦截器栈 -->
            <interceptor-ref name="rlStack">
            <!-- 
            "要排除的拦截器名".excludeMethods
            "delete": 方法名, 防止如果action标签中没有指定method的情况
             -->
                <param name="myInterceptor2.excludeMethods">delete</param>
            </interceptor-ref>
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值