资讯详情

JSP驾校管理系统:原生Java Web毕业设计实战指南

📅 2026/10/14 13:40:34 | 华诺云谱 👁 阅读
JSP驾校管理系统:原生Java Web毕业设计实战指南
简介本资源是一套完整的高校计算机专业毕业设计项目——基于JSP与MySQL开发的驾校管理系统面向Java初学者及Web开发入门学习者解决传统驾校信息管理效率低、学员预约与成绩查询不便等实际问题。压缩包共22.27MB含源码、毕业论文、系统演示视频三大核心模块源码采用B/S架构涵盖前台学员注册/预约/新闻浏览、教练信息查看以及后台管理员对预约记录、考试成绩、用户权限的统一管理论文详述系统需求分析、数据库设计与首页/前台/后台各模块实现逻辑视频直观展示系统运行效果与关键操作流程。资源已获104人学习下载结构清晰、功能完整适合作为课程设计参考、毕设开题范例或JSPMySQL全栈开发实践案例。1. 为什么一个用 JSP 做的驾校管理系统至今还在毕业设计选题榜上稳居前三不是因为它多前沿——Servlet 3.0 都是十年前的规范JSTL 标签库早被 Thymeleaf 和 Vue 挤到角落而是因为它足够“实”。它不抽象、不悬浮学员报名要填身份证号和手机号教练排班得避开冲突时段车辆调度得看维修状态考试预约得校验科目顺序。这些全是真实业务里掰着手指头数出来的约束条件没有一个能靠“前端传个 JSON 后端存个 MongoDB”糊弄过去。这个系统背后是典型的“小而全”Web 工程训练场数据库要建学员、教练、车辆、课程、预约、成绩六张主表外加至少四层外键关联权限要分管理员、教练、学员三角色连“教练只能看自己带的学员”这种细粒度控制都得手写逻辑页面要填表单、查列表、导 Excel、上传照片——每一步都在逼你直面 HTTP 状态码、Session 生命周期、SQL 注入边界、文件上传大小限制这些教科书里写得对、但一跑就报错的硬茬。它适合两类人一类是刚学完《Java Web 编程基础》还没碰过 Spring Boot 的学生需要一个能从零搭起完整请求链路的锚点另一类是想快速验证某个老系统改造可行性的一线开发者比如把某驾校旧系统从 Struts 迁移到轻量级架构时拿它当最小可运行对照组。别被“毕业设计”四个字劝退——真正动手调通request.setCharacterEncoding(UTF-8)和response.setContentType(text/html;charsetUTF-8)乱码问题的人比写一百行 Spring Cloud 微服务配置更懂字符集本质。2. 用原生 JSP Servlet JDBC 搭出可运行骨架不依赖任何框架的最小闭环2.1 数据库建模从驾校业务流反推表结构与关键约束驾校核心流程是“报名 → 分配教练 → 安排练车 → 预约考试 → 成绩录入 → 结业”。对应到数据库必须保证学员student身份证号唯一且非空id_card VARCHAR(18) NOT NULL UNIQUE教练instructor必须绑定至少一辆车vehicle_id INT NOT NULL外键指向vehicle表预约记录appointment必须校验同一学员同一科目不能重复预约、预约时间不能早于当前日期、教练当天排班状态必须为“可用”。提示初学者常忽略appointment表的复合唯一索引。仅对student_id加唯一索引不够——学员可以预约不同科目正确做法是建立(student_id, subject_code)联合唯一索引防止同一学员重复预约同一科目。建表 SQL 示例MySQL 5.7-- 学员表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, id_card VARCHAR(18) NOT NULL UNIQUE, phone VARCHAR(11) NOT NULL, reg_date DATE NOT NULL DEFAULT (CURRENT_DATE) ); -- 教练表含状态字段0-停用1-启用 CREATE TABLE instructor ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, id_card VARCHAR(18) NOT NULL UNIQUE, phone VARCHAR(11) NOT NULL, status TINYINT NOT NULL DEFAULT 1, vehicle_id INT NOT NULL, FOREIGN KEY (vehicle_id) REFERENCES vehicle(id) ); -- 预约表关键联合唯一 时间校验触发器后续补 CREATE TABLE appointment ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, instructor_id INT NOT NULL, subject_code CHAR(2) NOT NULL COMMENT C1,C2,B2等, app_date DATE NOT NULL, app_time TIME NOT NULL, status TINYINT NOT NULL DEFAULT 0 COMMENT 0-待确认,1-已通过,2-已取消, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_student_subject (student_id, subject_code), FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (instructor_id) REFERENCES instructor(id) );逻辑说明uk_student_subject联合唯一索引直接拦截重复预约status字段用整型而非字符串减少存储开销且便于 Java 枚举映射create_time默认值让后台无需手动赋值避免new Date()时区偏差。参数说明VARCHAR(18)严格匹配中国大陆身份证长度15位老号已淘汰18位为标准TINYINT占 1 字节比INT节省 3 字节/行在万级预约数据下可省百 KB 存储COMMENT字段虽不参与执行但生成 ER 图或后期维护时能立刻定位subject_code含义。2.2 Servlet 层路由设计用 web.xml 显式声明替代注解看清请求生命周期JSP 项目若用WebServlet注解新手极易陷入“为什么这个 Servlet 不生效”的玄学排查。我们回归原始方式在WEB-INF/web.xml中显式注册强制你理解容器启动时如何加载 Servlet。!-- web.xml 片段 -- servlet servlet-nameStudentListServlet/servlet-name servlet-classcom.driving.servlet.StudentListServlet/servlet-class /servlet servlet-mapping servlet-nameStudentListServlet/servlet-name url-pattern/admin/student/list/url-pattern /servlet-mapping servlet servlet-nameAppointmentAddServlet/servlet-name servlet-classcom.driving.servlet.AppointmentAddServlet/servlet-class /servlet servlet-mapping servlet-nameAppointmentAddServlet/servlet-name url-pattern/student/appoint/url-pattern /servlet-mapping逻辑说明/admin/student/list是管理员路径/student/appoint是学员路径天然形成权限隔离雏形所有 URL 统一以/开头避免相对路径跳转混乱Servlet 类名与 URL 模式解耦改路径不用动 Java 文件。参数说明servlet-name是内部标识符不暴露给前端可任意命名如StuListSvc但建议与类名一致降低认知负荷url-pattern必须以/开头否则 Tomcat 会报java.lang.IllegalArgumentException: Invalid url-pattern若需通配符用*.do或/api/*但毕业设计中建议用精确路径避免路由歧义。2.3 JSP 页面渲染用 JSTL 替代 scriptlet把 Java 逻辑踢出 HTML禁止在 JSP 里写% while(rs.next()) { %—— 这是十年前的写法现在必须用 JSTL。先在web.xml声明 JSTL 支持Tomcat 8 默认内置但显式声明更稳妥jsp-config taglib taglib-urihttp://java.sun.com/jsp/jstl/core/taglib-uri taglib-location/WEB-INF/tld/c.tld/taglib-location /taglib /jsp-config然后在 JSP 页顶部引入% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % % taglib prefixfmt urihttp://java.sun.com/jsp/jstl/fmt %学员列表页student_list.jsp核心片段table classtable thead tr th姓名/thth身份证号/thth手机号/thth报名日期/thth操作/th /tr /thead tbody c:choose c:when test${empty studentList} trtd colspan5暂无学员/td/tr /c:when c:otherwise c:forEach items${studentList} varstu tr td${stu.name}/td td${stu.idCard}/td td${stu.phone}/td tdfmt:formatDate value${stu.regDate} patternyyyy-MM-dd//td td a hrefstudent/edit?id${stu.id}编辑/a | a hrefstudent/delete?id${stu.id} onclickreturn confirm(确定删除)删除/a /td /tr /c:forEach /c:otherwise /c:choose /tbody /table逻辑说明c:choose替代if-elsec:forEach替代for循环fmt:formatDate统一日期格式彻底剥离 Java 代码${stu.idCard}中的idCard对应 Java Bean 的getIdCard()方法遵循 JavaBean 规范onclickreturn confirm(...)是最简前端校验防误点。参数说明prefixc是自定义前缀可改为jstl但c是业界约定减少团队协作成本patternyyyy-MM-dd必须双引号包裹单引号会报org.apache.jasper.JasperExceptionconfirm()返回false时阻止a默认跳转这是最轻量的删除防护。3. JDBC 连接池与事务控制为什么 DriverManager.getConnection() 在毕业设计里就是错的3.1 用 DBCP2 替代裸连接三步接入连接池DriverManager.getConnection()每次创建新连接100 个并发请求就会创建 100 个 TCP 连接MySQL 默认最大连接数 151瞬间打满。必须用连接池。Apache Commons DBCP2 是最轻量选择比 HikariCP 少 2 个依赖比 Druid 少 5 个监控模块。第一步下载commons-dbcp2-2.9.0.jar和commons-pool2-2.11.1.jar放入WEB-INF/lib/目录。第二步在WEB-INF/web.xml添加监听器容器启动时初始化连接池listener listener-classcom.driving.listener.DBPoolListener/listener-class /listener第三步编写DBPoolListener实现ServletContextListenerpublic class DBPoolListener implements ServletContextListener { private static BasicDataSource dataSource; Override public void contextInitialized(ServletContextEvent sce) { dataSource new BasicDataSource(); dataSource.setUrl(jdbc:mysql://localhost:3306/driving?useSSLfalseserverTimezoneAsia/Shanghai); dataSource.setUsername(root); dataSource.setPassword(123456); dataSource.setInitialSize(5); // 初始连接数 dataSource.setMaxTotal(20); // 最大连接数 dataSource.setMaxWaitMillis(3000); // 获取连接超时毫秒 dataSource.setTestOnBorrow(true); // 取连接前校验有效性 dataSource.setValidationQuery(SELECT 1); // 校验 SQL // 将连接池存入 ServletContext全局可取 sce.getServletContext().setAttribute(dataSource, dataSource); } public static DataSource getDataSource() { return dataSource; } }逻辑说明setTestOnBorrow(true)是血泪经验——不加这句MySQL 连接空闲 8 小时后自动断开wait_timeout 默认值用户点击按钮时抛Communications link failurevalidationQuery用SELECT 1最轻量比SELECT NOW()少一次函数调用。参数说明initialSize5避免首次访问慢5 个连接够 3 人小组测试maxTotal20毕业设计并发不会超 20设太高反而占内存maxWaitMillis3000超时 3 秒立即报错比卡住 30 秒更利于定位问题。3.2 手动事务管理在预约添加场景中保证数据一致性预约操作涉及三张表更新appointment表插入记录、更新instructor表的busy_count字段、更新student表的last_appoint_date。任一环节失败必须全部回滚。关键代码AppointmentAddServlet.javaprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Connection conn null; PreparedStatement ps null; try { DataSource ds (DataSource) getServletContext().getAttribute(dataSource); conn ds.getConnection(); conn.setAutoCommit(false); // 关闭自动提交 // 插入预约记录 String sql1 INSERT INTO appointment(student_id, instructor_id, subject_code, app_date, app_time) VALUES (?, ?, ?, ?, ?); ps conn.prepareStatement(sql1, Statement.RETURN_GENERATED_KEYS); ps.setInt(1, Integer.parseInt(req.getParameter(studentId))); ps.setInt(2, Integer.parseInt(req.getParameter(instructorId))); ps.setString(3, req.getParameter(subjectCode)); ps.setDate(4, Date.valueOf(req.getParameter(appDate))); ps.setTime(5, Time.valueOf(req.getParameter(appTime))); ps.executeUpdate(); // 更新教练忙时计数 String sql2 UPDATE instructor SET busy_count busy_count 1 WHERE id ?; ps conn.prepareStatement(sql2); ps.setInt(1, Integer.parseInt(req.getParameter(instructorId))); ps.executeUpdate(); // 更新学员最后预约时间 String sql3 UPDATE student SET last_appoint_date ? WHERE id ?; ps conn.prepareStatement(sql3); ps.setDate(1, Date.valueOf(req.getParameter(appDate))); ps.setInt(2, Integer.parseInt(req.getParameter(studentId))); ps.executeUpdate(); conn.commit(); // 全部成功才提交 req.setAttribute(msg, 预约成功); } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); } catch (SQLException ex) { } } req.setAttribute(msg, 预约失败 e.getMessage()); e.printStackTrace(); } finally { closeResources(conn, ps, null); } req.getRequestDispatcher(result.jsp).forward(req, resp); }逻辑说明conn.setAutoCommit(false)是事务起点ps.executeUpdate()不提交conn.commit()是终点rollback()在 catch 块中确保异常时回滚closeResources()是自定义工具方法统一关闭资源防泄漏。参数说明Statement.RETURN_GENERATED_KEYS用于获取自增主键此处未用但预留扩展Date.valueOf()和Time.valueOf()直接解析字符串比SimpleDateFormat线程安全req.getRequestDispatcher(result.jsp)用转发而非重定向保留req.setAttribute()数据。4. 权限控制与常见问题排查为什么登录后点菜单还是 4044.1 基于 Filter 的粗粒度权限拦截不推荐在每个 Servlet 里写if (!admin.equals(session.getAttribute(role)))—— 复制粘贴三次就失控。用Filter统一拦截public class AuthFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; HttpSession session request.getSession(false); String path request.getServletPath(); String role session ! null ? (String) session.getAttribute(role) : null; // 管理员路径必须登录且角色为 admin if (path.startsWith(/admin/) !admin.equals(role)) { response.sendRedirect(request.getContextPath() /login.jsp?erroraccess_denied); return; } // 教练路径必须登录且角色为 instructor if (path.startsWith(/instructor/) !instructor.equals(role)) { response.sendRedirect(request.getContextPath() /login.jsp?erroraccess_denied); return; } chain.doFilter(req, resp); } }在web.xml中注册filter filter-nameAuthFilter/filter-name filter-classcom.driving.filter.AuthFilter/filter-class /filter filter-mapping filter-nameAuthFilter/filter-name url-pattern/*/url-pattern /filter-mapping逻辑说明path.startsWith(/admin/)比正则更高效session.getAttribute(role)从登录成功时存入response.sendRedirect()是客户端跳转URL 变化适合权限拒绝chain.doFilter()是放行必须调用否则请求中断。参数说明url-pattern/*/url-pattern拦截所有请求包括静态资源CSS/JS但毕业设计中静态资源少可接受session ! null ? ... : null防止空指针比session.getAttribute(role) null更安全。4.2 常见问题排查五条真实踩坑记录注意以下问题均来自某高校计算机系近三届毕业设计答辩现场高频故障现象 1登录成功后跳转到index.jsp但页面显示HTTP Status 404 – Not Found→ 原因web.xml中welcome-file-list未配置或配置了index.html但实际文件是index.jspTomcat 默认只认index.html、index.htm、index.jsp漏掉.jsp后缀即 404。→ 解决在web.xml中显式声明welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list现象 2学员列表页表格为空控制台无报错数据库明明有数据→ 原因JSP 中${studentList}取不到值但没写c:when test${empty studentList}分支导致表格tbody内无内容浏览器渲染空白。→ 解决强制所有循环结构包裹c:choose即使只是提示“暂无数据”。现象 3修改学员信息后中文姓名变成??数据库里存的是乱码→ 原因MySQL 表字符集是latin1未改成utf8mb4或 JDBC URL 缺少characterEncodingutf8参数。→ 解决两步走——① 执行ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;② JDBC URL 补全jdbc:mysql://...?characterEncodingutf8。现象 4点击“删除学员”浏览器地址栏 URL 变成student/delete?id5但数据库没删→ 原因StudentDeleteServlet的doGet()方法未实现只写了doPost()而a href...发送的是 GET 请求。→ 解决在 Servlet 中重写doGet()调用与doPost()相同的删除逻辑或统一用表单 POST 提交。现象 5本地 Tomcat 运行正常部署到学校服务器后所有 JSP 报org.apache.jasper.JasperException: /index.jsp (line: [1], column: [1]) Unable to compile class for JSP→ 原因服务器 Tomcat 版本低于开发环境如本地用 Tomcat 9服务器是 Tomcat 7JSP 语法不兼容或WEB-INF/lib/下混入了高版本 Servlet API jar。→ 解决统一使用 Tomcat 8.5兼容性最好并删除lib/中所有servlet-api.jarTomcat 自带重复引入必报错。5. 文件上传与 Excel 导出用 Apache Commons FileUpload 和 POI 实现两个刚需功能5.1 学员照片上传绕过request.getParameter()的 multipart 陷阱HTML 表单必须设enctypemultipart/form-data此时request.getParameter()失效必须用Apache Commons FileUpload。第一步引入commons-fileupload-1.5.jar和commons-io-2.11.0.jar。第二步在学员新增页面student_add.jsp写表单form actionstudent/add methodpost enctypemultipart/form-data input typetext namename required input typetext nameidCard required input typefile namephoto acceptimage/* required button typesubmit提交/button /form第三步在StudentAddServlet.java中解析protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); ListFileItem items upload.parseRequest(req); String name , idCard ; String photoPath null; for (FileItem item : items) { if (item.isFormField()) { // 普通字段 String fieldName item.getFieldName(); String value item.getString(UTF-8); if (name.equals(fieldName)) name value; if (idCard.equals(fieldName)) idCard value; } else { // 文件字段 if (!item.getName().isEmpty()) { String fileName new Date().getTime() _ item.getName(); String savePath req.getServletContext().getRealPath(/uploads/); File uploadDir new File(savePath); if (!uploadDir.exists()) uploadDir.mkdirs(); item.write(new File(uploadDir, fileName)); photoPath /uploads/ fileName; } } } // 插入数据库photoPath 存入 student 表的 photo_url 字段 // ... JDBC 插入逻辑 }逻辑说明item.isFormField()区分普通字段和文件字段item.getString(UTF-8)强制用 UTF-8 解码解决中文参数乱码new Date().getTime()生成唯一文件名避免重名覆盖getRealPath(/uploads/)获取服务器绝对路径必须用此而非相对路径。参数说明acceptimage/*是前端校验防用户选错文件类型fileName拼接时间戳而非原名杜绝../../etc/passwd路径遍历攻击uploadDir.mkdirs()确保目录存在否则item.write()抛java.io.FileNotFoundException。5.2 学员数据 Excel 导出用 Apache POI 生成 .xlsx 文件导出功能不走页面跳转而是response直接写二进制流。protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 查询数据 ListStudent students studentService.findAll(); // 2. 创建工作簿 XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(学员列表); // 3. 写表头 XSSFRow headerRow sheet.createRow(0); String[] headers {ID, 姓名, 身份证号, 手机号, 报名日期}; for (int i 0; i headers.length; i) { headerRow.createCell(i).setCellValue(headers[i]); } // 4. 写数据行 int rowNum 1; for (Student stu : students) { XSSFRow row sheet.createRow(rowNum); row.createCell(0).setCellValue(stu.getId()); row.createCell(1).setCellValue(stu.getName()); row.createCell(2).setCellValue(stu.getIdCard()); row.createCell(3).setCellValue(stu.getPhone()); row.createCell(4).setCellValue( stu.getRegDate() ! null ? new SimpleDateFormat(yyyy-MM-dd).format(stu.getRegDate()) : ); } // 5. 设置响应头触发下载 resp.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); String fileName URLEncoder.encode(学员列表_ new Date().getTime() .xlsx, UTF-8); resp.setHeader(Content-Disposition, attachment; filename fileName); // 6. 写出流 workbook.write(resp.getOutputStream()); workbook.close(); }逻辑说明XSSFWorkbook对应.xlsxExcel 2007比HSSFWorkbook.xls支持更大行数URLEncoder.encode()处理中文文件名否则 Chrome 下下载文件名乱码resp.getOutputStream()直接写二进制不经过 JSP 渲染。参数说明sheet.createRow(0)从第 0 行开始Excel 行号从 1 显示但 POI 索引从 0setCellValue()自动识别字符串/数字/日期无需手动判断类型workbook.close()必须调用否则内存泄漏100 次导出吃光 JVM 堆内存。6. 从源码包到可运行系统解压后必须做的七件事与三个验证技巧拿到标题里的毕业设计-基于JSP的驾校管理系统-设计与实现源码论文视频.zip别急着导入 IDE。这个压缩包大概率是某届学生打包的成品但直接运行九成失败。我带过三届毕设总结出解压后必须立即执行的七件事以及三个快速验证是否真跑通的技巧。6.1 解压后必做的七件事按顺序检查WEB-INF/web.xml的 servlet-mapping 路径打开web.xml搜索url-pattern确认所有路径不以//开头如/admin//student/list是错的且无空格。Tomcat 对路径空格极其敏感一个空格就 404。核对WEB-INF/lib/下的 jar 包版本列出所有 jar重点检查mysql-connector-java-*.jar必须 5.1.49 或 8.0.28新版驱动不兼容老 Tomcat、commons-dbcp2-*.jar必须 2.9.02.8.x 有连接泄漏 bug、poi-*.jar必须 5.2.4低版本不支持.xlsx。版本不符立刻替换。修改数据库连接配置找到DBPoolListener.java或DBUtil.java将setUrl()、setUsername()、setPassword()改成你本地 MySQL 的值。特别注意如果 MySQL 8.0 用caching_sha2_password认证插件必须在 URL 加?serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue否则连不上。创建 uploads 目录并赋权在项目根目录下手动创建uploads/文件夹不是WEB-INF/uploads/。Tomcat 运行时用户需有写权限Windows 下右键属性 → 安全 → 编辑 → 添加Users组并勾选“写入”Linux 下chmod 755 uploads。清理build/和target/文件夹如果压缩包里包含这两个文件夹全部删除。它们是编译产物IDE 会重新生成残留旧 class 文件会导致NoClassDefFoundError。检查 JSP 页面的 pageEncoding打开任意 JSP如index.jsp确认第一行是% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%。缺pageEncodingUTF-8中文注释会编译报错。设置 Tomcat 的 URI 编码编辑conf/server.xml找到Connector port8080 ... /在末尾添加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /不加这句GET 请求的中文参数如?name张三会变乱码。6.2 三个验证技巧5 分钟内确认系统是否真可用验证目标操作步骤预期结果失败原因定位数据库连通性启动 Tomcat访问http://localhost:8080/your-app-context/login.jsp输入任意账号密码抓包看登录请求的响应体返回{success:false,msg:用户名或密码错误}JSON 格式或跳转到index.jsp若返回 500 错误看 Tomcatlogs/catalina.out搜SQLException八成是数据库配置错或表不存在JSP 编译能力访问http://localhost:8080/your-app-context/test.jsp新建一个只写% new java.util.Date() %的页面页面显示当前时间若报Unable to compile class for JSP检查web.xml的jsp-config是否缺失或lib/下有冲突的jsp-api.jar文件上传功能在学员新增页上传一张小于 1MB 的 JPG 照片提交后查看uploads/目录目录下出现171xxxxxx_xxx.jpg文件且数据库student表photo_url字段值为/uploads/171xxxxxx_xxx.jpg若文件未生成检查DiskFileItemFactory的临时目录权限若字段为空检查item.isFormField()逻辑是否漏判最后说个血泪习惯每次改完配置我一定在 Tomcatbin/目录下执行./shutdown.sh ./startup.shWindows 用shutdown.bat/startup.bat而不是只点 IDE 的 restart 按钮。因为 IDE 的热部署有时不重载web.xml和server.xml你以为重启了其实还是旧配置在跑。这个习惯帮我少熬了 27 个通宵。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑