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()
方法,其返回值字符串直接对应结果视图,这里我们直接返回被拦截方法的返回值。