第九篇——Struts2的拦截器

时间:2022-03-28 14:46:12

拦截器:

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、页面效果

第九篇——Struts2的拦截器

第九篇——Struts2的拦截器

第九篇——Struts2的拦截器

ok!