struts2拦截器

拦截器

一、理解拦截器

来自AOP(面向切面编程)思想。

struts2拦截器_第1张图片

它看起来与JavaWeb中的Filter极其相似。我们已经知道请求会先过一系列拦截器,最终到达Action,或者中途中断。

也就是说,每个拦截器都有中断请求的能力。

因为现在还不是讲AOP的时候,所以我们现在只要把拦截器理解为JavaWeb中Filter即可。

你回忆一下Filter与Servlet的关系,那么Interceptor与Action就是相同的关系。


二、struts2中的拦截器

在Struts2中定义了很多拦截器,你可以去struts-default.xml文件中查看。



三、自定义拦截器

3种自定义拦截器的方式:
1.实现interceptor接口
2.继承Abstractceptor抽象类
3.继承MethodFilterInterceptor抽象类

我们也可以自定义拦截器,Struts2要求所有拦截器必须实现Interceptor接口。

Interceptor.java

public interface Interceptor extends Serializable {
    void destroy();
    void init();
    String intercept(ActionInvocation invocation) throws Exception;
}

Struts2还提供了一个Interceptor接口的实现类:AbstractInterceptor,通常我们自定义拦截器都是通过继承AbstractInterceptor类,而不是实现Interceptor接口。


AbstractInterceptor.java

public abstract class AbstractInterceptor implements Interceptor {
    public void init() {}
    public void destroy() {}
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}

继承AbstractInterceptor类时,不需要“被迫”实现init()和destroy()方法,而只需要关注intercept()方法即可。


下面我们自定义一个拦截器

MyInterceptor

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

四、注册拦截器

书写拦截器步骤:
1.书写拦截器类
2.在xml中注册拦截器
3.在action/拦截器栈中引用拦截器

注册拦截器一共分为两步:

1、在中声明拦截器;

2、在中引用拦截器。

		
			
		
		
			/index.jsp
			/login.jsp
			
		
	

上面的代码虽然可以执行MyInterceptor了,但因为Struts2有这么一种机制,一旦为Action指定了拦截器,那么就不会再为这个Action执行默认拦截器了,

即defaultStack这个拦截器栈中的拦截器都不会执行,也就是说,这个Action没有输入校验、没有参数注入、没有国际化、没有…,这是不行的,

所以我们需要在这个元素中再引用defaultStack拦截器栈。


		
			
		
		
			/index.jsp
			/login.jsp
			
			
		
	

元素中引用拦截器的顺序决定了拦截器的执行顺序,上例中会先执行defaultStack中的所有拦截器,再执行MyInterceptor拦截器。


上面的方式虽然可以注册拦截器,但比较麻烦。

因为如果当前包中所有都需要执行MyInterceptor拦截器,那么就需要在每个元素中引入拦截器。

其实还有另一种方式,就是为当前包指定默认拦截器栈!

我们都知道,因为我们的包继承了struts-default包,所以默认的拦截器栈是defaultStack,但没有为元素指定拦截器时,那么就会执行defaultStack拦截器栈。

我们可以在中声明一个拦截器栈,然后在去替换默认拦截器栈即可。


		
			
			
				
				
			
		
		
		
			/index.jsp
			/login.jsp
		
	

Demo:
action:
package cn.itheima.b_Interceptor;

import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;

public class Demo2Action extends ActionSupport {
	
	public String execute(){
		return "success";
	}
}

interceptor:
package cn.itheima.b_Interceptor;

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

public class HelloInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation xm) throws Exception {
		
		System.out.println("hello world interceptor!");
		
		// 放行到下一个拦截器的方法
		return xm.invoke();
	}

}


struts.xml:




	
		
		
			
            
            
            
            
            		
            		
            			find
            		
					
            
            
		
		
		
		
		
		
			/index.jsp
			
			
			
			
		
		
		
			/index.jsp
		
		
		
			/index.jsp
		
		
	
	



五、拦截器进阶

methodFilterInterceptor:
控制action中的方法 ,指定具体的方法走不走该拦截器
Interceptor:
package cn.itheima.b_Interceptor;

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

public class Hello2Interceptor extends MethodFilterInterceptor {

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {

		System.out.println("Hello2 world! Hello2Interceptor!");
		
		return invocation.invoke();
	}

}

action:
package cn.itheima.b_Interceptor;

import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;

public class Demo3Action extends ActionSupport {
	
	public String add(){
		return "success";
	}
	
	public String find(){
		return "success";
	}
}

struts.xml:
同上



你可能感兴趣的:(JavaEE,struts)