Struts2的拦截器

一、Struts2的拦截器

1.1 概念

Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP(Aspect-Oriented Programming)的一种实现.
拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2 拦截器与过滤器的区别

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

二、Struts2拦截器的执行过程

Struts2拦截器的实现原理相对简单,当请求Struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。

拦截器

在这里需要指出的是一个很重要的方法invocation.invoke()。这是ActionInvocation中的方法,而ActionInvocation是Action调度者,所以这个方法具备以下2层含义:

  1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
  2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

三、拦截器的使用

Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。该接口声明了3个方法,

void init();
void destroy();
String intercept(ActionInvocation invocation) throws Exception;

其中,initdestroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。
intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。
不过,struts中又提供了几个抽象类来简化这一步骤。

public abstract class AbstractInterceptor implements Interceptor;
public abstract class MethodFilterInterceptor extends AbstractInterceptor;

都是模板方法实现的。

其中AbstractInterceptor提供了init()destroy()的空实现,使用时只需要重写intercept()方法;
MethodFilterInterceptor则提供了includeMethodsexcludeMethods两个属性,用来过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。

一般来说,拦截器的写法都差不多。看下面的示例:

package interceptor;

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

public class MyInterceptor implements Interceptor {
    public void destroy() {
        // TODO Auto-generated method stub
    }
    public void init() {
        // TODO Auto-generated method stub
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Action执行前插入 代码");
        //执行目标方法 (调用下一个拦截器, 或执行Action)    
        final String res = invocation.invoke();
        System.out.println("Action执行后插入 代码");
        return res;
    }
}

四、Struts2拦截器的配置

Struts2拦截器需要在struts.xml中声明,如下struts.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.objectFactory" value="spring" />

    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor>
            <interceptor-stack name="myInterceptorStack">
                <interceptor-ref name="MyInterceptor" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
        <action name="loginAction" class="loginAction">
            <result name="fail">/index.jsp </result>
            <result name="success">/success.jsp</result>
            <interceptor-ref name="myInterceptorStack"></interceptor-ref>
        </action>
    </package>
</struts>
拦截器名字说明
Alias Interceptoralias在不同请求之间将请求参数在不同名字件转换,请求内容不变
Chaining Interceptorchain让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。
Checkbox Interceptorcheckbox添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
Cookies Interceptorcookies使用配置的name,value来是指cookies
Conversion Error InterceptorconversionError将错误从ActionContext中添加到Action的属性字段中。
Create Session InterceptorcreateSession自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
Debugging Interceptordebugging提供不同的调试用的页面来展现内部的数据状况。
Execute and Wait InterceptorexecAndWait在后台执行Action,同时将用户带到一个中间的等待页面。
Exception Interceptorexception将异常定位到一个画面
File Upload InterceptorfileUpload提供文件上传功能
I18n Interceptori18n记录用户选择的locale
Logger Interceptorlogger输出Action的名字
Message Store Interceptorstore存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
Model Driven Interceptormodel-driven如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
Scoped Model Drivenscoped-model-driven如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
Parameters Interceptorparams将请求中的参数设置到Action中去。
Prepare Interceptorprepare如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
Scope Interceptorscope将Action状态存入session和application的简单方法。
Servlet Config InterceptorservletConfig提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
Static Parameters InterceptorstaticParams从struts.xml文件中将中的中的内容设置到对应的Action中。
Roles Interceptorroles确定用户是否具有JAAS指定的Role,否则不予执行。
Timer Interceptortimer输出Action执行的时间
Token Interceptortoken通过Token来避免双击
Token Session InterceptortokenSession和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
Validation Interceptorvalidation使用action-validation.xml文件中定义的内容校验提交的数据。
Workflow Interceptorworkflow调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
Parameter Filter InterceptorN/A从参数列表中删除不必要的参数
Profiling Interceptorprofiling通过参数激活profile

参考自Struts2拦截器Struts2拦截器详解浅谈Struts2拦截器的原理与实现java web 过滤器跟拦截器的区别和使用

内容概要:本文详细介绍了具有最大功率点追踪(MPPT)功能的单相单级脉宽调制(PWM)光伏并网逆变器的Simulink仿真实现过程。该仿真模型聚焦于光伏系统的核心环节,通过构建完整的电路拓扑与控制逻辑,实现了直流电到交流电的高效转换,并确保逆变器输出的电流与电网电压同频同相,满足并网技术要求。重点在于MPPT算法的设计与应用,能够实时追踪光伏阵列在不同光照和温度条件下的最大功率输出点,从而显著提升太阳能的转换效率与系统整体性能。整个系统基于Simulink平台完成建模、仿真与验证,充分展示了其在动态响应、稳态精度及并网稳定性方面的优良特性,为光伏并网系统的研发与教学提供了完整的实践范例。; 适合人群:具备电力电子、自动控制或新能源发电基础知识,从事光伏系统研究、电力系统仿真的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习和掌握单相光伏并网逆变器的基本工作原理与系统构成;②深入理解MPPT算法(如扰动观察法、增量电导法等)在实际系统中的实现方式与作用;③利用Simulink进行电力电子系统建模与仿真,为科研项目、课程设计或工程项目提供技术参考和实现范例。; 阅读建议:在学习过程中,应结合Simulink模型文件,仔细分析各模块(如主电路、驱动、MPPT控制器、锁相环PLL、电流控制环)的参数设置与连接逻辑,通过修改光照强度、温度等外部条件,观察系统动态响应,以加深对并网控制策略的理解。
内容概要:本文系统研究了基于CNN-BiLSTM-Attention混合深度学习模型的电力负荷预测方法,并提供了完整的Python代码实现。该模型通过卷积神经网络(CNN)有效提取负荷数据中的局部特征与空间模式,利用双向长短期记忆网络(BiLSTM)充分捕捉时间序列前后向的长期依赖关系,并结合注意力机制(Attention)动态聚焦于关键时间步的重要特征,从而显著提升预测的准确性与模型鲁棒性。文中详细阐述了数据预处理、模型架构设计、训练优化流程及实验验证过程,证明了该混合模型在处理非线性、非平稳电力负荷数据方面相较于传统模型具有明显优势。; 适合人群:具备Python编程能力和深度学习基础知识,从事电力系统、能源管理、智能电网或时间序列预测相关工作的科研人员与工程技术人员,特别适合高校研究生及企业研发岗位人员。; 使用场景及目标:①应用于电网调度、能源管理系统中的短期与超短期电力负荷预测;②提升对复杂用电行为和突发负荷变化的建模能力,优化电力资源配置与运行效率;③为需求响应、电力市场竞价及智能电网规划等提供高精度的数据支持。; 阅读建议:读者应结合所提供的Python代码进行动手实践,深入理解各模块的设计原理与实现细节,建议使用真实的电力负荷数据集进行模型复现、参数调优与性能对比,以全面掌握该混合模型在实际工程场景中的应用技巧与优化策略。
源码下载地址: https://pan.quark.cn/s/aac641f5afd0 AI 发展历程与深度学习兴起.docx 深度探索人工智能的历史进程与深度学习的技术突破 人工智能的思想早在二十世纪五十年代便已诞生,然而其发展道路并非一帆风顺,历经多次起伏,直至近期深度学习技术的显著进步才重新吸引了社会的广泛关注。作为神经网络基础的感知机理论被首次提出,尽管早期的人工智能体系存在诸多不足之处,但在二十世纪八十年代左右,多层神经网络架构以及反向传播算法的问世,使得神经网络与人工智能的研究迎来了新的繁荣期。尽管如此,受限于当时的计算性能和数据规模,人工智能技术未能实现大规模的普及与推广。 深度学习的兴盛 近期以来,得益于计算能力的持续增强,图形处理器(GPU)的广泛应用以及大规模分布式计算平台的构建,深度神经网络即深度学习技术成功克服了多项学术研究上的挑战,在计算机视觉、语音识别、自然语言理解等多个关键领域均取得了令人瞩目的成就。 人工智能对就业市场的冲击 AI 技术的快速发展引发了关于职业替代性的热议,人们开始探讨哪些工作岗位可能被人工智能所取代,同时关注新职业类型的涌现。人工智能技术的普及也引发了一些担忧,部分人士担忧自身职业安全,甚至有人对人类与机器人的未来关系表示忧虑。 普通技术人员入门人工智能的途径 对于具备基础编程能力的人员,如何系统性地开展人工智能学习?首要任务是明确人工智能的核心概念、其适用的解决方案类型以及能够发挥价值的应用场景。随后,应结合个人兴趣选择具体的应用方向,并运用所学知识解决实际问题,通过实践积累经验,为后续的系统化学习奠定基础。 学习人工智能的三个主要阶段 掌握人工智能技术通常包含三个递进的阶段:第一阶段是基础认知阶段,主要目标是...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值