拦截器

struts2有一个很重要的拦截器(Interceptor)机制,框架提供的很多常用的功能,比如HTTP请求参数传入Action等,都是通过内置的拦截器实现的,前面章节都已经介绍过了。这篇笔记讲解如何自定义拦截器。

拦截器和过滤器的区别

我们知道Servlet API有Filter这个组件,和struts2的Interceptor功能类似。那么实际使用struts2时,究竟是使用Filter还是Interceptor呢?Filter拦截的是HTTP请求,拦截的参数是URL,而Interceptor拦截的是框架内部的动作方法调用,Interceptor的工作方式可以看作是AOP。struts2中,有package,action这些概念,Interceptor拦截的就是action,而如果试图在struts2中使用Filter,和struts2框架结合的就不如Interceptor那么紧密,过滤条件也不是action这种高级概念,而是一个个URL接口。

自定义拦截器

自定义拦截器实际上很简单,和Filter差不多。下面看一个最简单的例子:

MyInterceptor.java

package com.gacfox.interceptors;

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

public class MyInterceptor extends AbstractInterceptor
{
    @Override
    public String intercept(ActionInvocation invocation) throws Exception
    {
        System.out.println("before...");
        String result = invocation.invoke();
        System.out.println("after...");
        return result;
    }
}

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>
    <package name="p1" extends="struts-default">

        <interceptors>
            <interceptor name="testInterceptor" class="com.gacfox.interceptors.MyInterceptor"></interceptor>
            <interceptor-stack name="my-default">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="testInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <action name="test" class="com.gacfox.action.TestAction" method="test">
            <interceptor-ref name="my-default"></interceptor-ref>
            <result name="success">/test.jsp</result>
        </action>
    </package>
</struts>

访问/test.action输出结果:

before...
action
after...
  • intercept()方法,其返回值字符串直接对应结果视图,这里我们直接返回被拦截方法的返回值。
  • 配置拦截器时,不要把默认的拦截器栈(defaultStack)覆盖,而应该自定义一个拦截器栈,同时加上默认拦截器栈和自定义的拦截器
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap