Struts2拦截器

什么是拦截器

在学习拦截器之前,咱们先看看Struts2对一个HttpRequest请求(及客户端请求的相应步骤图)

1、客户端发送请求 
2、请求先通过ActionContextCleanUp-->FilterDispatcher 。
3、FilterDispatcher通过ActionMapper把请求路径与配置文件的namespace匹配,封装成actionMapping。
4、如果ActionMapper返回的actionMapping不为空,则转到FilterDispatcher的Delegate--Dispatcher,由它创建ActionProxy及ActionInvocation并初始化,ActionInvocation初始化过程中根据ActionMapping和ConfigurationManager创建真正的Action类。
5、Dispatcher调用ActionProxy的execute方法。
6、ActionProxy调用ActionInvocation的invoke方法 。
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用 。
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。

拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。使用场景:解决系统的共性问题(如:乱码问题、权限验证等问题)。Struts2大多数功能是由拦截器实现的,每个拦截器完成某项功能。要知道一下几点

1、拦截器方法在Action执行之前或者之后执行。

2、拦截器栈:从结构上看,拦截器栈相当于多个拦截器组成的栈的数据结构;从功能上看,拦截器栈也是拦截器

3、拦截器的执行过程是一个递归的过程,如下图



自定义拦截器

现在咱们开始自定义一个拦截器,自定义拦截器的方式有两种。

  • 方式一:实现Interceptor接口
实现Interceptor接口的自定义拦截器类需要实现三个方法,下面对着三个方法做一个简单的介绍

—— void init() :初始化拦截器所需资源

—— void destroy() :释放在init()方法中分配的资源

—— String intercept(ActionInvocation ai) throws Exception :(1)实现自己的拦截器业务需求,如权限判断、是否登录等。(2)利用ActionInvocation参数获取Action状态,包括请求路径、所传参数等等;(3)返回result字符串作为逻辑视图

  • 方式二:继承抽象类AbstractInterceptor
—— 提供了init()和destroy()方法的空实现

—— 只需要实现intercept方法即可

由于方式一在实际开发中使用相对方式二较少,故这里给出方式二的实现代码

package com.imooc.interceptor;

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

/*
 * 计算执行Action花费的时间
 */
public class TimerInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// 1.执行Action之前
		long start = System.currentTimeMillis();
		// 2.执行下一个拦截器,如果已经是最后一个拦截器,则执行目标Action,返回执行的Action类中的方法名
		String result = invocation.invoke();
		// 3.执行Action之后
		long end = System.currentTimeMillis();
		System.out.println("执行Action花费的时间:" + (end - start) + "ms");

		return result;
	}

}

这个方法实现了计算执行一个Action方法所用的时间功能。有了这些代码,说白了,咱们只是自己写了一个继承Struts2中一个抽象类的类而已,对于一个从客户端发来的请求并没有任何作用,为了能让客户端发来的请求也执行这段代码,故需要在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>
	<constant name="struts.enable.DynamicMethodInvocation" value="false" />
	<constant name="struts.devMode" value="true" />
	<package name="default" namespace="/" extends="struts-default">
		<!-- 注册拦截器 -->
		<interceptors>
			<interceptor name="mytimer" class="com.imooc.interceptor.TimerInterceptor"/>
		</interceptors>
	
		<action name="timer" class="com.imooc.action.TimerAction">
			<result>/success.jsp</result>
			<!-- 为Action显示引用拦截器后,默认的拦截器defaultStack不再生效,需要手工引用 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<!-- 引用拦截器 -->
			<interceptor-ref name="mytimer"/>
		</action>
	</package>
</struts>

Struts2内建拦截器简介

在Struts2的核心jar包里有一个struts-default.xml文件,这个文件里定义了每一个客户端发来的请求,在执行咱们自己定义的Action方法之前,都会经历哪些拦截器的处理。下图是该文件中一些拦截器的简单说明。

<!-- 该拦截器负责将请求携带的参数赋值到Action的属性上 -->
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<!-- 该拦截器负责将struts.xml文件中给action元素的子元素param参数的值赋值给Action类的对应属性上 -->
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<!-- 将源于Servlet API中的各个对象比如Session对象,注入到Action中,必须实现对应的接口 -->
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<!-- 该拦截器对文件上传提供支持,将文件数据与Action的属性相对应赋值 -->
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<!-- 该拦截器能实现捕获异常,并且将异常结果映射到用户自定义的错误界面上 -->
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<!-- 该拦截器调用验证框架,对表单数据等进行验证 -->
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

在该文件的最后面是个默认的拦截器栈,如下代码
<interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="deprecation"/>
            </interceptor-stack>

该默认拦截器栈中的各个拦截器的调用顺序都是struts开元组织给我们精心编排的,我们只管使用即可。在struts.xml文件中,我们的package标签都会使用extend属性继承struts-default,这样我们的该package标签下面的action的请求都会经历这些默认拦截器的处理。

需要注意的是假如我们为Action显示的引用拦截器后,默认的defaultStack就会失效,需要手工引用一下。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值