关于Struts2文件上传与自定义拦截器

关于Struts2文件上传与自定义拦截器的完整攻略

文件上传

环境配置

在使用Struts2进行文件上传之前,需要进行相关的环境配置。首先需要在struts.xml文件中配置org.apache.struts2.dispatcher.multipart.MultiPartRequest类型的解析器:

<constant name="struts.multipart.parser" value="jakarta-stream" />

同时,需要将common-fileuploadcommons-io这两个依赖包添加到pom.xml文件中:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

实现文件上传功能

实现文件上传的方法很简单,只需要在表单中添加<input type="file" name="file"/>元素,并在Action类中添加对应的属性即可。例如:

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上传文件"/>
</form>
public class UploadAction extends ActionSupport {
    private File file;
    private String fileContentType;
    private String fileFileName;

    // 省略get和set方法

    public String execute() throws Exception {
        // 构建上传文件保存路径
        String savePath = ServletActionContext.getServletContext().getRealPath("/") + "upload/";
        File saveDir = new File(savePath);
        if (!saveDir.exists()) {
            saveDir.mkdir();
        }
        File destFile = new File(savePath + File.separator + fileFileName);

        // 将上传的文件保存到服务器端
        FileUtils.copyFile(file, destFile);

        return SUCCESS;
    }
}

在上述代码中,file属性保存了上传的文件,fileContentType保存了文件的类型,fileFileName保存了文件的原始名称。通过FileUtils.copyFile方法将文件保存到服务器端。

自定义拦截器

实现拦截器

自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口,并重写initinterceptdestroy三个方法。例如:

public class MyInterceptor implements Interceptor {
    @Override
    public void init() {
        // 初始化拦截器
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在Action执行前执行的代码
        ActionContext context = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
        String username = (String) request.getSession().getAttribute("username");
        if (StringUtils.isBlank(username)) {
            return "login";
        }

        String result = invocation.invoke();

        // 在Action执行后执行的代码
        return result;
    }

    @Override
    public void destroy() {
        // 销毁拦截器
    }
}

在上述代码中,init方法用于初始化拦截器,intercept方法用于在Action执行前和执行后执行拦截器代码,destroy方法用于销毁拦截器。

配置拦截器

自定义拦截器需要在struts.xml文件中配置。例如:

<interceptors>
    <interceptor name="myInterceptor" class="com.example.MyInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="myInterceptor"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
</interceptors>

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

在上述代码中,将自定义的拦截器MyInterceptor配置为拦截器栈的第一个拦截器,并将默认的拦截器栈设置为该拦截器栈。

示例

下面是一个使用自定义拦截器的示例。在发送请求时,如果没有登录,会被拦截器重定向到login页面:

public class HelloAction extends ActionSupport {
    public String execute() throws Exception {
        return SUCCESS;
    }
}

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    // 省略get和set方法

    public String execute() throws Exception {
        if ("admin".equals(username) && "123456".equals(password)) {
            HttpServletRequest request = ServletActionContext.getRequest();
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            return SUCCESS;
        } else {
            return ERROR;
        }
    }
}
<action name="hello" class="com.example.HelloAction">
    <result>/hello.jsp</result>
    <interceptor-ref name="defaultStack"/>
</action>

<action name="login" class="com.example.LoginAction">
    <result name="success">/hello.jsp</result>
    <result name="error">/login.jsp</result>
    <interceptor-ref name="defaultStack"/>
</action>

在以上代码中,HelloActionLoginAction都配置了默认的拦截器栈,即myInterceptor和默认的拦截器栈。在访问hello页面时,如果没有登录,会被拦截器重定向到login页面。在登录后会将用户名存入HttpSession中,下次请求会话中存在username属性时,则通过拦截器,执行Action方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Struts2文件上传与自定义拦截器 - Python技术站

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

相关文章

  • jfreechart插件将数据展示成饼状图、柱状图和折线图

    首先,我们需要了解一下jfreechart是什么。jfreechart是一个开源的java图表库,可以帮我们生成各种类型的图表比如折线图、柱状图和饼状图等。以下是使用jfreechart插件将数据展示成饼状图、柱状图和折线图的步骤: 准备工作 在使用jfreechart插件之前,我们需要准备一些工作,如导入相关的依赖和引入相应的类。 依赖导入: <de…

    Java 2023年6月15日
    00
  • 在Java的Struts框架中ONGL表达式的基础使用入门

    对于在Java的Struts框架中ONGl表达式的基础使用入门,我将提供以下攻略: 一、什么是Struts框架 Struts框架是一个基于模型-视图-控制器(MVC)的web应用程序框架。它由Apache软件基金会开发,并且拥有活跃的社区支持和用户。它允许开发人员分离业务逻辑和用户界面,从而使开发人员能够更专注于他们的核心业务。 二、什么是OGNL表达式 O…

    Java 2023年5月20日
    00
  • 深入了解Java定时器中的Timer的原理

    深入了解Java定时器中的Timer的原理攻略 什么是Java定时器 在Java中,我们可以使用定时器来实现周期性和延迟任务。定时器可以根据开发人员设定的时间间隔周期性地触发任务,并且可以延迟执行某个任务。其中,Java Timer则是Java提供的一个定时器工具,能够实现任务的定时执行。 Java Timer的工作原理 Java Timer是基于Java的…

    Java 2023年5月20日
    00
  • 浅谈Java响应式系统

    浅谈Java响应式系统 什么是Java响应式系统 Java响应式系统是一种基于反应式编程(Reactive Programming,简称RP)思想的编程模式,它使用异步流来构建可靠性高,性能较好的应用程序。在Java响应式系统中,数据流可以被看作是一系列的事件或者消息,应用程序可以通过订阅这些事件或者消息来进行处理。Java响应式系统常常被用于处理大规模数据…

    Java 2023年5月20日
    00
  • java排序算法之冒泡排序

    Java排序算法之冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置,重复这个过程直到整个数组排好序。 基本思路 遍历数组,将相邻两个元素进行比较,若前一个元素比后一个大,则交换它们的位置; 每遍历一轮,就可以找到当前最大或最小的元素,需要遍历数组长度减去已排序部分的次数。 代码实现 public st…

    Java 2023年5月19日
    00
  • 基于Class.forName()用法及说明

    下面我来为你详细讲解“基于Class.forName()用法及说明”的完整攻略。 什么是Class.forName()方法? 在Java中,Class.forName()方法是一种加载Class对象的方式。注意,它并不是使用了一个类,而是将它加载到JVM中,使其代码可以被执行。通过使用该方法,我们可以动态的创建对象、使用反射等功能。 Class.forNam…

    Java 2023年6月15日
    00
  • Spring集成Mybatis过程详细讲解

    下面就为您详细讲解“Spring集成Mybatis过程详细讲解”的完整攻略。 1. 前置条件 在开始Spring集成Mybatis之前,您需要先安装好以下开发环境: JDK(Java Development Kit):1.8及以上版本 Maven:3.0及以上版本 Spring:5.0及以上版本 Mybatis:3.4及以上版本 2. 创建Maven工程 首…

    Java 2023年5月20日
    00
  • Java工具之ja-netfilter 2022.1 配置教程

    Java工具之ja-netfilter 2022.1 配置教程 简介 ja-netfilter 是一款基于 Java 开发的网络过滤工具,它能够实现网络数据包的过滤、转发、拦截等功能。本教程将详细介绍该工具的配置过程。 安装 首先需要安装 Java 运行环境,官方推荐使用 Java 8 或更高版本。 下载最新版本的 ja-netfilter,可以从官方网站h…

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