struts2拦截器

struts2拦截器

拦截器是Struts2的核心组成部分

1.Struts2很多功能都是构建在拦截器基础之上的,例如文件的上传和下载,国际化,数据类型转换和数据校验等等。
2.Struts2拦截器在访问某个Action方法之前或之后实施拦截
3.Struts2拦截器是可插拔的,拦截器是AOP(面向切面编程)的一种实现

4.拦截器栈(Interceptor-Stack):将拦截器按一定的顺序联结成一条链,在访问被拦截的方法时,Struts2拦截器链中的拦截器就会按其之前定义的顺序依次调用。


Interceptor接口
每个拦截器都是实现了com.opensympnony.xwork2.interceptor.Interceptor接口的java类:
public interface Interceptor extends Serializable{
void destory();
void init();
String intercept(ActionInvocation invocation) throws Exception;

--inti:该方法将在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相对资源进行必要的初始化
--intercept:每拦截一个请求,该方法就会被调用一次
--destory:该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次
由init和destory可以感觉到拦截器是单例的


1.Struts2会依次调用为某个Action而注册的每一个拦截器的intercept方法。
2.每次调用intercept方法时,Struts2会传递一个ActionInvocation接口的实例。
3.ActionInvocation代表一个给定的Action的执行状态,拦截器可以从该类的对象里获得与该Action相关联的Action对象和Result对象,在完成拦截器自己的任务之后,拦截器将调用ActionInvocation对象的invoke方法前进到Action处理流程的下一个环节。
4.AbstractInterceptor类实现了Interceptor接口,并为init,destroy提供了一个空白的实现。


如何实现自定义的拦截器

1.先定义一个拦截器类
   可以实现Interceptor接口也可以继承AbstractInterceptor抽象类

2.在struts.xml配置文件里配置

		<interceptors>
			<interceptor-stack name="wulStack">
			    <interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		
			<interceptor name="wulinterceptor" class="com.wul.app.interceptors.MyInterceptor"></interceptor>
		</interceptors>




<action name="hello" class="com.wul.app.action.TestAction">
			<interceptor-ref name="wulinterceptor"></interceptor-ref>
			<interceptor-ref name="wulStack"></interceptor-ref>
			<result>/success.jsp</result>
		</action>


3.注意:在自定义的拦截器中可以选择不调用ActionInvocation的invoke方法,那么后续的拦截器和Action方法将不会被调用,Struts2会渲染自定义拦截器intercept方法返回值对应的result。


下面给出范例

struts2拦截器_第1张图片


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="default" namespace="/" extends="struts-default">
		
		<interceptors>
			<interceptor-stack name="wulStack">
				<interceptor-ref name="wulinterceptor"></interceptor-ref>
			    <interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		
			<interceptor name="wulinterceptor" class="com.wul.app.interceptors.MyInterceptor"></interceptor>
		</interceptors>
		
		<action name="hello" class="com.wul.app.action.TestAction">
	<!--    <interceptor-ref name="wulinterceptor"></interceptor-ref>-->
			<interceptor-ref name="wulStack"></interceptor-ref>
			<result>/success.jsp</result>
		</action>
	
    </package>


</struts>

TestAction.java

package com.wul.app.action;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	
	@Override
	public String execute() throws Exception {
		System.out.println("TestAction");
		return SUCCESS;
	}
}

MyInterceptor.java

package com.wul.app.interceptors;

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

public class MyInterceptor extends AbstractInterceptor {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

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

}

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<a href="hello.action">Hello interceptor</a>
</body>
</html>
success.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s"  uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
		success
</body>
</html>




你可能感兴趣的:(Interceptor,自定义,Web应用,struts2.0)