Java中的Struts2框架拦截器之实例代码

接下来我将为你详细讲解如何进行Java中的Struts2框架拦截器之实例代码操作攻略。

什么是Struts2框架拦截器

Struts2是一个基于MVC设计模式的Web框架,而拦截器是Struts2中较为重要的一部分。拦截器可以在Action被执行之前和之后做一些业务处理,例如权限控制、异常处理、日志记录等。

Struts2框架拦截器的使用步骤

1. 创建一个拦截器类

我们需要创建一个Java类,该类继承自Struts2的Intercepter类,实现接口中的intercept()方法,并在该方法中处理拦截器的逻辑代码。

package com.example;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class ExampleInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {

    }

    @Override
    public void init() {

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在这个方法中写拦截器的逻辑代码
        System.out.println("拦截器在Action执行前执行的代码");
        String result = invocation.invoke();
        System.out.println("拦截器在Action执行后执行的代码");
        return result;
    }
}

2. 在struts.xml文件中配置拦截器

在struts.xml中配置拦截器的全局或局部拦截器(也就是只拦截某些Action),例如:

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="exampleInterceptor" 
                         class="com.example.ExampleInterceptor"/>
            <interceptor-stack name="exampleStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="exampleInterceptor"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="exampleStack"/>
        <action name="hello" class="com.example.HelloAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

在这里我们定义了一个名为exampleInterceptor的拦截器,然后定义了一个名为exampleStack的拦截器栈(Stack),该栈由defaultStackexampleInterceptor两个拦截器构成。其中defaultStack是Struts2框架默认提供的拦截器栈,主要包含了一些Struts2框架内置的拦截器。default-interceptor-ref用于定义默认拦截器,也就是指定了一个Action被执行时默认使用的拦截器栈。

3. 在Action中使用拦截器

在Action类的方法上使用@InterceptorRef注解,可以选择是否应用拦截器,例如:

package com.example;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

@Namespace("/")
@Results({@Result(name = "success", location = "/success.jsp")})
public class HelloAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    @Action(value = "hello", interceptorRefs = {
            @InterceptorRef("exampleStack")
    })
    public String execute(){
        System.out.println("Action被执行");
        return SUCCESS;
    }
}

在这个例子中,我们使用了@InterceptorRef("exampleStack")注解来指定在执行Action时应用的拦截器栈。

现在,我们已经成功创建了一个Struts2拦截器和采用拦截器和Action的示例,下面会给出两条代码。

示例1

Suppose,现在我们给ExampleInterceptor拦截器加入一个判断用户是否已经登陆成功的代码,如果没有登陆,直接重定向到登陆页面。我们先在拦截器中加入如下代码:

public class ExampleInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {

    }

    @Override
    public void init() {

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在这个方法中写拦截器的逻辑代码
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if(user == null){
            // 未登录,则重定向到登录页面
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return null;
        }
        System.out.println("拦截器在Action执行前执行的代码");
        String result = invocation.invoke();
        System.out.println("拦截器在Action执行后执行的代码");
        return result;
    }
}

那么如何在Action中设置这个user Session值呢?我们可以在登陆Action中设置:

public class LoginAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private String username;
    private String password;

    public String execute(){
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        session.setAttribute("user", username);
        return SUCCESS;
    }

    // setter and getter methods
}

示例2

Suppose,我们现在需要记录日志,即在Action被执行前后都会输出一条记录日志的信息。我们可以在拦截器中加入如下代码:

public class ExampleInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {

    }

    @Override
    public void init() {

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在这个方法中写拦截器的逻辑代码
        System.out.println("执行Action [" + invocation.getAction().getClass().getName() + "]前的日志");
        String result = invocation.invoke();
        System.out.println("执行Action [" + invocation.getAction().getClass().getName() + "]后的日志");
        return result;
    }
}

这样,我们已经完成了记录日志的拦截器编写了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的Struts2框架拦截器之实例代码 - Python技术站

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

相关文章

  • maven profile动态选择配置文件详解

    下面是本人为你准备的maven profile动态选择配置文件的攻略,希望能帮助到你。 什么是maven profile Maven Profile是Maven中的一个重要概念,它定义了一组配置的集合,用来指定开发、测试和生产环境下使用不同的配置。通过设置不同的Profile,可以实现在不同环境下对应用程序的多个设置的更改。 Maven Profile的配置…

    Java 2023年6月2日
    00
  • Spring Boot maven框架搭建教程图解

    欢迎来到本站!下面我将为您详细讲解如何使用Maven来创建一个基于Spring Boot的web应用程序。 简介 Spring Boot是一个基于Spring框架的快速开发Web应用程序的工具,它可以帮助开发人员快速构建Web应用程序,同时也提供了各种常用的开发工具和依赖项。 Maven是一款Java构建工具,它可以帮助开发人员管理和构建Java项目中的依赖…

    Java 2023年5月19日
    00
  • Java String类简单用法实战示例【字符串输出、比较】

    给您详细讲解一下Java String类的用法。 String类简介 在Java中,String类是一个代表字符串的类,字符串是一种常用的数据类型,它代表一个不可变的字符序列,即一旦创建,就不能再改变它的值,除非创建一个新的字符串。因此,String对象是不可变的。 字符串输出 我们可以使用System.out.println()方法在控制台输出字符串。下面…

    Java 2023年5月26日
    00
  • 基于Java中字符串indexof() 的使用方法

    基于Java中字符串indexof() 的使用方法攻略 简介 在Java编程中,字符串是一种非常重要的数据类型,字符串操作是开发中常见的任务。字符串中indexof()方法就是字符串操作中的一个重要方法,它用于查找一个字符串中是否包含指定的字符或子字符串。 使用步骤 使用字符串中的indexof()方法需要遵循以下步骤: 创建一个字符串 java Strin…

    Java 2023年5月26日
    00
  • Java Hibernate中的查询策略和抓取策略

    Java Hibernate中的查询策略和抓取策略是提高数据访问性能的关键。查询策略指的是在何时加载关联实体,而抓取策略则指的是如何在单次数据库查询中获取实体之间的关联关系。这里将介绍几种常见的查询策略和抓取策略,并提供示例。 Hibernate中的查询策略 (1)立即加载(EAGER) 立即加载策略是Hibernate默认的策略。这种策略会在查询主实体时立…

    Java 2023年5月19日
    00
  • Springboot项目异常处理及返回结果统一

    下面是关于Spring Boot项目异常处理及返回结果统一的完整攻略: 1. 异常处理的重要性 在Web开发中,异常是常见的问题。除开系统自带的异常外,还有业务系统自己抛出的异常。如果不及时有效的处理异常,系统将会毫无提示地将异常信息直接暴露给用户,这对系统的安全性以及可维护性均会产生不利影响。 因此,良好的异常处理机制非常重要。Spring Boot为我们…

    Java 2023年5月27日
    00
  • Java管理对象方法总结

    Java管理对象方法总结 在Java中,经常需要创建和管理对象。本文将总结Java中管理对象的一些基本方法。 创建对象 Java创建对象的方式有两种:使用构造函数和使用静态工厂方法。 使用构造函数创建对象 对象的构造函数用于在实例化对象时初始化该对象的属性。构造函数的形式如下: public ClassName(params) { // 构造函数的方法体 }…

    Java 2023年5月19日
    00
  • SpringBoot分离打Jar包的两种配置方式

    Spring Boot 是一种快速创建独立的、基于Spring的应用程序的方式,具有代码少、配置简单、开发效率高、开箱即用等特点。在实际应用中,我们通常需要将 Spring Boot 应用程序打包为一个可执行的 jar 包,以方便进行部署和运行。而分离打 jar 包则是将引用的依赖库全部打包进来的方式,使得打包后的 jar 包可以直接运行,不需要依赖外部的类…

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