文件上传(3)

servlet文件上传

1. 环境准备

  • JDK: 8 或更高版本
  • Servlet 容器: 支持 Servlet 3.0+ 的容器,如 Tomcat 7+、Jetty 9+ 等
  • 构建工具: 可以使用 Maven 或 Gradle,这里以 Maven 为例

2. 创建 Maven 项目

首先,创建一个 Maven Web 项目,并在 pom.xml 文件中添加 Servlet 依赖:
xml
<dependencies> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>

3. 创建文件上传表单页面

在 src/main/webapp 目录下创建一个 upload.jsp 文件,用于提供文件上传的表单界面:
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传示例</title> <style> body { font-family: Arial; text-align: center; margin-top: 100px; } .upload-container { display: inline-block; text-align: left; padding: 20px; border: 1px solid #ccc; border-radius: 8px; } .form-group { margin: 10px 0; } label { display: block; margin-bottom: 5px; } input[type="file"] { margin-bottom: 10px; } input[type="submit"] { padding: 8px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; } input[type="submit"]:hover { background-color: #45a049; } .message { margin-top: 20px; padding: 10px; border-radius: 4px; } .success { background-color: #dff0d8; color: #3c763d; border: 1px solid #d6e9c6; } .error { background-color: #f2dede; color: #a94442; border: 1px solid #ebccd1; } </style> </head> <body> <div class="upload-container"> <h2>文件上传</h2> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <div class="form-group"> <label for="file">选择文件:</label> <input type="file" name="file" id="file" required /> </div> <div class="form-group"> <label for="description">文件描述:</label> <input type="text" name="description" id="description" placeholder="请输入文件描述" /> </div> <input type="submit" value="上传文件" /> </form> <%-- 显示上传结果信息 --%> <% if (request.getAttribute("message") != null) { %> <div class="message <%= request.getAttribute("status").equals("success") ? "success" : "error" %>"> <%= request.getAttribute("message") %> </div> <% } %> </div> </body> </html>

4. 创建文件上传 Servlet

在 src/main/java 目录下创建一个 Servlet 类 UploadServlet.java,用于处理文件上传请求:
java
运行
import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.UUID; @WebServlet("/UploadServlet") @MultipartConfig( fileSizeThreshold = 1024 * 1024, // 1MB 内存阈值,超过则写入临时文件 maxFileSize = 1024 * 1024 * 10, // 单个文件最大 10MB maxRequestSize = 1024 * 1024 * 50, // 整个请求最大 50MB location = "D:/temp/uploads" // 临时文件存储位置(需确保目录存在) ) public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 最终文件存储目录(需确保目录存在,可在 web.xml 中配置) private static final String UPLOAD_DIR = "D:/uploads"; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 设置字符编码,处理中文乱码 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 2. 验证是否为 multipart/form-data 请求 if (!request.getContentType().startsWith("multipart/form-data")) { request.setAttribute("status", "error"); request.setAttribute("message", "请使用 multipart/form-data 格式上传文件"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return; } // 3. 获取表单字段和文件 String description = request.getParameter("description"); // 获取文件描述 Part filePart = request.getPart("file"); // 获取文件部分 // 4. 验证文件是否为空 if (filePart == null || filePart.getSize() == 0) { request.setAttribute("status", "error"); request.setAttribute("message", "请选择要上传的文件"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return; } // 5. 处理文件名(避免重复,使用 UUID 前缀) String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); String uniqueFileName = UUID.randomUUID().toString() + "_" + fileName; // 6. 确保上传目录存在 File uploadDir = new File(UPLOAD_DIR); if (!uploadDir.exists()) { uploadDir.mkdirs(); } // 7. 写入文件到目标目录 String filePath = UPLOAD_DIR + File.separator + uniqueFileName; try (InputStream in = filePart.getInputStream(); OutputStream out = Files.newOutputStream(Paths.get(filePath))) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } // 8. 上传成功,设置成功信息 request.setAttribute("status", "success"); request.setAttribute("message", String.format( "文件上传成功!<br>文件名:%s<br>描述:%s<br>存储路径:%s", fileName, description, filePath )); } catch (IOException e) { // 9. 处理上传异常 request.setAttribute("status", "error"); request.setAttribute("message", "文件上传失败:" + e.getMessage()); } // 10. 转发到上传页面显示结果 request.getRequestDispatcher("/upload.jsp").forward(request, response); } }

5. 配置 web.xml(可选)

如果不使用注解配置 Servlet,也可以在 WEB-INF/web.xml 中进行配置:
xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置 Servlet --> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> <!-- 配置文件上传参数(与注解方式二选一) --> <multipart-config> <file-size-threshold>1048576</file-size-threshold> <!-- 1MB --> <max-file-size>10485760</max-file-size> <!-- 10MB --> <max-request-size>52428800</max-request-size> <!-- 50MB --> <location>D:/temp/uploads</location> </multipart-config> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> <!-- 配置欢迎页面 --> <welcome-file-list> <welcome-file>upload.jsp</welcome-file> </welcome-file-list> </web-app>

6. 关键注意事项

  1. enctype="multipart/form-data": 表单必须设置该属性,否则无法上传文件
  2. @MultipartConfig 注解: Servlet 3.0+ 必须添加该注解才能处理文件上传
  3. 中文乱码处理 : 通过 request.setCharacterEncoding("UTF-8") 设置字符编码
  4. 文件大小限制 : 通过 maxFileSize 和 maxRequestSize 限制文件大小
  5. 文件名重复: 使用 UUID 或时间戳确保文件名唯一
  6. 目录权限 : 确保服务器有权读写上传目录(Windows 注意管理员权限,Linux 注意 chmod 权限)
  7. 临时文件 : location 属性指定临时文件目录,上传完成后会自动清理

7. 运行效果

  1. 部署项目到 Tomcat 等 Servlet 容器
  2. 访问 http://localhost:8080/项目名/upload.jsp
  3. 选择文件并填写描述,点击 "上传文件" 按钮
  4. 上传成功后会显示文件信
  5. 息,失败则显示错误信息

8. 扩展功能(可选)

  • 文件类型验证 : 通过 fileName.endsWith() 或 filePart.getContentType() 验证文件类型
  • 上传进度显示 : 使用 ProgressListener 监听上传进度(需结合 JavaScript)
  • 大文件分片上传: 对于超大文件,可将文件分片后上传,再合并
  • 文件下载功能: 添加下载 Servlet,根据文件名从服务器下载文件
  • 数据库记录: 将上传文件的信息(文件名、路径、大小、上传时间等)存入数据库
    Servlet + Apache Commons FileUpload
    以下是基于 Servlet + Apache Commons FileUpload 的完整文件上传案例(第三方工具可简化原生 Servlet 的文件解析逻辑):

一、环境准备

  • JDK 8+
  • Servlet 容器(Tomcat 7+)
  • Maven(用于依赖管理)

二、依赖配置(Maven pom.xml**)**

需引入 commons-fileupload(核心上传工具)和 commons-io(其依赖包):
xml
<dependencies> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- Apache Commons FileUpload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <!-- Apache Commons IO(FileUpload依赖此包) --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies>

三、上传表单页面( webapp/commons-upload.jsp**)**

jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Commons FileUpload 上传示例</title> <style> .container { width: 500px; margin: 50px auto; padding: 20px; border: 1px solid #eee; } .form-group { margin: 15px 0; } .error { color: #dc3545; padding: 10px; background: #f8d7da; border-radius: 4px; } .success { color: #198754; padding: 10px; background: #d1e7dd; border-radius: 4px; } </style> </head> <body> <div class="container"> <h2>文件上传(Commons FileUpload)</h2> <form action="CommonsUploadServlet" method="post" enctype="multipart/form-data"> <div class="form-group"> <label>选择文件:</label> <input type="file" name="file" required> </div> <div class="form-group"> <label>文件描述:</label> <input type="text" name="desc" placeholder="输入文件描述"> </div> <button type="submit">上传</button> </form> <%-- 显示上传结果 --%> <% if (request.getAttribute("msg") != null) { %> <div class="<%= request.getAttribute("type").equals("success") ? "success" : "error" %>"> <%= request.getAttribute("msg") %> </div> <% } %> </div> </body> </html>

四、核心 Servlet 代码( CommonsFileUploadServlet.java**)**

java
运行
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; import java.util.UUID; @WebServlet("/CommonsUploadServlet") public class CommonsFileUploadServlet extends HttpServlet { // 最终文件存储目录(需手动创建,或代码中自动创建) private static final String UPLOAD_DIR = "D:/commons_uploads"; // 临时文件存储目录 private static final String TEMP_DIR = "D:/commons_temp"; // 单个文件最大限制(10MB) private static final long MAX_FILE_SIZE = 1024 * 1024 * 10; // 整个请求最大限制(50MB) private static final long MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 内存阈值(超过则写入临时文件,1MB) private static final int MEMORY_THRESHOLD = 1024 * 1024; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 1. 验证请求是否为 multipart/form-data 类型 if (!ServletFileUpload.isMultipartContent(request)) { request.setAttribute("type", "error"); request.setAttribute("msg", "请使用 multipart/form-data 格式上传"); request.getRequestDispatcher("/commons-upload.jsp").forward(request, response); return; } // 2. 配置文件上传工厂(处理临时文件、内存阈值) DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(MEMORY_THRESHOLD); // 内存阈值 factory.setRepository(new File(TEMP_DIR)); // 临时文件目录(需确保存在) // 3. 创建 ServletFileUpload 实例(处理上传请求) ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(MAX_FILE_SIZE); // 单个文件大小限制 upload.setSizeMax(MAX_REQUEST_SIZE); // 整个请求大小限制 upload.setHeaderEncoding("UTF-8"); // 解决文件名中文乱码 // 4. 确保存储目录存在 File uploadDir = new File(UPLOAD_DIR); if (!uploadDir.exists()) { uploadDir.mkdirs(); } try { // 5. 解析请求,获取所有表单项(普通字段 + 文件字段) List<FileItem> formItems = upload.parseRequest(request); // 6. 遍历表单项,区分普通字段和文件字段 String fileDesc = ""; // 存储文件描述 for (FileItem item : formItems) { if (item.isFormField()) { // 普通表单字段(如描述) if ("desc".equals(item.getFieldName())) { fileDesc = item.getString("UTF-8"); // 显式指定编码防乱码 } } else { // 文件字段(处理上传文件) String fileName = new File(item.getName()).getName(); // 获取原始文件名 if (fileName.isEmpty()) { continue; // 跳过空文件 } // 处理文件名重复:UUID + 原始文件名 String uniqueFileName = UUID.randomUUID().toString() + "_" + fileName; String filePath = UPLOAD_DIR + File.separator + uniqueFileName; // 7. 写入文件到目标目录(CommonsFileUpload 提供的 write 方法简化流操作) File storeFile = new File(filePath); item.write(storeFile); // 8. 上传成功,返回结果 request.setAttribute("type", "success"); request.setAttribute("msg", String.format( "上传成功!<br>原文件名:%s<br>描述:%s<br>存储路径:%s", fileName, fileDesc, filePath )); } } } catch (FileUploadException e) { // 文件上传异常(如文件过大) request.setAttribute("type", "error"); request.setAttribute("msg", "上传失败:" + e.getMessage()); } catch (Exception e) { // 其他异常(如写入文件失败) request.setAttribute("type", "error"); request.setAttribute("msg", "系统异常:" + e.getMessage()); } // 9. 转发到表单页面显示结果 request.getRequestDispatcher("/commons-upload.jsp").forward(request, response); } }

五、关键说明

  1. 核心类作用
  • DiskFileItemFactory:负责创建文件项(FileItem),管理临时文件和内存阈值;
  • ServletFileUpload:负责解析multipart请求,处理文件大小限制;
  • FileItem:代表表单中的一个项(普通字段 / 文件字段),提供isFormField()区分类型。
  1. 中文乱码解决
  • 表单页面和 Servlet 均设置UTF-8编码;
  • ServletFileUpload通过setHeaderEncoding("UTF-8")解决文件名乱码;
  • 普通字段通过item.getString("UTF-8")指定编码。
  1. 临时文件
  • DiskFileItemFactory指定的临时目录(TEMP_DIR)会存储超过内存阈值的文件;
  • 上传完成后,FileItem会自动清理临时文件(无需手动删除)。

六、运行步骤

  1. 部署项目到 Tomcat;
  2. 访问http://localhost:8080/项目名/commons-upload.jsp;
  3. 选择文件、填写描述后点击 "上传",即可看到结果。
    SSM(Spring + Spring MVC + MyBatis)框架 的文件上传

一、环境准备

  • JDK: 8 或更高版本
  • 构建工具: Maven
  • Web 容器: Tomcat 7+
  • SSM 框架版本 :
    • Spring: 5.3.20
    • Spring MVC: 5.3.20
    • MyBatis: 3.5.10

二、Maven 依赖配置 ( pom.xml**)**

除了 SSM 框架的核心依赖外,文件上传需要 commons-fileupload 和 commons-io。
xml
<dependencies> <!-- Spring Core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.20</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!-- 数据库驱动 (以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <scope>runtime</scope> </dependency> <!-- 文件上传 --> <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> <!-- JSP API (用于页面渲染) --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> </dependencies>

三、Spring MVC 配置文件 ( spring-mvc.xml**)**

关键是配置 multipartResolver Bean,这是 Spring MVC 处理文件上传的核心。
xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 扫描Controller层注解 --> <context:component-scan base-package="com.example.ssm.upload.controller"/> <!-- 开启Spring MVC注解驱动 --> <mvc:annotation-driven/> <!-- 配置文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置默认编码 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 单个文件最大大小 (10MB) --> <property name="maxUploadSizePerFile" value="10485760"/> <!-- 总上传文件大小 (50MB) --> <property name="maxUploadSize" value="52428800"/> <!-- 内存中的阈值,超过则写入临时文件 (1MB) --> <property name="maxInMemorySize" value="1048576"/> <!-- 临时文件存储位置 (可选, 默认使用Servlet容器的临时目录) --> <!-- <property name="uploadTempDir" value="file:D:/temp/springmvc_uploads"/> --> </bean> <!-- 配置视图解析器 (用于返回JSP页面) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 静态资源映射 (如CSS, JS) --> <mvc:resources mapping="/static/**" location="/static/"/> </beans>

四、Controller 层实现

创建一个 FileUploadController 来处理上传请求。Spring MVC 会自动将上传的文件封装成 MultipartFile 对象。
java
运行
package com.example.ssm.upload.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @Controller public class FileUploadController { // 文件存储根目录 (建议在配置文件中配置,这里为了简化硬编码) private static final String UPLOAD_BASE_DIR = "D:/ssm_uploads/"; /** * 跳转到上传页面 */ @RequestMapping(value = "/upload", method = RequestMethod.GET) public String showUploadPage() { // 返回到 /WEB-INF/views/upload.jsp return "upload"; } /** * 处理文件上传请求 * * @param file 上传的文件 * @param desc 文件描述 * @param model 用于向视图传递数据 * @return 跳转回上传页面 */ @RequestMapping(value = "/upload", method = RequestMethod.POST) public String handleFileUpload( @RequestParam("file") MultipartFile file, @RequestParam(value = "desc", required = false) String desc, Model model) { // 1. 检查文件是否为空 if (file.isEmpty()) { model.addAttribute("message", "请选择一个文件进行上传"); model.addAttribute("status", "error"); return "upload"; } try { // 2. 处理文件名,避免重复 (使用UUID) String originalFileName = file.getOriginalFilename(); String uniqueFileName = UUID.randomUUID().toString() + "_" + originalFileName; // 3. 确保存储目录存在 File uploadDir = new File(UPLOAD_BASE_DIR); if (!uploadDir.exists()) { uploadDir.mkdirs(); } // 4. 构建文件路径并保存文件 File destFile = new File(UPLOAD_BASE_DIR + uniqueFileName); file.transferTo(destFile); // Spring MVC提供的便捷方法 // 5. 上传成功,准备返回信息 model.addAttribute("status", "success"); model.addAttribute("message", String.format( "文件上传成功!<br/>原文件名: %s<br/>描述: %s<br/>存储路径: %s", originalFileName, desc, destFile.getAbsolutePath() )); } catch (IOException e) { e.printStackTrace(); // 6. 上传失败 model.addAttribute("status", "error"); model.addAttribute("message", "文件上传失败: " + e.getMessage()); } // 7. 跳转回上传页面显示结果 return "upload"; } }

五、前端 JSP 页面 ( /WEB-INF/views/upload.jsp**)**

创建一个简单的上传表单,并显示上传结果。
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SSM 文件上传示例</title> <style> body { font-family: sans-serif; text-align: center; margin-top: 50px; } .container { display: inline-block; text-align: left; padding: 25px; border: 1px solid #ccc; border-radius: 8px; background-color: #f9f9f9; } .form-group { margin: 15px 0; } label { display: block; margin-bottom: 5px; font-weight: bold; } input[type="file"], input[type="text"] { width: 350px; padding: 8px; } input[type="submit"] { padding: 10px 20px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } input[type="submit"]:hover { background-color: #0056b3; } .message { margin-top: 20px; padding: 15px; border-radius: 4px; } .success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } </style> </head> <body> <div class="container"> <h2>Spring MVC 文件上传</h2> <form action="{pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"\> \

\
相关推荐
赛贝维权申诉1 小时前
30款亚马逊热销儿童玩具,美国外观专利侵权预警!
java·开发语言
幻灭行度1 小时前
docker镜像导入到K8S的containerd中
java·docker·kubernetes
武昌库里写JAVA2 小时前
Java如何快速入门?Java基础_Java入门
java·vue.js·spring boot·后端·sql
那我掉的头发算什么2 小时前
【javaEE】多线程进阶--CAS与原子类
android·java·jvm·java-ee·intellij-idea
SteveCode2 小时前
血赚不亏!Java 17 9 个炸裂特性,程序员看完直呼:太香了!
java
BLOB_1010012 小时前
关于懒人复制idea项目的坑
java·ide·intellij-idea
Moe4882 小时前
Spring Boot 自动配置核心:AutoConfigurationImportSelector 深度解析
java·后端·设计模式
6***x5453 小时前
Java设计模式之策略模式
java·设计模式·策略模式
章鱼哥7303 小时前
Java 策略模式 + 聚合对象:实现多模块的统计与聚合,快速扩展的实战
java·开发语言·策略模式