Struts2 中拦截器和Action的调用关系

Struts2框架中使用通配符调用Action方法的详细指南 Struts2框架是一个开源的MVC(Model-View-Controller)框架,用于开发基于Java EE的Web应用程序。它起源于Apache基金会,并基于WebWork框架。Struts2框架将业务逻辑层和表示层分离,使开发者可以专注于业务逻辑的实现,而无需担心表示层的问题。在Struts2框架中,Action是处理业务逻辑的核心组件。其接口定义了必须实现的方法,主要是execute(),这是在Struts2中所有Action类的入口点。除了execute() 阅读详情

所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且返回一个字符串。ActionInvocation类中有一个方法,是invoke(),这个方法很重要,它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。intercept()方法的执行过程也很特殊,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。

注意上面红颜色的部分,为什么是执行完所有的请求转发的Action呢?这是因为执行完当前的Action,可能会请求转发或是重定向到另一个Action中或是结果页面,若是重定向的话,那么就不是在一个请求过程中了,就会重新发一次请求,请求另一个Action,因为一个拦截器只会对一个特定的Action起作用,所以重定向,就完全是另一次请求过程了。然而在拦截器中,若是重定向到另一个Action的话,那么当前的Action就算完成了它的业务逻辑,就会返回执行invoke()方法之后的内容,然后,再进行另一次请求过程。如果是请求转发的话,那么Action之间是在一个请求过程中,等到所有的请求转发的Action执行完之后,才会去执行invoke()后面的内容。

下面,举两个例子对比一下:

有一个jsp页面,两个Action:Action1和Action2

第一次:Action1和Action2之间是请求转发关系

第二次:Action1和Action2之间是重定向关系

Login.jsp:
    
<form action="/struts2/test/action1" method="post">
    	姓名:<input type="text" name="username"/><br/>
    	密码:<input type="password" name="password"/><br/>
    	<input type="submit" value="提交"/>
</form>
拦截器:MyInterceptor.java:

package com.suo.interceptor;

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

public class MyInterceptor implements Interceptor {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy invoke !");
	}

	@Override
	public void init() {
		// TODO Auto-generated method stub
		System.out.println("init invoke !");
	}

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

}
Action1.java:

package com.suo.actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport {
	
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute()
	{
		System.out.println("action1 invoke !");
		return SUCCESS;
	}
}
Action2.java:

package com.suo.actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action2 extends ActionSupport {
	
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	public String execute()
	{
		
		System.out.println("action2 invoke !");	
		return SUCCESS;
	}
}

在struts.xml中配置拦截器:
<interceptors>
	<interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor"></interceptor>
</interceptors>
在action中,引用这个拦截器,注意,这里Action之间是请求转发的关系:
<action name="action1" class="com.suo.actions.Action1">
	 <result name="success" type="chain"><!--注意这里是请求转发类型-->
	 	<param name="actionName">action2</param>
	 </result>
	 <interceptor-ref name="myInterceptor"></interceptor-ref><!--这里是引用自定义的拦截器-->
	 <interceptor-ref name="defaultStack"></interceptor-ref>
<!--注意,每一个action都有一个默认的拦截器,如果指定了自定义的拦截器,那么默认的拦截器就失去作用了,所以这里要再加上默认的拦截器-->
</action>
	 	
<action name="action2" class="com.suo.actions.Action2">
	 <result name="success">/WEB-INF/result/action.jsp</result>
</action>
启动服务器,可以看到输出的结果是:
before invoke !
action1 invoke !
action2 invoke !
after invoke !
若是将Action间的类型换成redirectAction,那么输出的结果是:
before invoke !
action1 invoke !
after invoke !
action2 invoke !
补充:还可以给拦截器传递参数,进行初始化的工作。如下:
<interceptors>
	 <interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor">
	 	<param name="suo">piao</param><!--传递一个参数-->
	 </interceptor>
</interceptors>
然后在拦截器中定义该参数的get/set方法,即可:
注意,这个参数的赋值,要早于init()方法的调用,因为初始化参数的作用,就是想在初始化的时候用到这个参数,所以要早于init()方法。

自动驾驶仿真:基于Carsim开发的加速度请求模型 1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。 阅读详情

相关推荐

一份针对零基础学习AI Agent详细学习计划

以下是针对零基础学习者制定的AI Agent详细学习计划,结合最新行业动态和实用资源推荐,帮助你从入门到进阶系统掌握核心技能

sexy19910923的博客 1904

拦截器

一)Action拦截器:拦截某个指定的Action(请求) 1、定义拦截器 package com.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.intercep

持之以恒 321

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6781

Java三大器之拦截器(Interceptor)的实现原理及代码示例

过滤器与拦截器的区别 过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是方法调用,比如拦截 敏感词汇。 4.1,拦截器是基于java反射机制来实现的,而过滤器是基于函数回调来实现的。(有人说,拦截器是基于动态代理来实现的) 4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。 4.3,拦截器只对Action起作用,过滤器可以对所有请求起作用。 4.4,拦截器可以访问Action上下文和值栈中的对象,过滤器不能。 4

reggergdsg的博客 27万+

PyTorch+C3D实战:用UCF101数据集训练你的第一个视频动作识别模型(附完整代码)

本文详细介绍了如何使用PyTorch和C3D模型在UCF101数据集上构建视频动作识别系统。从环境配置、数据预处理到模型训练与优化,提供了完整的代码实战指南,帮助开发者快速掌握视频行为识别技术。文章特别强调了3D卷积核设计、混合精度训练等关键技术要点,并分享了模型部署优化经验。

weixin_29233857的博客 218

基于FreeSwitch与SIP UA的蓝牙电话坐席系统实战部署

本文详细介绍了如何基于FreeSwitch开源软交换平台,结合SIP UA软电话与蓝牙电话App,在局域网内搭建一套低成本、自主可控的电话坐席系统。文章提供了从环境准备、FreeSwitch安装配置、用户与拨号计划创建,到SIP软电话测试和蓝牙设备接入的完整实战部署流程,并给出了关键优化与排坑指南,适合小微团队或个人开发者构建内部通讯工具。

zeta9的博客 544

[Action,Interceptor,拦截器,Struts2,过滤器]深入解析Struts拦截器的工作原理

  什么是拦截器   拦截器是在请求到达Action前后进行的一系列操作,Struts2默认自带了很大拦截器,这些拦截器定义在struts-default.xml中。Struts2中的拦截器是基于AOP动态代理思想的。关于Struts的结构,有一张很经典的图:      在这张图上可以清楚的看到请求经过了Action代理,然后通过了一系列Interceptor最终返回,下面我们就来了解一下,图中的Interceptor1,2,3是如何工作的。   拦截器的工作原理   在搭建Struts2..

linjingyg的博客 296

手把手教你在全新服务器内网安装OpenEuler 22.03 LTS SP4+ 安装 openGuass 5.0.0(LTS) 数据库

openEuler是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的开源服务器Linux操作系统。

cgqyw的专栏 3736

Struts2中的Interceptor拦截器

1.Interceptor简介        struts2中的interceptor它是基于spring aop思想,而aop思想它本质上是通过动态代理来实现,strtus2的拦截器它主要是拦截Action的操作,在action的执行前或执行后进行一些其它的功能操作. 多个拦截器可以形成一个拦截器链,在访问它们时依次访问.2.自定义Interceptor    (1)定义Interceptor ...

sinat_42576042的博客 1295

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试

本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。

weixin_28454475的博客 469

基于深度学习的涂胶缺陷类型检测:数据集处理与YOLOv8模型实现

本文提出了一种基于YOLOv8深度学习的涂胶缺陷检测系统,针对断胶、溢胶、缺胶、气泡及胶条宽度异常等常见缺陷类型,实现了从数据采集到模型部署的完整解决方案。系统采用工业相机采集涂胶图像,通过多形态数据增强策略解决样本稀缺问题,利用YOLOv8框架实现高效检测。相比传统人工目检和规则式机器视觉方法,该系统在检测精度(mAP达97.5%)和实时性(单图检测耗时0.038秒)方面表现优异,可满足智能制造场景下的涂胶质量检测需求。

huanghm88的专栏 271

struts2拦截器详解

在之前的文章中,我们已经涉及到了拦截器(Interceptor)的概念。 downpour 写道 拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。正如上面 Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或...

weixin_30794499的博客 186

室内无线传播损耗分析与传播模型验证课程设计

室内无线传播损耗分析与传播模型验证课程设计

a_zxswer的博客 187

struts2拦截器实现Action调用后逻辑处理

一。创建个类,继承struts拦截器父类 AbstractInterceptor 附上主要代码 public class Interceptorclass extends AbstractInterceptor { @Override public String intercept(ActionInvocation arg0) { String re

huangweifenghah的专栏 1662

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Struts2之拦截器

目录标题

Atkx's Blog 2774

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

struts拦截器和action

struts框架的拦截器和action机制的简单介绍

风雨IT路 962

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Struts2的Action拦截器

layout: post title: Struts2的Action拦截器 subtitle: Action拦截器 date: 2018-06-03 author: ZL header-img: img/20180603.jpg catalog: true tags: - Action拦截器 Action拦截器 在执行acti...

buglei123的博客 207

Struts2框架的struts.xml文件的登录拦截器的配置和使用

struts.xml 的文件程序: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/d...

qq_20215255的博客 447

Struts2 拦截器—拦截action

        对于拦截器的基本使用这里我就懒得打字了,我这里就讲下如何用 Struts2 拦截器 拦截action。这是我个人的想法,如果有什么不对的,或者你们有什么更好的方法。请多多留言!             拦截器的默认拦截的方法参数是:includeMethods(要拦截的方法) 和 excludeMethods(不需要拦截的方法),多个的时候,用逗号分开;        但,...

yangpanwww的博客 349

在Struts2拦截器中获取请求action名称及参数

2.拦截器代码 Java代码 package interceptor.RequestInterceptor;     import java.util.Map;     import javax.servlet.http.HttpSession;     import com.opensymphony.xwork2.Action;   import com.ope

permanent_2008的专栏 1201

Struts2配置拦截器

配置拦截器 在配置拦截器的时候可以为拦截器传递参数,对于已经配置好的拦截器,在引用时还可以覆盖它的参数 defaultStack拦截栈中的validation拦截器配置如下: <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel</param> &...

茨时代べ 的博客 571

Struts2的图片上传和拦截器

图片上传 Action代码 //注意如果前台的上传input框的name不一样那么这里也要修改(将三个变量中的file改成你input框的name) private File file; private String fileContentType; private String fileFileName; //图片上传代码 /** * 上传图片 * @return ...

qq_43059674的博客 276

struts2的拦截器

一:拦截器的介绍 拦截器是struts2的核心组成部分,很多功能都是在拦截器基础上完成的,如文件的上传和下载,国际化,数据校验等。拦截器是动态拦截action调用的对象,。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。它是AOP...

曰业而安的博客 350
上一篇: Struts2中防止表单重复提交的两种方式
下一篇: Action的监听器——PreResultListener
hackerain
博客等级 码龄16年 0粉丝 220原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值