1、struts拦截器是什么?
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理。同时,拦截器也可以让你将通用的代码模块化并作为可重用的类。
Struts2中的很多特性都是由拦截器来完成的。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
2、实例:
1、新建一个web工程,struts-interceptor,加入struts支持
2、新建一个页面,index.jsp
<body>
<form action="method.action" method="post">
<input type="submit" name="ok" value="按钮1">
</form>
</body>
3、在src下新建com.etc.action包,在包下新建ShowAction.java类
package com.etc.action;
import com.opensymphony.xwork2.ActionSupport;
public class ShowAction extends ActionSupport {
private static final long serialVersionUID = 8303608246129908286L;
public void method(){
System.out.println("正在执行method方法");
}
}
4、在src下新建com.etc.interceptor,在包下新建MyInterceptor类
package com.etc.interceptor;
import java.util.Date;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor{
private static final long serialVersionUID = -1414526674659977742L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截器在Action执行前拦截:"+new Date());
invocation.invoke();
System.out.println("拦截器在Action执行后拦截:"+new Date());
return Action.LOGIN;
}
}
5、配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="hello" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="myinterceptor" class="com.etc.interceptor.MyInterceptor">
</interceptor>
</interceptors>
<action name="method" class="com.etc.action.ShowAction" method="method">
<interceptor-ref name="myinterceptor" />
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
6、运行:http://localhost:8080/struts-interceptor/index.jsp
点击按钮1,控制台输出:
拦截器在Action执行前拦截:Fri Jul 21 15:34:18 CST 2017
正在执行method方法
拦截器在Action执行后拦截:Fri Jul 21 15:34:18 CST 2017
总结:
拦截器:主要就是用于在action执行前后进行一些操作,比如登录验证,在进入action之前,我们可以先配置自己的拦截器,在拦截器中进行验证是否可以进行登录。类似于AOP的实现过程,在代码的前面后面都自动加上一些内容。struts本身有很多自己的拦截器,在struts-default.xml中定义了,而struts.xml中的package都是继承了struts-default的,所以,我们可以在struts.xml中直接配置相应的拦截器,就可以了。比如timer拦截器,我们可以在某个action中配置相应的拦截器为timer,那么控制台就会输出我们执行这个action总共花费了多少时间,不需要我们去记下开始时间和结束时间,再相减,而是直接利用struts的拦截器来实现。
拦截器的用处:
1、登录校验
2、日志打印
3、事务
从上面这个图我们可以清楚的看到,每次请求到达FilterDispatcher(struts过滤器,在web.xml中配置),进入Action代理,然后就进入struts的拦截器,其中可能存在多个拦截器,所以,我们要执行invoke()方法,使得一个拦截器结束之后,继续进行下面的操作,只有拦截器执行完之后,我们才进入Action类,所以,struts拦截器的作用是很大的。比如,我们传入的参数,之前都是以request.getParameter("xx")的方式获取的,但是经过拦截器的处理之后,我们的参数通过getter/setter之后便可以直接获取,这都是拦截器的功劳。