struts2单个文件上传的两种实现方式

以下是“struts2单个文件上传的两种实现方式”的完整攻略。

一、前置条件

在实现struts2单个文件上传之前,需要确保已经具备以下条件:

  1. 确保已经配置好struts2的web.xml和struts.xml文件,以及struts2的相关jar包。

  2. 确保已经在jsp页面中添加了文件上传组件input标签,例如:

<input type="file" name="upload"/>

二、第一种实现方式(基于Servlet的文件上传)

1. 创建Servlet

在项目中创建一个Servlet类,例如:

@WebServlet("/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 获取传入参数
        String description = request.getParameter("description"); // 获取描述信息

        // 获取上传的文件
        Part filePart = request.getPart("upload");
        String fileName = getSubmittedFileName(filePart);
        InputStream fileContent = filePart.getInputStream();

        // TODO: 文件操作代码

        // 跳转到成功页面
        request.getRequestDispatcher("/success.jsp").forward(request, response);
    }

    private String getSubmittedFileName(Part part) {
        for (String content : part.getHeader("content-disposition").split(";")) {
            if (content.trim().startsWith("filename")) {
                return content.substring(content.indexOf("=") + 2, content.length()-1);
            }
        }
        return null;
    }

}

其中,@WebServlet注解指定了Servlet的访问路径,@MultipartConfig注解指定了该Servlet可以处理multipart/form-data类型的请求,即文件上传请求。

2. 添加struts2相关配置

在struts.xml中添加以下配置:

<package name="fileUpload" namespace="/" extends="struts-default">
    <action name="uploadAction" class="com.example.action.UploadAction">
        <interceptor-ref name="fileUploadStack"/>
        <result name="success">/success.jsp</result>
    </action>
</package>

其中,fileUpload指定了该包的名字,UploadAction是处理上传请求的Action类名。fileUploadStack是struts2默认的文件上传拦截器栈,已经包含了文件上传所需的拦截器和过滤器。

3. 编写UploadAction类

在项目中创建一个UploadAction类,作为处理上传的Action类,例如:

public class UploadAction extends ActionSupport {

    private File upload; // 上传文件对象
    private String uploadContentType; // 上传文件的Content-Type值
    private String uploadFileName; // 上传文件的文件名

    // setter和getter方法省略

    @Override
    public String execute() throws Exception {

        // TODO: 文件操作代码

        return SUCCESS;
    }

}

其中,upload、uploadContentType和uploadFileName分别对应jsp页面中input标签的name、Content-Type值和文件名。

4. 编写文件上传jsp页面

在jsp页面中添加以下代码:

<s:form action="uploadAction" method="POST" enctype="multipart/form-data">
    <s:textfield name="description" label="文件描述"/>
    <s:file name="upload" label="选择文件"/>
    <s:submit value="上传文件"/>
</s:form>

其中,action指定了上传文件的Action类名,input标签的name属性应该和UploadAction类中的属性名对应。

三、第二种实现方式(基于Commons-fileupload的文件上传)

1. 添加相关依赖

在项目的pom.xml文件中添加以下依赖:

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

2. 添加struts2相关配置

在struts.xml中添加以下配置:

<package name="fileUpload" namespace="/" extends="struts-default">
    <action name="uploadAction" class="com.example.action.UploadAction">
        <interceptor-ref name="fileUpload"/>
        <result name="success">/success.jsp</result>
    </action>
</package>

其中,fileUpload指定了该包的名字,UploadAction是处理上传请求的Action类名。fileUpload是struts2中负责文件上传的拦截器,需要手动添加。

3. 编写UploadAction类

在项目中创建一个UploadAction类,作为处理上传的Action类,例如:

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;

public class UploadAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();

        // 检查是否文件上传表单
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            // 创建文件上传处理工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            // 解析上传请求
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem item : items) {
                // 处理表单域
                if (item.isFormField()) {
                    String fieldName = item.getFieldName();
                    String fieldValue = item.getString("UTF-8");

                    // TODO: 进行表单域的操作
                }
                // 处理上传文件
                else {
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    long sizeInBytes = item.getSize();
                    InputStream fileContent = item.getInputStream();

                    // TODO: 进行文件上传的操作
                }
            }
        }

        return SUCCESS;
    }

}

4. 编写文件上传jsp页面

在jsp页面中添加以下代码:

<form action="uploadAction" method="POST" enctype="multipart/form-data">
    <input type="text" name="description" placeholder="文件描述"/>
    <input type="file" name="fileUpload"/>
    <button type="submit">上传文件</button>
</form>

其中,action指定了上传文件的Action类名。

到这里,就介绍完了struts2单个文件上传的两种实现方式的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2单个文件上传的两种实现方式 - Python技术站

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

相关文章

  • Java和C++通过new创建的对象有何区别?

    Java和C++都支持通过关键字 “new” 创建对象,但是它们创建的对象在内存中的存储方式以及允许进行的操作不同。具体细节请参考以下内容: Java中new创建对象的特点 在Java中,当使用new关键字创建一个对象时,会进行以下操作: 在堆内存中为该对象分配连续的内存空间。 返回一个指向该对象的引用,这个引用就是Java对象的句柄。 Java中创建的对象…

    Java 2023年5月26日
    00
  • 什么是同步代码块?

    以下是关于同步代码块的完整使用攻略: 同步代码块 同步代码块是指在多线程编程中,使用 synchronized 关键字来实现对共享资源的访问控制的一种方式。同步代码块可以将需要同步的代码块包裹起来,从而保证同一时间只有一个线程可以访问共享资源,避免线程之间的竞争和冲突。 同步代码块的语法格式如下: synchronized (object) { // 需要同…

    Java 2023年5月12日
    00
  • SpringMVC实现RESTful风格:@PathVariable注解的使用方式

    简介 RESTful风格是一种Web服务的设计风格,它使用HTTP协议的GET、POST、PUT、DELETE等方法来实现对资源的操作。SpringMVC提供了一种简单的方式来实现RESTful风格,即使用@PathVariable注解。本文将介绍如何使用@PathVariable注解来实现RESTful风格,并提供两个示例说明。 示例1:获取用户信息 以下…

    Java 2023年5月17日
    00
  • JavaSpringBoot报错“ServerErrorException”的原因和处理方法

    原因 “ServerErrorException” 错误通常是以下原因引起的: 服务器配置问题:如果您的服务器配置存在问题,则可能会出现此错误。在这种情况下,需要检查您的服务器配置并确保它们正确。 服务器资源问题:如果您的服务器资源存在问题,则可能会出现此错误。在这种情况下,需要检查您的服务器资源并确保它们正确。 服务器代码问题:如果您的服务器代码存在问题,…

    Java 2023年5月4日
    00
  • java 将字符串、list 写入到文件,并读取内容的案例

    一、将字符串写入文件并读取内容的案例 将字符串写入文件 import java.io.File; import java.io.FileWriter; import java.io.IOException; public class StringToFileExample { public static void main(String[] args) { …

    Java 2023年5月19日
    00
  • JSP 中Servlet的自己实现

    JSP 中Servlet的自己实现 Servlet是Java中常用的服务器端程序,可以接收和处理HTTP请求,并返回相应的 HTTP响应。JSP(Java Server Pages) 是一个动态的Java web页面技术,可以在网页中嵌入 Java 代码片段,用于生成动态内容。 在JSP中使用Servlet,通常有两种方式:一是在JSP页面中直接使用标签引入…

    Java 2023年6月15日
    00
  • spring AOP定义AfterThrowing增加处理实例分析

    下面为您详细讲解Spring AOP定义AfterThrowing增加处理实例的完整攻略。 什么是Spring AOP? Spring AOP(Aspect Oriented Programming)是Spring框架的一个重要特性,主要为了解决在面向对象编程中的一些常见问题,如日志等处理。 Spring AOP主要是通过代理和横切面实现的,代理是对目标对象…

    Java 2023年5月19日
    00
  • SpringBoot中Dozer的使用小结

    《SpringBoot中 Dozer 的使用小结》 什么是 Dozer? Dozer是一个JavaBean与JavaBean之间的映射框架,它简化了JavaBean之间的转换,并且可以使用注解或XML文件定义映射规则。 Dozer的使用 引入依赖 在Maven中,我们需要添加以下依赖: <dependency> <groupId>co…

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