关于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日

相关文章

  • java实现简单的学生信息管理系统代码实例

    针对“java实现简单的学生信息管理系统代码实例”的完整攻略,以下是详细讲解过程: 1.准备工作 首先,我们要在本地安装Java开发环境(Java Development Kit,简称JDK),可以从Oracle官网上下载并安装最新版JDK,安装过程中需要设置环境变量,以便于后续命令行操作。 2.创建项目 接下来,我们创建项目文件夹来存放程序代码和相关文件,…

    Java 2023年5月23日
    00
  • 魔剑之刃斩魂技能全面介绍及点评

    魔剑之刃斩魂技能全面介绍及点评 什么是斩魂技能? 斩魂技能是魔剑之刃游戏中的一种特殊技能,通过学习和研究斩魂技能,角色可以提升自身战斗力和生存能力。 斩魂技能的分类 魔剑之刃游戏中,斩魂技能分为三大类,分别是: 攻击技能 攻击技能主要用于提高角色的攻击力和输出能力,可以有效地进行单体或群体伤害。举例如下: 感知之刃:消耗30点能量,对单个目标造成大量伤害,并…

    Java 2023年6月16日
    00
  • Android指纹解锁方法解析

    Android指纹解锁方法解析 简介 在 Android 6.0(API level 23)及以上版本中,Google 加入了指纹识别技术,让 Android 设备拥有了指纹解锁的功能。在 Android 开发中,可以通过使用指纹解锁 API 来实现指纹解锁功能。本攻略将详细介绍如何在 Android 应用中使用指纹解锁 API 实现指纹解锁功能。 指纹解锁…

    Java 2023年5月26日
    00
  • java的Hibernate框架报错“PropertyValueException”的原因和解决方法

    当使用Hibernate框架时,可能会遇到“PropertyValueException”错误。这个错误通常是由于以下原因之一引起的: 实体对象的属性值为null:如果您的实体对象的属性值为null,则可能会出现此错误。在这种情况下,需要检查您的实体对象并确保它们正确。 实体对象的属性值不符合要求:如果您的实体对象的属性值不符合要求,则可能会出现此错误。在这…

    Java 2023年5月4日
    00
  • 如何在Android studio导入jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等

    1、如何获取jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等 ​ 在jdk9及后续版本中,jdk开始使用模块化规则,实现更好的封装和定义良好的接口,近一步加强了java的自由度,开发者可以定制化SDK ​ 包括rt.jar在内的依赖均已移除,以模块化形式更高效的存诸在 JAVA_HOME/jmods目录下 ​ 如果需要可以用命令进行抽取,…

    Java 2023年4月25日
    00
  • 基于EJB技术的商务预订系统的开发

    开发基于EJB技术的商务预订系统可以分为以下几个步骤: 1. 需求分析和系统设计 在需求分析和系统设计阶段,需要考虑以下因素: 系统的功能需求,例如用户登录、商品展示、购物车管理、订单管理、支付管理等; 系统的性能需求,例如用户并发量、数据处理量、响应时间、可靠性等; 系统的架构设计,例如服务器端容器的选择、数据库的设计、系统的分层设计等。 示例1:用户登录…

    Java 2023年6月15日
    00
  • java+mysql实现图书馆管理系统实战

    Java+MySQL实现图书馆管理系统实战攻略 这是一项介绍如何使用Java和MySQL构建图书馆管理系统的攻略。最终的系统将会允许管理员添加、编辑和删除书籍,以及允许用户搜索和借阅图书。 步骤1:设计数据库 第一步是设计数据库。在本例中,我们将设计一个包含两个表的数据库:books 和 users。 books表应至少包含以下列: book_id (int…

    Java 2023年5月24日
    00
  • Spring的初始化和XML解析的实现

    下面我就来详细讲解一下Spring的初始化和XML解析的实现攻略。 Spring的初始化 Spring的初始化可以分为两步: 加载配置文件 实例化对象 加载配置文件 在Spring初始化的过程中,首先会加载XML配置文件并创建IoC容器。Spring的XML配置文件默认命名为applicationContext.xml,当然也可以自定义文件名。 Spring…

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