Struts2的拦截器 - 图文 下载本文

内容发布更新时间 : 2024/12/22 14:47:56星期一 下面是文章的全部内容请认真阅读。

Struts2的拦截器

拦截器(Interceptor)是Struts 2的一种类,它可以动态拦截Action的可执行方法的类。它提供了一种机制使开发者可以在一个Action执行之前或执行之后插入需要的代码,比如可以在Action执行前阻止其执行,也可以在Action执行后做一些相应的工作。

拦截器是Struts2框架的基石,框架许多功能的完成都是构建在拦截器的基础之上的,比如数据校验、类型转换、文件上传与下载的文件类型限制、国际化等。并且Struts2还提供了大量的内置拦截器,这些拦截器完成了框架的大部分任务。

这里重点介绍拦截器的配置与使用,以及自定义拦截器的实现。

一、理解拦截器

拦截是AOP(面向切面编程)的一种实现策略,在AOP中,某个方法或字段被访问,可以被拦截,然后在其之前或者之后加入某些操作。

Struts2的拦截器体系正是应用了AOP的设计暂学,它可以动态拦截Action的某些可执行方法,并提供了一种机制,使开发者可以定义在一个Action的可执行方法被行前、后的执行代码。

在Struts2中还有一个概念叫拦截器链(常被称为拦截器栈),拦截器栈就是将多个拦截器按一定的顺序联结成一条链,在使用拦截器链时,拦截器链中的拦截器就会按定义的顺序一一被调用。

二、拦截器的工作原理

当请求到达Struts的FilterDispatcher时,Struts会查找配置文件struts.xml,并根据其配置的拦截器对象,将这些对象串成一个列表(1ist),最后逐个调用列表中的拦截器,如图所示。

每一个Action请求都包装在一系列的拦截器内部。拦截器可以在Action执行之前做准备操作,也可以在Action执行之后做回收操作。

1

三、拦截器的意义

要理解拦截器的意义,就不得不先讲DRY规则。 在软件开发领域,有一条规则:Don't Repeat Yourself,这就是DRY规则,它的意思是“不要书写重复的代码”。

在软件开发阶段,往往由于前期的设计不合理,或者缺乏预见性,可能会导致多个地方需要使用相同的代码。

通过拦截器策略就可以很好地解决这个问题,因为它可以在配置文件中指定需要的拦截器,让拦截器的方法在目标方法执行之前,或之后自动执行,这样就完成了通用操作的动态插入。

如果Action需要哪种功能,只需要在配置文件struts.xml中指定引用该拦截器就可以了。 Struts2中定义了许多内置拦截器,它们的功能是大多数Action都需要的,所以在Struts2中就将其配置成为了默认拦截器。

Struts2中内置的拦截器可以帮助完成70%的拦截任务,必要时开发者可以定义自己的拦截器,并在配置文件struts.xml中指定引用自定义的拦截器。

2

四、使用拦截器

? 首先编写拦截器类(或者,利用Struts内置的拦截器) ? 在struts.xml中配置拦截器

五、编写自定义的拦截器

Struts2中定义了一个拦截器接口“Interceptor”,该接口定义如下:

public interface Interceptor extends Serializable {

void init(); //可选,在拦截器方法intercept()执行之前执行,用于初始化资源

String intercept(ActionInvocation invocation) throws Exception; //必选,是拦截器的核心方法

void destroy(); //可选,在拦截器方法intercept()执行之后执行,用于销毁资源 }

Struts2用一个抽象类实现了这个接口,抽象类是:“AbstractInterceptor” 开发者自定义的拦截器继承这个抽象类即可。

init()方法和destroy()方法,大多数情况下是不需要的。

例【interceptor_leave】部分代码

对于留言板应用程序,主页面上有两个链接,一个是链接到登陆页面,另一个是链接到查看留言,在查看留言页面可以点击“我要留言”打开留言页面;但是,用户必须已经登录,才可提交留言;如果没有登录,提交留言就被拒绝,并且自动转向登录页面。

实现原理是:对提交留言的Action配置拦截器,在执行Action之前先检查用户是否登录。 利用session来做,用户登录后,由登录Action负责把用户名放入session中。拦截器从session中取用户名,如果取出是空值,则拦截;否则,放行。

以下是有关拦截“提交”的拦截器代码:

1、编写一个拦截器类

package com.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;

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

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LeaveInterceptor extends AbstractInterceptor {

public String intercept(ActionInvocation ai) throws Exception {

3

}

}

ActionContext ac = ai.getInvocationContext();

Map session = (Map)ac.getSession(); String userName = (String)session.get(\); if((userName != null) && (userName.length() > 0)) {

return ai.invoke(); //放行,把执行控制权转交给LeaveAction } else {

ac.put(\, \您还没有登录,请先登录!\); //否则,不放行,保存一条信息,以便在

login.jsp上显示

return Action.LOGIN; //替被它拦截的Action返回LOGIN }

2、struts.xml文件,配置拦截器(包括:定义拦截器、引用拦截器)

\ \>

//定义要使用的拦截器

//为包配置默认拦截器栈

//登录Action

look.action //直接调用另一个

Action

regist.jsp fail.jsp

//注册Action registSuccess.jsp

registerror.jsp

4

//查看留言Action show.jsp

fail.jsp

//提交留言Action look.action

fail.jsp

login.jsp //被拦截时,返回\

//引用系统的拦截器栈

//引用上面定义的拦截器,拦截本Action

六、配置拦截器的语法

首先将某些操作写在拦截器的核心方法中,然后在struts.xml配置文件中为需要这些操作的Action配置已经存在的拦截器,配置包括:“定义”和“引用”。

1.定义拦截器

引入了拦截器机制后,实现了对Action通用操作的可插拔式管理,这样的管理基于struts.xml文件来配置实现。

在struts.xml配置文件中定义一个拦截器的代码如下:

</interceptors>

2.定义带参数的拦截器

如果还需要向拦截器传递参数,则需要在元素中加入元素, 配置代码如下:

??

5