第九篇——Struts2的拦截器
拦截器:
Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能;
拦截器方法在Action执行之前或之后执行。
工作原理:
拦截器的执行过程是一个递归的过程
action请求-->拦截器1-->拦截器2-->...-->拦截器n-->action方法-->返回结果-->拦截器n-->...-->拦截器2-->拦截器1-->逻辑视图
实现方式:
方式一:实现Interceptor接口
1.void init():初始化拦截器所需资源;
2.void destory():释放在init()中分配的资源;
3.String interceptor(ActionInvocation invocation)throw Exception:
1)实现拦截器;
2)利用ActionInvocation参数获取Action动态;
3)返回result字符串作为逻辑视图。
方式二:继承AbstractInterceptor类(常用)
1.提供了init()和destroy()方法的空实现;
2.只需要实现interceptor方法。
Struts2内置拦截器:
params拦截器:
负责将请求参数设置为Action属性
staticParams拦截器:
将配置文件中action子元素param参数设置为Action属性
servletConfig拦截器:
将源于Servlet API的各种对象注入到Action中,必须实现对应接口
fileUpload拦截器:
对文件上传提供支持,将文件和数据设置到对应的Action属性(对Commons-FileUpload进行封装)
exception拦截器:
捕获异常,并且将异常映射到用户自定义的错误页面
validation拦截器:
调用验证框架进行数据验证
项目实例:
1、项目结构
2、pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ray</groupId> <artifactId>struts2Test</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>struts2Test Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.16</version> </dependency> </dependencies> <build> <finalName>struts2Test</finalName> </build> </project>
3、web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <display-name>Archetype Created Web Application</display-name> <!-- 过滤所有请求交给Struts2处理 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> <!--action后缀(方法二)--> <!--<init-param>--> <!--<param-name>struts.action.extension</param-name>--> <!--<param-value>ray</param-value>--> <!--</init-param>--> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4、time.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>Struts2拦截器示例之时间拦截器</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <a href="timer.action">执行Action方法并计算执行时间</a> </body> </html>
5、success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>success.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> Hello World~ 登录成功 Action执行成功 </body> </html>
6、TimerAction.java
package com.ray.action; import com.opensymphony.xwork2.ActionSupport; /** * Created by Ray on 2018/3/26 0026. **/ public class TimerAction extends ActionSupport { @Override public String execute() throws Exception { for(int i = 0; i < 1000; i++){ System.out.println("第" + i + "次循环"); } return SUCCESS; } }
7、TimeInterceptor.java
package com.ray.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * Created by Ray on 2018/3/26 0026. **/ public class TimerInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { //获取当前时间:ms long start = System.currentTimeMillis(); //执行下一个拦截器,若已经是最后一个拦截器则执行action方法(result为逻辑视图名称) String result = invocation.invoke(); //获取当前时间:ms long end = System.currentTimeMillis(); //计算action执行时间并输出 System.out.println("action执行时间为: " + (end-start) + "ms"); //返回逻辑视图 return result; } }
8、ninth-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/dtds/struts-2.5.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> <!-- 注册拦截器 --> <interceptors> <interceptor name="timer" class="com.ray.interceptor.TimerInterceptor"/> </interceptors> <action name="timer" class="com.ray.action.TimerAction"> <result>/success.jsp</result> <!-- 引入拦截器 --> <interceptor-ref name="timer"/> </action> </package> </struts>
9、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/dtds/struts-2.5.dtd"> <struts> <!-- action后缀(方法一) --> <!--<constant name="struts.action.extension" value="ra"/>--> <package name="default" namespace="/" extends="struts-default"> <!-- 默认action --> <default-action-ref name="404"/> <action name="404"> <result>/404.jsp</result> </action> <action name="helloWorld" class="com.ray.action.HelloWorldAction"> <result name="success">/success.jsp</result> </action> </package> <!--<include file="second-struts.xml"/>--> <!--<include file="third-struts.xml"/>--> <!--<include file="fourth-struts.xml"/>--> <!--<include file="seventh-struts.xml"/>--> <!--<include file="eighth-struts.xml"/>--> <include file="ninth-struts.xml"/> </struts>
10、页面效果
ok!
第九篇——Struts2的拦截器的更多相关文章
- 第十篇——Struts2的拦截器栈
拦截器栈: 从结构上看:拦截器栈相当于多个拦截器的组合: 从功能上看:拦截器栈也是拦截器. 默认拦截器栈: 在struts-core.jar包中的struts-default.xml中自定义了一个de ...
- Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】
什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...
- 谈谈 Struts2 的拦截器
套话 相信非常多人都用过 Struts2 了,当然,对 Struts2 的原理也都比較了解.之前在一个项目中就已经用到了,当初的理解也不过局限在应用的层面上,对于更深层次的原理.机制,了解的并非非常多 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- struts2总结六: Struts2的拦截器
一.Struts2的系统结构图
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- Struts2自定义拦截器Interceptor以及拦截器登录实例
1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...
- struts2之拦截器
1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...
- Struts2【拦截器】就是这么简单
什么是拦截器 拦截器Interceptor.....拦截器是Struts的概念,它与过滤器是类似的...可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Str ...
随机推荐
- Kubernetes集群部署之五node节点部署
Node节点是Kubernetes集群中的工作负载节点.每个node都会被master分配一些工作负载,每个node节点都运行以下关键服务进程.Kubelet :负责pod对应的容器的创建.启停等任务 ...
- Houdini技术体系 基础管线(三) :UE4 Landscape Component的多选支持 下篇
背景 上篇中,我们介绍了如何修改Houdini Enigne来设置单个Landscape Compnent的Height和Layer的数据,但原生Houdini Engine并不支持多选Compone ...
- http 请求 post get 长度限制
一.问题起因在某项目释放后Bug统计的附件<释放后问题>里有: 问题 原因 分析 备注 CSV处理时,如果处理的主题数过多,发生URL参数上限的错误: 可变长度的参数通过UR ...
- [转帖]Loading Data into HAWQ
Loading Data into HAWQ Leave a reply Loading data into the database is required to start using it bu ...
- java的同步方法和同步代码块,对象锁,类锁区别
/** * @author admin * @date 2018/1/12 9:48 * 作用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...
- Qt编写自定义控件属性设计器
以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需 ...
- DBeaver连接MySQL 8.0显示"Unable to load authentication plugin 'caching_sha2_password'."错误的问题
下载MySQL绿色版本mysql-8.0.12-winx64,手动安装完成后.使用DBeaver连接提示"Unable to load authentication plugin 'cach ...
- 赶鸭子上架的cdq分治
前置技能:归并排序,树状数组. cdq分治主要是用来离线解决一些奇怪的问题的.可以用来代替一些高级数据结构比如树套树或者KD-Tree之类的... 话说挑战2上的KD-Tree我到现在还没开始学... ...
- python3 中 Event.wait 多线程等待
event.wait(time) 等待 time 时间后,执行下一步.或者在调用 event.set() 后立即执行下一步. event.clear() 清除信号 event.set() 设置信号 ...
- vue 中的数据绑定
vue当中有个v-model, 是怎么实现的呢?其实是利用了$event. <div id="app"> <!-- 输入什么,就输出什么 --> <i ...