详解Struts2拦截器机制

详解Struts2拦截器机制

1. 什么是Struts2拦截器

Struts2拦截器是一个非常重要的组件,用于对请求进行拦截和处理,同时也是整个Struts2框架的核心。

在Struts2中,每个请求都会经过多个拦截器的处理,每个拦截器只是完成了部分工作,多个拦截器组合在一起,最终完成了一个完整的请求处理流程。

2. Struts2拦截器机制的流程

Struts2拦截器机制的流程如下:

  1. 请求发起:当用户在浏览器中输入URL,请求到达Struts2 Controller时,请求被拦截器拦截。

  2. 拦截器链:所有的拦截器按照Struts.xml中定义的顺序组成拦截器链。拦截器链是一个有序集合,按照定义的顺序执行。

  3. 执行拦截器:拦截器链中的每个拦截器都会执行自己的逻辑,并将请求传递给下一个拦截器。

  4. Action执行:当拦截器链中的所有拦截器执行完成后,请求最终被传递给Action,Action执行自己的逻辑。

  5. 结果返回:Action执行完成后,结果被返回给拦截器链,拦截器链进行后续处理,最终将结果返回给浏览器。

3. Struts2拦截器的分类

Struts2拦截器根据其功能和执行位置的不同,可以分为以下几类:

  1. 控制拦截器(Control Interceptor):决定是否执行Action。如:params、prepare、validation、workflow等。

  2. 工作流拦截器(Workflow Interceptor):用于工作流控制,如:exception、debug、profiling等。

  3. 处理拦截器(Execution Interceptor):管理Action执行流程,如:action、result等。

  4. 输入拦截器(Input Interceptor):管理如何将请求参数绑定到Action属性中。

  5. 输出拦截器(Output Interceptor):将Action的执行结果转换为最终的输出格式。

  6. 安全拦截器(Security Interceptor):管理一个请求是否可被理解为受控请求,使用安全拦截器可以配置哪些请求进行安全控制,如:authentication、authorization等。

4. 示例1:自定义拦截器

下面以示例的形式,演示如何自定义一个控制拦截器。

  1. 创建拦截器类:示例中使用java类实现拦截器。
public class CustomInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("Interceptor destroyed");
    }

    @Override
    public void init() {
        System.out.println("Interceptor initialized");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Interceptor invoked");
        return invocation.invoke();
    }
}
  1. 在struts.xml中配置自定义拦截器:
<package name="default" extends="struts-default">
    <interceptors>
        <interceptor name="custom" class="com.example.interceptor.CustomInterceptor"/>
        <interceptor-stack name="myStack">
            <interceptor-ref name="custom"></interceptor-ref>
            <interceptor-ref name="params"></interceptor-ref>
            <interceptor-ref name="validationWorkflowStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
</package>
  1. 使用拦截器:使用在Struts.xml中定义的自定义拦截器。
<action name="login" class="com.example.action.LoginAction" method="login">
    <interceptor-ref name="myStack"></interceptor-ref>
    <result name="success">welcome.jsp</result>
</action>

5. 示例2:使用Struts2内置拦截器实现表单验证

下面以示例的形式,演示如何使用Struts2内置拦截器实现表单验证。

  1. 编写Action
public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        if(username.equals("admin") && password.equals("admin123")) {
            return SUCCESS;
        }
        else {
            addActionError(getText("error.login"));
            return INPUT;
        }
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}
  1. 配置struts.xml:
<action name="login" class="com.example.action.LoginAction" method="execute">
    <result name="input">/login.jsp</result>
    <result name="success">/welcome.jsp</result>
    <interceptor-ref name="defaultStack">
        <param name="validation.excludeMethods">execute</param>
    </interceptor-ref>
</action>
  1. 在JSP中使用标签库实现前端验证
<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
    <s:textfield name="username" label="username" />
    <s:password name="password" label="password" />
    <s:submit value="login" />
</s:form>

在以上示例中,通过配置defaultStack拦截器完成了表单验证的功能。参数validation.excludeMethods指定了执行Action的方法不应该进行表单验证。在login.jsp中,通过使用struts标签库,可以实现前端验证的功能。

6. 总结

了解Struts2拦截器机制可以帮助我们更好的掌握Struts2框架,并实现更灵活的工作流程。Struts2提供了许多内置的拦截器,同时也可以通过自定义拦截器来满足个性化需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Struts2拦截器机制 - Python技术站

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

相关文章

  • javascript实现列表切换效果

    下面我将详细讲解“JavaScript实现列表切换效果”的完整攻略。 准备工作 在开始实现列表切换效果之前,需要先准备好以下内容: HTML页面结构。列表切换效果需要在某个HTML元素上进行实现,因此需要在页面中准备好相应的HTML元素。 CSS样式。为了达到更好的视觉效果,需要为列表和列表项设置合适的CSS样式。 JavaScript代码。实现列表切换效果…

    Java 2023年6月15日
    00
  • JSP读取文件实例

    JSP(Java Server Pages)是一种用于创建动态Web页面的技术,它允许在HTML页面中嵌入Java代码,这样就能够动态地生成页面内容。在实际开发中,通常需要从文件中读取数据,以便动态地加载页面内容或配置信息。本文将介绍如何在JSP中读取文件内容,主要包括以下步骤: Java文件流读取文件内容 将文件内容传递到JSP页面 在JSP页面中显示文件…

    Java 2023年6月15日
    00
  • 一文了解自定义MVC框架实现

    一文了解自定义MVC框架实现 前言 在Web开发过程中,MVC框架是非常重要的一环,可以提供优秀的代码组织架构和更好的开发体验。对于如何自定义实现MVC框架,本文将给出完整的实现攻略。 MVC框架的基本架构 MVC框架的基本架构包括三个组件:Controller、Model、View。其中,Controller负责接收用户请求,调用对应的Model进行数据处…

    Java 2023年6月15日
    00
  • java获取版本号及字节码编译版本方法示例

    Java获取版本号及字节码编译版本方法示例 当我们使用Java开发时,需要知道Java的版本号以及字节码的编译版本。这对于我们在编程过程中的调试与优化非常有帮助。下面就来讲解一下Java获取版本号及字节码编译版本的方法,并且提供两个示例。 获取Java版本号 在Java中,我们可以使用System.getProperty(String key)方法获取Jav…

    Java 2023年5月27日
    00
  • Java实现简单控制台版ATM系统

    Java实现简单控制台版ATM系统攻略 1. 需求分析 控制台版ATM系统主要需要实现以下功能: 用户登录、注册 存款、取款、查询余额 转账功能 2. 技术选型 本篇攻略使用Java语言实现控制台版ATM系统,使用了Java IO、集合等基础知识进行编写。在框架上,本篇攻略并未用到任何框架。 3. 代码实现 代码实现主要分为以下几个部分: 3.1 用户登录、…

    Java 2023年5月18日
    00
  • Java测试框架Mockito的简明教程

    “Java测试框架Mockito的简明教程”主要介绍了Mockito这个Java测试框架的基本使用方法和注意事项。Mockito旨在简化Java测试的过程,帮助开发者创建并执行相对干净和更方便的测试。 以下是详细的攻略: 什么是Mockito Mockito是一个用于Java测试的框架,用于创建和验证Mock对象。Mock对象是模拟真实对象的测试对象,它们用…

    Java 2023年5月26日
    00
  • springboot实现执行sql语句打印到控制台

    下面是关于如何在Spring Boot中实现执行SQL语句并打印到控制台的攻略: 1. 添加依赖 在Spring Boot中使用JDBC需要添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo…

    Java 2023年5月31日
    00
  • Docker 容器虚拟化的实用技巧总结

    Docker 容器虚拟化的实用技巧总结 1. Docker 简介 Docker 是一个开源的应用容器引擎,可以方便地将应用程序打包成一个独立的容器,运行于任意的平台上。 2. Docker 容器的基本操作 2.1 容器的创建和启动 容器的创建和启动可以通过以下命令实现: $ docker run <image_name> <command&…

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