关闭

struts2学习笔记(5)---自定义拦截器

标签: struts2自定义拦截器
770人阅读 评论(0) 收藏 举报
分类:

什么是拦截器?

struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器。其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作。

实现原理

当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

拦截器的执行流程

1、对Action进行预处理。(正序执行)
2、拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定)。
3、对Action进行后期处理。(倒序执行)

源码:自定义拦截器

方法一:实现Interceptor接口,重写其方法

package org.Test.interceptor;

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

public class TestInterceptor1 implements Interceptor { //实现Interceptor接口

    public TestInterceptor1() { // 构造方法,服务器启动时就生成一个interceptor实例
        System.out.println("TestInterceptor1 cons");
    }

    @Override
    public void destroy() { // 类似于析构方法,用于释放资源
        System.out.println("TestInterceptor1 destory");
    }

    @Override
    public void init() { // 服务器启动时被调用来初始化一些相关资源,类似于构造方法
        System.out.println("TestInterceptor1 init");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("TestInterceptor1 intercept go"); // 开始执行该拦截器
        String resultName = invocation.invoke(); // 执行下一个拦截器或执行Action的execute()方法
        System.out.println("TestInterceptor1 intercept back"); // 返回该拦截器

        System.out.println("TestInterceptor1 resultName:" + resultName); // 打印调用的下一个拦截器或Action的返回值
        return resultName;
    }

}

方法二:继承MethodFilterInterceptor类,重写doIntercept()方法

package org.Test.interceptor;

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

public class TestInterceptor2 extends AbstractInterceptor{  //继承AbstractInterceptor,无需重写init(),destroy()方法

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("TestInterceptor2 intercept go");
        String resultName = invocation.invoke();
        System.out.println("TestInterceptor2 intercept back");

        System.out.println("TestInterceptor2 resultName:" + resultName);
        return resultName;
    }

}

源码:配置struts.xml

<package name="default" namespace="/" extends="struts-default">

        <!-- 配置自定义拦截器 -->
        <interceptors>
            <interceptor name="TestInterceptor1" class="org.Test.interceptor.TestInterceptor1"/>
            <interceptor name="TestInterceptor2" class="org.Test.interceptor.TestInterceptor2"/>
        </interceptors>

        <default-action-ref name="default" />

        <action name="test" class="org.Test.action.TestAction">
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>

            <!-- 在这个Action中使用自定义的拦截器 -->
            <interceptor-ref name="TestInterceptor1"/>
            <interceptor-ref name="TestInterceptor2"/>
        </action>

        <action name="default">
            <result>/index.jsp</result>
        </action>
    </package>

源码:Action的定义

public class TestAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("TestAction execute");
        return SUCCESS;
    }
}

运行结果

这里写图片描述

1.拦截器按其在action中加入的先后顺序依次被调用,这里先调用TestInterceptor1,后调用TestInterceptor2。
2.当所有的拦截器执行完了之后才执行Action
3.然后从Action依次往上一个调用点后退,从TestAction退到TestInterceptor2,从TestInterceptor2退到TestInterceptor1。

来一张图理解
这里写图片描述

0
0
查看评论

马士兵尚学堂Struts2笔记——以及工作机制

目录   l   建立一个Struts2工程... -2 - l   用Action的属性接收参数... -10 - l   使用DomainModel (实体模型)接收参数... -11 - l ...
  • zhh1072773034
  • zhh1072773034
  • 2016-11-22 15:32
  • 723

struts2自定义拦截器示例

struts2自定义拦截器示例及步骤解释。
  • jinhao505
  • jinhao505
  • 2014-03-02 22:13
  • 3083

javaweb之struts2学习四---自定义拦截器

1.struts2的拦截器有三种       默认拦截器,模型驱动拦截器,自定义拦截器 2.自定义拦截器的步骤    2.1 先建立一个普通类,继承于AbstractIntercept,实现intercept方法。    ...
  • zyp1987106
  • zyp1987106
  • 2017-11-07 00:24
  • 74

Struts2自定义拦截器,检查用户是否登录

自定义拦截器,检查用户是否登录
  • suxiexingchen
  • suxiexingchen
  • 2017-03-14 14:34
  • 218

struts2中自定义拦截器详解

1:register.jsp String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":&q...
  • pangqiandou
  • pangqiandou
  • 2016-12-03 23:10
  • 838

使用Struts2的拦截器和自定义注解方式实现权限控制

权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了。 用反射和自定义注解来实现基于struts2的方法级别的权限控制的主要思想是这样的。 1、先定义一个用于识别在进行a...
  • wuhao_5304
  • wuhao_5304
  • 2015-07-15 01:19
  • 856

Struts2自定义登录验证拦截器

Controller.UserAction.java package Controller; import java.util.Map; import com.opensymphony.xwork2.ActionContext; public class UserAction { priv...
  • u012997311
  • u012997311
  • 2016-01-04 14:35
  • 732

Struts2开发自定义拦截器

引言在上一篇中已经讲了一下拦截器的基本概念(http://blog.csdn.net/xlgen157387/article/details/45951163),下边咱们一起实现一个自定义的拦截器。Interceptor接口public interface Interceptor extends S...
  • u010870518
  • u010870518
  • 2015-05-24 13:55
  • 1757

struts2自定义拦截器并配置拦截器使其生效

struts2自定义拦截器并配置拦截器使其生效
  • starjuly
  • starjuly
  • 2016-08-17 23:29
  • 3102

struts自定义拦截器的三种方式

struts自定义拦截器 有三种方式: 方式一、实现Interceptor 接口 public interface Interceptor extends Serializable{ public void init(); public ...
  • a1659177869
  • a1659177869
  • 2015-07-02 23:15
  • 848
    个人资料
    • 访问:49034次
    • 积分:780
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:0篇
    • 译文:0篇
    • 评论:17条
    文章分类
    最新评论