第九篇——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 ...
随机推荐
- js 对象转&拼接
function pars(param, key, encode) { if (param == null) return ''; var arr = []; var t = typeof (para ...
- tomcat 配置 使用综合
[参考]Tomcat 7.0安装与配置 [参考]tomcat 控制台日志(startup.bat)输出到指定文件中 [参考]将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种 ...
- The client and server cannot communicate, because they do not possess a common algorithm
The client and server cannot communicate, because they do not possess a common algorithm This was re ...
- nginx set变量后lua无法改值
今天在使用lua修改nginx自定义变量的时候,发现死活更改不了,如下所示: 有问题的代码 set $check "1"; rewrite_by_lua_file 'conf/ru ...
- 转:十步完全理解SQL
来自:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...
- PowerDesigner 15进行逆向工程生成数据库图表时,注释的comment的生成,解决PowerDesigner逆向工程没有列注释
使用PowerDesigner默认配置逆向工程是没有注释(name列为英文,comment列是空的),这样的不方便查看字段具体是什么意义,将注释一同导出,方便查看字段具体的意义,如下图 注释列导出步骤 ...
- Ext Js 6+ 动态切换皮肤
在这里以ext js 6.2.1版本为例(注:需要安装Sencha Cmd,以及下载对应的sdk) 1.创建空白项目 在命令行中输入sencha -sdk D:\Code\ext-6.2.1 gene ...
- IDEA破解教程
IDEA目前堪称最完美的java开发工具,相信用惯了eclipse的朋友一定不这么认为,但是这并不是终点,终点是如何安装破解版的IDEA,官网给我们的两个下载:1.免费试用:2.免费.开源.作为一名程 ...
- node.js用logio实时监控log
http://logio.org/ 1.先装好node.js $ yum install nodejs 2.安装log.io $sudo npm install -g log.io --user &q ...
- js post 下载文件
function DownLoadPost(url,data) { if (url && data) { var form = $('<form>{{ xsrf_form_ ...