您的位置:首页 > 编程语言 > Java开发

struts2拦截器

2016-05-27 14:52 483 查看

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。

下面给出范例



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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息