ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SSM+Maven+MySQL学生管理系统:从环境搭建到war包部署全流程指南

SSM+Maven+MySQL学生管理系统:从环境搭建到war包部署全流程指南 说实话在2025年聊SSMJSP这套组合很多人的第一反应是都什么年代了怎么还在用这么老的技术栈。但是你真去看各大招聘网站的岗位要求和高校毕设选题就会发现JavaWeb这个方向SSM框架MySQL依然是绕不过去的高频词。这个技术栈恰好卡在“理解Web开发底层原理”和“满足日常业务开发需求”的中间地带所以毕设、课程设计、培训班的项目案例里几乎全是它。我自己用这套组合做过校园类的信息管理系统从环境搭建到部署上线前前后后踩过的坑不算少这篇就把整个链路完整捋一遍——从为什么还要选SSM到数据库怎么设计核心配置怎么写再到war包怎么部署最后是常见问题的排查清单。正在做毕设、或者刚学完JavaWeb想找一个完整项目练手的人这篇文章可以直接当参考手册用。1. 为什么SSMMaven这套组合到今天还是毕设和课程设计的常客先明确一件事SSM不是某个公司出的框架全家桶而是三个框架的整合Spring负责管理对象和事务SpringMVC负责接收和分发请求MyBatis负责数据库操作。这三兄弟配合Maven做依赖管理和构建再加上JSP做页面展示就构成了一个非常经典的JavaWeb分层项目。现在Spring Boot确实香但把SSM这套完整走一遍你对一个请求从浏览器出发、进容器、被拦截器拦住、被Controller接收、调Service、查数据库、再返回JSP渲染成HTML的完整链路会有很直观的体感。后面再看Spring Boot的自动配置就会有豁然开朗的感觉。1.1 Spring、SpringMVC、MyBatis在项目里分别扮演什么角色我用一个餐厅的类比来解释这三个框架的分工方便新手一次看懂。Spring是后厨总管。它最核心的IOC容器负责创建和组装所有对象的依赖关系。在传统代码里你要用StudentService就得自己new一个而在SSM项目里这些对象全部交给Spring容器管谁要用就标注一个Autowired容器自动注入。AOP切面则负责处理事务、日志这些横切逻辑比如Service层的方法执行前开启事务、执行成功后提交、出现异常回滚这些都不用你在业务代码里手工写。SpringMVC是前台接待。所有HTTP请求先到DispatcherServlet这个分发器它根据URL找到对应的Controller方法。前端传过来的参数SpringMVC帮你绑定到方法的参数对象上Controller返回的字符串通过视图解析器拼接出真正的JSP路径。整个流程就像客人点菜前台接单后分发给对应厨师。MyBatis是采买专员。它本质上是JDBC的封装把SQL语句写在XML文件或注解里避免了你手写Connection、PreparedStatement、ResultSet那一堆模板代码。最方便的是它的输入参数映射和结果集映射把一个Student对象直接作为参数传进去查询结果也能自动封装成List。SQL还是你自己写所以对SQL掌握的要求并不低。这三个框架各司其职组合起来的好处是控制层、业务层、持久层完全分层每层各管各的事项目再大也不会乱成一团。很多老项目至今还在用这套架构所以学会SSM不只是为了交作业它是真正能带到岗位上的技能。1.2 Maven到底解决了什么问题依赖管理、统一构建、一键打包没有Maven的年代做JavaWeb项目最痛苦的事情就是找jar包。你要去官网一个又一个地下载然后手动复制到WEB-INF/lib目录没下全、版本不对、传递依赖缺失分分钟让项目跑不起来。Maven出现以后这种事情彻底变成了“声明式”——你在pom.xml里写上依赖坐标Maven自动从仓库下载并且会把依赖的依赖一并拉下来。Maven里每个依赖都有三个定位信息groupId、artifactId、version。比如MySQL驱动groupId是mysqlartifactId是mysql-connector-javaversion是5.1.47或8.0.33。pom.xml就是项目的购物清单里面写清楚要哪些依赖Maven负责去仓库采购买回来放到本地仓库统一管理。多个项目可以共用同一个本地仓库不用每个项目都复制一份jar包。再说构建生命周期。Maven有一套固定的生命周期validate、compile、test、package、verify、install、deploy。平时项目里用得最多的是两条命令mvn clean就是把target目录里的旧产物清掉mvn package就是编译并打包成war或jar。第一次接触Maven的人容易忽略clean这一步结果旧class文件残留改了代码不生效排查了半天才发现是没clean。本地仓库默认在用户目录下的.m2/repository中央仓库在国外国内下载速度一言难尽。所以几乎每个国内开发者都会在settings.xml里配阿里云镜像。配置方法很简单找到Maven安装目录下conf/settings.xml在mirrors节点里加一段mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror配置完以后下载速度会有质的提升。这条不夸张地说能帮你省掉一下午的等待时间。2. 系统功能拆解与数据库建模先把设计图画清楚学生信息管理系统这个题目之所以被大量选做毕设是因为它的业务规模不大不小刚好能把增删改查、分页、条件搜索、登录拦截这些JavaWeb核心知识点全部串起来。但很多人在动手写代码前就犯了一个错误控制层、Service、Mapper的代码写了一大堆数据库表却只建了一张学生表。等到做班级统计、用户登录的时候才想起来缺表缺字段再回头去改改SQL改代码工作量翻倍。2.1 典型的学生信息管理系统功能清单在做任何编码之前先把功能清单列出来。我按毕设和课程设计最常见的需求整理了一份登录功能用户输入账号密码校验正确后写入Session未登录用户无法访问系统内部页面学生管理学生信息的新增、编辑、删除、列表展示按学号或姓名模糊搜索班级管理班级信息的维护添加学生时可以选择所属班级分页展示学生列表不能一次加载所有数据要按页码查询数据统计按班级统计学生人数这个需求经常出现在功能要求里这里多说一句很多需求书上的“统计分析”其实没有那么玄乎就是一个GROUP BY分组查询而已。但如果你在学生表里没有设计class_id这个外键字段后面做统计就要JOIN两张表逻辑复杂一截。所以在设计表结构的时候一定要把“这个字段以后会用来干什么”想清楚。2.2 四张核心表的设计与字段取舍我在这个项目里设计了四张表用户表t_user、班级表t_class、学生表t_student、成绩表t_score。成绩表属于扩展功能如果不想做成绩管理可以去掉但学生表和班级表之间的关联关系是必须的。用户表结构CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 登录名, password VARCHAR(100) NOT NULL COMMENT MD5加盐后的密码, real_name VARCHAR(50) DEFAULT NULL COMMENT 真实姓名, role VARCHAR(20) DEFAULT admin COMMENT 角色admin/teacher, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;学生表结构CREATE TABLE t_student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, gender TINYINT DEFAULT 1 COMMENT 1男 0女, birth_date DATE DEFAULT NULL COMMENT 出生日期, phone VARCHAR(20) DEFAULT NULL COMMENT 手机号, email VARCHAR(100) DEFAULT NULL, class_id INT DEFAULT NULL COMMENT 所属班级ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_student_no (student_no), KEY idx_class_id (class_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;有几个设计细节值得说一下。第一学号必须加唯一索引否则同一个学生被重复录入两次后面统计报表全是错的。第二gender用TINYINT而不是VARCHAR这样更省空间还能用数字做单选按钮的value回显的时候方便。第三create_time用DATETIME类型并设置默认值为CURRENT_TIMESTAMP你就不用每次插入时手动填时间。还有一个非常重要的选择学生表的class_id关联班级表我建议只做逻辑关联不要在MySQL里强制加FOREIGN KEY约束。原因是学生在转班、删除班级时物理外键会给操作带来很多约束上的麻烦比如“班级里还有学生班级删不掉”这种报错处理起来非常烦人。逻辑外键的做法是代码里根据class_id去查班级表页面展示时显示班级名称。数据完整性由代码保证而不是数据库约束。字符集方面建议统一用utf8mb4而不是utf8。utf8mb4是utf8的超集能存储表情符号和生僻字。虽然学生管理系统大概率用不上emoji但从现在开始养成习惯以后做别的项目能省不少事。2.3 JSP页面和Controller的请求链路JSP在这个项目里负责的是最后一公里的数据展示和表单交互。很多新手对“JSP页面怎么拿到数据库里的数据”这个问题特别懵其实链路非常清晰浏览器访问 /student/list → 请求被web.xml里配置的DispatcherServlet拦截 → SpringMVC根据路径找到StudentController的list方法 → Controller调用Service层 → Service调用Mapper → Mapper执行SQL查询数据库 → 查询结果一层层返回 → Controller把数据放进Model → 视图解析器把返回值拼接成 /WEB-INF/jsp/student/list.jsp → JSP渲染HTML表格 → 浏览器显示页面。在JSP页面里取数据靠的是EL表达式和JSTL标签。比如查询返回了一个List你可以这样渲染c:forEach items${page.list} varstu tr td${stu.studentNo}/td td${stu.name}/td td${stu.gender 1 ? 男 : 女}/td tda hreftoEdit?id${stu.id}编辑/a/td /tr /c:forEach这里要注意的是JSP拿到的是JavaBean的属性名所以实体类里的属性命名非常重要。我建议所有实体类字段都按驼峰命名比如studentNo、className数据库字段用下划线然后在MyBatis里开启驼峰映射这样数据库的student_no就能自动映射到Java的studentNo省去一大堆手动写resultMap的功夫。3. 环境搭建与SSM整合配置一套能跑通的最小配置环境搭建看起来是最简单的实际上是最容易把人卡死的一关。尤其是MySQL和服务器的版本问题一不对劲就是各种报错。我用的是JDK1.8、Maven3.6.3、MySQL8.0、Tomcat8.5这套组合稳定跑通了很多次。如果你的机器上装的是Tomcat10要特别小心Tomcat10把javax.servlet包换成了jakarta.servlet包老项目的SpringMVC代码会编译报错建议不要自己给自己挖坑还是用Tomcat8或9比较稳妥。3.1 JDK、Maven、MySQL、Tomcat的安装细节JDK方面装1.8就行把JAVA_HOME环境变量配好。新版的JDK18、JDK21不是不能用但很多SSM老项目、老教程都基于1.8遇到版本相关的问题不好排查所以先装个最稳的版本。Maven安装完之后除了配MAVEN_HOME和PATH环境变量还建议单独建一个本地仓库目录比如D:\maven-repo然后在settings.xml里把localRepository改成这个路径。这样做的好处是以后重装系统或者换电脑你的依赖仓库还在不用重新下载几百MB的jar包。MySQL的安装最折磨人。如果你装的是8.0版本记得选择“Use Legacy Authentication”加密方式或者使用8.x版本的mysql-connector-java驱动。否则SSM项目里用的老驱动连接会报“Unable to load authentication plugin caching_sha2_password”。另外连接串里一定要加上serverTimezoneAsia/Shanghai否则会报时区错误。Tomcat不用装直接去官网下载zip压缩包解压到一个目录就能用。bin目录下startup.bat启动默认端口8080。如果8080被占用修改conf/server.xml里的端口号再重启。3.2 在IDEA里创建Maven Web项目IDEA里创建项目的路径是File → New Project → Maven → 勾选Create from archetype → 选择org.apache.maven.archetypes:maven-archetype-webapp。如果你用的是新版IDEA这个选项可能需要先在Settings里把Maven配置好路径切到你本地安装的Maven目录和settings.xml。创建完项目之后默认只有src/main/webapp和index.jsp还需要手动补全目录结构src/main/java、src/main/resources、src/test/java。方法是在src/main下面新建目录然后右键Mark Directory as Sources Root或Resources Root。这一步漏了的话后面新建package都会跑到奇怪的位置去。接下来要确认项目的Web Facet配置。打开Project Structure → Modules找到Web模块把Deployment Descriptors的web.xml路径指到src/main/webapp/WEB-INF/web.xml再把Web Resource Directories指到src/main/webapp。然后配置TomcatRun → Edit Configurations → 添加Tomcat Server Local在Deployment选项卡里添加Artifact选择war explodedApplication context填/student_system。这个上下文路径决定了你访问项目时URL里的项目名建议先想好。3.3 三个关键配置文件web.xml、spring.xml、springmvc.xml一次讲透SSM整合的核心全在配置文件里。我把每一个关键点拆开讲。web.xml是Web项目的总入口。它至少要干三件事配置乱码过滤器、配置Spring容器监听器、配置SpringMVC的DispatcherServlet。乱码过滤器非常关键必须放在过滤器链的最前面filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping然后配置SpringMVC的入口Servletservlet servlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:springmvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mappingurl-pattern写斜杠表示所有请求都交给SpringMVC处理。这个配置直接决定了项目的请求分发给谁。springmvc.xml里必配的内容有四个组件扫描、注解驱动、视图解析器、静态资源放行。组件扫描指定Controller所在的包注解驱动开启Controller、RequestMapping等注解的支持视图解析器拼接JSP路径静态资源放行是防止.css、.js文件被DispatcherServlet拦截后返回404。context:component-scan base-packagecom.example.controller / mvc:annotation-driven / bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/jsp/ / property namesuffix value.jsp / /bean mvc:default-servlet-handler /这里有个经验JSP一定要放在WEB-INF目录下。直接放在webapp根目录的JSP用户可以通过URL直接访问绕过了控制器和权限校验放在WEB-INF下Tomcat会拒绝直接访问必须通过Controller转发才能打开安全性高很多。spring.xml负责Spring容器的配置数据源、SqlSessionFactory、Mapper扫描、事务管理器都在这里。MyBatis整合Spring要特别注意两点第一mapper XML文件要和Mapper接口放在同一个包下或者通过mapper-locations指定位置第二数据源的driver-class、url、username、password不能写错MySQL8的驱动类名是com.mysql.cj.jdbc.Driver老驱动才是com.mysql.jdbc.Driver。这个坑我至少见过十次全是把老驱动搬到MySQL8上报ClassNotFoundException。4. 核心功能实现登录、分页、增删改查一气呵成环境搭好、配置跑通以后真正的业务代码反而顺畅得多因为CRUD的逻辑是高度类似的。这一章我挑三个最关键的部分讲登录拦截器、分页查询、增删改查接口设计。4.1 登录拦截器和Session校验的落地方式有的同学偷懒在每个JSP页面开头写死一段Java代码判断Session这种做法不是不能用但代码冗余严重改起来要翻遍所有页面。正确的方式是写一个统一的拦截器在请求进入Controller之前做校验。登录拦截器的核心类是HandlerInterceptor重写preHandle方法public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object loginUser request.getSession().getAttribute(loginUser); if (loginUser null) { // 未登录跳回登录页 response.sendRedirect(request.getContextPath() /login); return false; } return true; } }然后在springmvc.xml里注册拦截器并且要放行登录页和静态资源否则会出现一个经典问题登录页面自己的CSS和JS也被拦截了页面样式全部丢失丑得没法看更严重的是未登录跳转/login后发现/login这个请求也被拦截器拦住形成无限重定向。mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/css/**/ mvc:exclude-mapping path/js/**/ mvc:exclude-mapping path/images/**/ bean classcom.example.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors登录密码不要明文存储在数据库里。最简单也要做一层MD5更稳妥的是MD5加盐比如把用户名作为盐拼进密码串再做摘要。这样即使数据库泄露明文密码也不会被一眼看穿。4.2 分页查询手写LIMIT语句比PageHelper更值得做一次学生管理系统的数据量不会特别大几百上千条但分页这个功能一定要做因为它是JavaWeb面试和笔试的高频考点。实现方式有两种用PageHelper插件或者手写LIMIT。如果你只是单纯想快速出功能PageHelper很香一行代码就能完成分页。但如果是做毕设我强烈建议手写一次分页SQL。手写分页逻辑不复杂核心就两步第一步查总数第二步用LIMIT查当前页的数据。Controller里的写法RequestMapping(/list) public String list(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, String keyword, Model model) { int start (pageNum - 1) * pageSize; ListStudent list studentService.findPage(start, pageSize, keyword); int total studentService.count(keyword); model.addAttribute(list, list); model.addAttribute(pageNum, pageNum); model.addAttribute(pageSize, pageSize); model.addAttribute(total, total); return student/list; }Mapper XML里写两个查询select idfindPage resultTypecom.example.entity.Student select * from t_student where if testkeyword ! null and keyword ! and name like concat(%, #{keyword}, %) /if /where order by id desc limit #{start}, #{pageSize} /select select idcount resultTypeint select count(*) from t_student where if testkeyword ! null and keyword ! and name like concat(%, #{keyword}, %) /if /where /select有个细节容易踩坑模糊查询一定要用concat(%, #{keyword}, %)直接写%${keyword}%虽然能跑通但用的是字符串拼接而不是预编译存在SQL注入风险。这个点面试官一问一个准你回答正则预编译和防止注入印象分立刻就不一样了。查询出来的页码信息可以封装一个简单的PageInfo实体类把list、total、pageNum、pageSize、totalPage都放进去页面渲染时直接取。手写一次分页之后你对数据库分页的理解会深刻很多后面再遇到PageHelper遇到Bug也知道它内部大概是怎么做的。4.3 新增、编辑、删除的接口设计与参数校验增删改查的代码套路其实是差不多的但有几个细节值得单独拿出来说。新增学生时Controller方法接收一个Student对象前端表单里每个input的name属性必须和实体类的属性名一致SpringMVC才能自动绑定参数。否则你辛辛苦苦填的姓名、学号后端收到全是null。排查这个问题最简单的办法是在Controller里打个System.out.println把收到的对象打出来看一眼。删除学生时有一个很容易忽略的问题如果学生表被成绩表关联直接DELETE会有外键约束问题报错信息往往会让人摸不着头脑。最省心的方案是在设计表时删除成绩表的外键或者删除时先删成绩记录再删学生。更稳妥的业务做法是逻辑删除增加一个status字段删除时只更新字段状态查询时加上status1的条件。逻辑删除不破坏历史数据的完整性这是企业中很常规的做法放在毕设里也是加分项。编辑功能有个小技巧跳转到编辑页时先用id查询出这条记录把数据回显到表单里。JSP页面对应的写法是在value属性里使用EL表达式input typetext namename value${student.name} /这样用户看到的表单已经填好了原数据修改后提交到/student/update即可。我在项目里习惯把新增和编辑共用一个JSP页面通过判断student是否为空来决定标题是“新增学生”还是“编辑学生”减少页面冗余。5. 打包部署用mvn clean package生成可运行的war包开发环境所有的功能跑通了下一步就是把项目打成war包部署到一个独立的Tomcat里。这一步很多人不熟悉因为平时在IDEA里点一下运行按钮就能跑但面试和实际工作里部署是基础技能。5.1 打包前的准备工作在IDEA右侧的Maven面板展开项目双击clean然后再双击package或者在项目根目录打开命令行执行mvn clean package。打包过程中控制台会输出BUILD SUCCESS然后你会在target目录下看到一个.war文件。打包之前有几件事要确认。第一pom.xml里有没有把打包方式设置成warpackagingwar/packaging如果这块没有配置或者写成了jar打出来的包就不是Web应用部署到Tomcat里也无法运行。第二如果引入了测试建议打包前确认测试用例不会影响构建。如果测试代码里连了数据库打包时数据库连不上会导致构建失败。最简单粗暴的办法是在pom.xml里跳过测试plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration skipTeststrue/skipTests /configuration /plugin第三数据库连接配置不要写死在代码里可以把jdbc.properties放进src/main/resources下打包时会自动打包进去。部署到新环境时改配置文件即可不需要重新编译代码。5.2 war包部署到Tomcat的两种方式第一种方式最简单粗暴把打好的war包直接复制到Tomcat的webapps目录下然后启动Tomcat。Tomcat启动时会自动解压war包生成同名的目录。如果你打出来的包叫student_system.war访问地址就是http://localhost:8080/student_system/login。第二种方式是修改Tomcat的conf/server.xml在Host节点里配置Context把访问路径指定到war包或解压目录。这种方式适合把项目作为根路径访问比如Context path/ docBaseD:/tomcat/webapps/student_system reloadabletrue /配置好之后访问http://localhost:8080/login就是你的登录页URL里不携带项目名看起来更清爽。部署完成后如果你用的是Linux服务器启动命令是bin/startup.sh日志在logs/catalina.out里查看。部署失败不要慌先去看日志是怎么说的80%的问题日志里都能找到答案。6. 常见问题排查与避坑实录这一章是我实际攒下来的问题清单几乎覆盖了SSM学生管理系统开发部署路上最常见的坎。每个问题我都给出排查思路遇到问题照着对照表查就行。6.1 数据库连接类问题速查表问题现象大概率原因解决办法Access denied for user rootlocalhost密码不对或连接串里username/password打错用命令行验证root密码重置密码检查配置The server time zone value is unrecognizedJDBC连接串缺少serverTimezone在url后面加serverTimezoneAsia/ShanghaiClassNotFoundException: com.mysql.jdbc.DriverMySQL8用的是新驱动名驱动类改成com.mysql.cj.jdbc.DriverCommunications link failure服务没启动或端口不是3306检查MySQL服务状态和端口号caching_sha2_password问题MySQL8默认加密方式与旧驱动不兼容换mysql-connector-java 8.x版本MySQL8的驱动问题我在前面提过这里再强调一次。很多老教程的pom.xml里写的是5.1.47配MySQL8会踩坑新项目直接用8.0.x版本省事很多。另外连接串里最好加上useSSLfalse不然MySQL5.7和8.0在SSL握手时偶尔会报错日志里全是SSL相关的警告。6.2 Mapper和配置类的报错问题现象大概率原因解决办法Mapper method not foundMapper接口和Mapper XML绑定失败检查namespace是否等于接口全限定名Invalid bound statement (not found)mapper XML没有正确扫描检查spring.xml里的mapper-locations路径No qualifying bean of typeSpring容器没有扫到Service或Mapper检查包扫描范围是否覆盖404 No mapping for GET /xxxRequestMapping路径或Controller包扫描不对打印所有映射关系确认URL路径一致Invalid bound statement是我见过最多的报错没有之一。原因基本都是Mapper接口和Mapper XML没配对要么namespace写错要么方法id对不上要么XML没有编译进classpath。排查思路是先确认target目录里有没有XML文件没有就是资源过滤问题需要在pom.xml里配置resources包含XML。有文件再看namespace和id。6.3 页面访问与乱码问题的排查问题现象大概率原因解决办法页面直接访问403/404JSP放在WEB-INF下但没有通过Controller转发通过Controller的RequestMapping访问页面CSS/JS全部失效静态资源被DispatcherServlet拦截配置mvc:default-servlet-handler或放行静态资源中文显示为问号数据库字符集、页面编码、请求编码不统一全链路检查UTF-8表单提交中文乱码没有配置乱码过滤器在web.xml里配置CharacterEncodingFilter全链路中文乱码是非常经典的问题。我的解决方案是数据库建库用utf8mb4JDBC连接串带characterEncodingutf8web.xml配CharacterEncodingFilter并设置forceEncodingtrueJSP页面第一行写pageEncodingUTF-8。四个地方全部统一乱码问题基本绝迹。如果还乱码检查HTML里是否有单独指定charset的meta标签覆盖了配置。6.4 Maven构建和Tomcat部署的疑难杂症问题现象大概率原因解决办法mvn package构建失败依赖下载不下来网络问题中央仓库慢配置阿里云镜像或清理本地仓库.lastUpdated文件8080端口被占用其他进程占用了Tomcat端口netstat -ano查PID杀掉进程或改Tomcat端口IDEA里改代码不生效没clean旧class残留mvn clean后再packagewar包名是中文访问路径有编码问题包名含中文不推荐打包前把ArtifactId改成英文Tomcat10启动报错tomcat10用jakarta包名换成Tomcat8或9Maven仓库损坏也是常事。有时候下载依赖中断本地仓库会留下一个.lastUpdated文件Maven会认为这个依赖永远下载不了怎么都拉不下来。解决办法是删掉本地仓库里报错对应的目录再重新构建。还有一个Tomcat部署的经验杀进程不要靠任务管理器乱找命令行用netstat -ano | findstr 8080找到PID后再taskkill /F /PID 进程号两步搞定比打开任务管理器一个个找快得多。最后说一个我个人整理项目的习惯每完成一个模块就在项目根目录写一份简短的NOTES.md记录这个模块的请求URL、涉及的表、遇到的坑。这样到最后写文档或者答辩展示的时候素材都是现成的不用再翻着代码回忆当时是怎么实现的。做完SSM这个项目如果你还有精力可以用Spring Boot把同样的功能重写一遍对比一下两种方式的异同你对框架演进的理解会比只看教程的人深得多。
返回列表