什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在 Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
拦截器的定义和使用
1.定义拦截器
所 有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能 更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor。
- package test;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class TestInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation arg0) throws Exception {
- System.out.println( "begin intercept" );
- return arg0.invoke();
- }
- }
TestInterceptor.java
arg0.invoke()表示不做任务操作,返回被拦截的action
2.定义action
- package test;
- import com.opensymphony.xwork2.ActionSupport;
- public class Test extends ActionSupport {
- @Override
- public String execute(){
- return SUCCESS;
- }
- }
Test.java
3.配置拦截器
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- < struts >
- < constant name = "struts.action.extension" value = "do" />
- < include file = "struts-default.xml" />
- < package name = "struts" extends = "struts-default" >
- < interceptors >
- < interceptor name = "test" class = "test.TestInterceptor" />
- </ interceptors >
- < action name = "Test" class = "test.Test" >
- < interceptor-ref name = "test" />
- < result name = "error" > /error.jsp </ result >
- < result name = "success" > /success.jsp </ result >
- </ action >
- </ package >
- </ struts >
struts.xml
4.新建jsp,并发布。
访问http://localhost:8080/Interceptor/Test.do则可看到后到拦截器的运行过程
begin intercept
以上是一个简单的拦截器的实现。但一般的都要从jsp往传一些参数,那么,怎么办呢。
在拦截器中我们可以得到session,parameter,application等,我们可以利用这些来传参数
我现把 TestInterceptor.java 改成
-
- package test;
- import java.util.Map;
- import com.opensymphony.xwork2.Action;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class TestInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation arg0) throws Exception {
- System.out.println( "begin intercept" );
- Map session = arg0.getInvocationContext().getParameters();
- String[] str = (String[]) session.get("str");
- if ( null != str) {
- return arg0.invoke();
- } else {
- return Action.ERROR;
- }
- }
- }
TestInterceptor.java通过parameter传参数
访问http://localhost:8080/Interceptor/Test.do同样可看到后到拦截器的运行过程
但跑的结果就是error,进入error.jsp
访问http://localhost:8080/Interceptor/Test.do?str=123
结果就是seccuss,进入seccuss.jsp