拦截器:
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!