struts2拦截器_动力节点Java学院整理

yizhihongxing

Struts2 拦截器攻略

简介

Struts2 拦截器是一种非常重要的 Struts2 框架的组成部分,可以用来拦截请求并对请求进行处理,比如对请求的参数进行过滤和验证,或记录日志等。通过自定义拦截器,可以实现更加灵活和自定义的业务逻辑处理。

Struts2 拦截器的框架

Struts2 拦截器框架是由三个主要部分组成的:

  1. 拦截器接口(Interceptor Interface);
  2. 拦截器的配置参数(Interceptor Parameters);
  3. 拦截器栈(Interceptor Stack)。

拦截器接口

Interceptor 接口包含两个方法,分别是 init() 和 intercept(),其中 init() 方法用于进行拦截器的初始化操作,intercept() 方法用于对请求进行处理。

public interface Interceptor {
    public void init();
    public String intercept(ActionInvocation invocation) throws Exception;
}

拦截器配置参数

Struts2 允许在配置文件中,对每个拦截器进行配置参数的设置,这些配置参数可以通过 Interceptor 接口的 init() 方法在拦截器被调用之前进行初始化。

拦截器栈

Interceptor Stack 是所有拦截器的集合,可以使用一个栈的数据结构来表示。在 Struts2 中,拦截器栈由 Configuration 和 Interceptor 类型组成。配置文件中的每个 元素定义了一个拦截器栈,其中一个拦截器栈可以使用另一个拦截器栈定义的拦截器。最终,所有的拦截器栈都将包括一个默认的拦截器栈。

自定义 Struts2 拦截器

自定义 Struts2 拦截器,需要按照以下步骤进行:

  1. 实现 Interceptor 接口;
  2. 实现 init() 方法,进行拦截器的初始化;
  3. 实现 intercept() 方法,对请求进行处理;
  4. 在 struts.xml 中进行拦截器的配置。

示例一

假设我们需要实现一个拦截器,用于统计每个请求的执行时间,即计算用户提交请求到服务器最终响应所需的时间。我们可以基于 Struts2 拦截器框架,自定义一个 StopWatchInterceptor 统计器,并在 struts.xml 配置文件中,应用这个拦截器。

StopWatchInterceptor代码

StopWatchInterceptor.java

public class StopWatchInterceptor implements Interceptor {

    @Override
    public void destroy() {}

    @Override
    public void init() {}

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 获取当前时间戳
        long startTime = System.currentTimeMillis();

        // 处理请求
        String result = invocation.invoke();

        // 计算请求处理时间
        long endTime = System.currentTimeMillis();
        long elapsed = endTime - startTime;

        // 输出日志
        System.out.println("Action [ " + invocation.getAction() 
            + " ] execute time : " + elapsed + "ms");

        return result;
    }
}

struts.xml配置

在 struts.xml 配置文件中,添加如下内容:

<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="stopWatch" class="com.example.StopWatchInterceptor"/>
        <interceptor-stack name="myStack">
            <interceptor-ref name="stopWatch"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="myStack"/>

    <action name="hello" class="com.example.HelloAction">
        <result name="success">hello.jsp</result>
    </action>
</package>

上面代码中:
- 在 <interceptors> 元素中,添加名称为 "stopWatch" 的自定义拦截器;
- 在 <interceptor-stack> 元素中,组合 stopWatch 拦截器和默认拦截器;
- 在 <default-interceptor-ref> 中指定要使用的拦截器栈;
- 在 <action> 元素中,增加了新拦截器。

示例二

假设我们需要实现一个拦截器,用于检查用户是否已经登录,如果没有登录,则跳转到登录页面。我们可以基于 Struts2 拦截器框架,自定义一个 LoginInterceptor,并应用到需要登录的页面上。

LoginInterceptor代码

LoginInterceptor.java

public class LoginInterceptor implements Interceptor {
    @Override
    public void destroy() {}

    @Override
    public void init() {}

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 获取当前 SESSION 对象
        Map<String, Object> session = invocation.getInvocationContext().getSession();

        // 判断用户是否已经登录
        if (session.get("user") == null) {
            // 跳转到登录页面
            return "login";
        } else {
            // 用户已经登录,继续处理请求
            String result = invocation.invoke();

            return result;
        }
    }
}

struts.xml配置

在 struts.xml 配置文件中,添加如下内容:

<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="login" class="com.example.LoginInterceptor"/>
        <interceptor-stack name="myStack">
            <interceptor-ref name="login"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="myStack"/>

    <action name="login" class="com.example.LoginAction">
        <result name="success">index.jsp</result>
        <result name="login">login.jsp</result>
    </action>

    <action name="list" class="com.example.ListAction">
        <result name="success">list.jsp</result>
    </action>
</package>

上面代码中:
- 在 <interceptors> 元素中,添加名称为 "login" 的自定义拦截器;
- 在 <interceptor-stack> 元素中,组合 login 拦截器和默认拦截器;
- 在 <default-interceptor-ref> 中指定要使用的拦截器栈;
- 在 <action> 元素中,增加了 login 拦截器和新的拦截器。

总结

  • Struts2 拦截器是 Struts2 的重要组成部分,用于拦截请求并对请求进行处理。
  • Struts2 拦截器框架分为拦截器接口、拦截器的配置参数和拦截器栈三个部分。
  • 可以通过自定义拦截器来实现更加灵活和自定义的业务逻辑处理,自定义拦截器需要实现 Interceptor 接口。
  • 在配置 struts.xml 文件时,可以使用自定义拦截器并对其进行配置,可以实现对请求进行处理的业务逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2拦截器_动力节点Java学院整理 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java 一键部署 jar 包和 war 包

    一键部署是指通过单击一个按钮或执行一个脚本就可以完成整个软件部署的过程,这在提高开发效率以及方便用户安装等方面具有重要的意义。下面我来详细讲解“Java 一键部署 jar 包和 war 包”的完整攻略。 一、jar 包的一键部署 Java 编写的应用程序一般打成 jar 包进行部署。在进行 jar 包一键部署时,可以通过以下步骤实现: 1. 建立 Maven…

    Java 2023年5月24日
    00
  • editplus配置java编程环境详细介绍

    EditPlus配置Java编程环境详细介绍 EditPlus是一款文本编辑器,它可以为Java编程者提供良好的编程环境。以下是EditPlus的Java编程环境配置攻略,包括Java 开发工具包(JDK)和编译器环境的配置。 JDK安装 首先,我们需要下载最新的JDK。当前最新版本是JDK 16。通过Oracle官网下载JDK 安装程序并开始安装过程。 安…

    Java 2023年5月23日
    00
  • jQuery ajaxForm()的应用

    当需要通过 AJAX 方式向服务器提交表单数据时,jQuery 提供了方便的方法 ajaxForm()。下面是该方法的详细介绍及应用攻略。 ajaxForm() 方法的使用 基本语法 $(selector).ajaxForm(options); 其中,selector 是表单的选择器,options 是一个对象,包含了一些可选参数及回调函数,具体参数如下: …

    Java 2023年6月16日
    00
  • 详解Java-Jackson使用

    详解Java-Jackson使用 简介 Jackson是一个流行的Java库,用于序列化和反序列化Java对象和JSON数据。它提供了快速,灵活,易于使用的API。 本文将详细讲解在Java项目中如何使用Jackson进行序列化和反序列化,包括几个常用的场景和示例。 添加依赖 要使用Jackson,在Java项目中需要添加Jackson的依赖。可以通过在Ma…

    Java 2023年5月19日
    00
  • 深入理解Java中的字符串类型

    深入理解Java中的字符串类型 Java 的字符串类型 java.lang.String 在我们日常的开发工作中使用得非常频繁,而且它的使用非常方便。但是,我们了解得真的够全面吗?在本篇文章中,我们将会通过具体的示例,剖析 Java 字符串的底层实现原理,还会深入探讨 Java 字符串的常用方法和源代码分析。 1. Java 字符串类型的底层实现原理 Jav…

    Java 2023年5月20日
    00
  • MyBatis-Plus集成Druid环境搭建的详细教程

    下面我将为你介绍Mybatis-Plus集成Druid环境搭建的详细教程,包括环境搭建、配置和代码演示。首先,我们需要明确一下什么是Mybatis-Plus和Druid。 什么是MyBatis-Plus和Druid? MyBatis-Plus MyBatis-Plus(简称MP)是一个在MyBatis框架基础上的增强工具,省去了很多重复性的代码,提供了更为简…

    Java 2023年5月20日
    00
  • Java基础之教你怎么用代码一键生成POJO

    下面是Java基础之教你怎么用代码一键生成POJO的完整攻略。 简介 POJO指的是“普通Java对象”(Plain Old Java Object),它是一种基础的Java类,通常用于存储数据。在实际开发中,我们需要大量地编写POJO,这个过程比较繁琐。因此,我们可以使用一些工具,来快速地生成POJO的代码。本文将介绍一种使用IDEA插件一键生成POJO的…

    Java 2023年5月19日
    00
  • Java面向对象程序设计:抽象类,接口用法实例分析

    Java面向对象程序设计:抽象类,接口用法实例分析 什么是抽象类? 抽象类是指不能被实例化的类,它只能被用作其他类的父类。抽象类通常用于定义一组相关的子类所需的方法和常量。 在Java中,可以通过在类的声明前加上abstract关键字来定义一个抽象类,抽象类中可以包含抽象方法和非抽象方法。 抽象方法是指没有实现体的方法,它只有定义(方法名、返回类型、参数列表…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部