2026/10/12 4:38:41

JavaEE学习路线指南:从Servlet到SpringBoot的避坑实践

JavaEE学习路线指南:从Servlet到SpringBoot的避坑实践 作为一个断断续续折腾过Java后端的人我特别能理解新手在面对JavaEE时的那种“东西多到不知道从哪里下手”的沮丧感。我最初学完JavaSE之后照着网上很火的一套“狂神说Java系列”教程从JavaWeb一路学到SpringBoot前后花了大概两个多月。这篇文章不吹不黑把这套系列里我认为最有价值的部分、我自己的学习路径、以及实操中踩过的坑整理出来希望对正在走同一条路的人有点帮助。我不是什么技术大牛只是一个跟着教程一步步把JavaEE跑通的普通学习者。下文提到的所有知识点、代码和排查思路都是我自己实际敲过、跑过、报错后才总结出来的。如果你是刚学完Java基础正在犹豫要不要学JavaEE或者已经跟着某套教程学了一半卡住了这篇文章可以给你一个明确的路线和避坑参考。1. JavaEE到底在学什么先搞清楚地图再出发1.1 一个容易劝退新手的术语JavaEE很多人一听“JavaEE”就被吓住了其实JavaEE的前身叫J2EE现在是Jakarta EE。它本质上不是一门单独的语言而是一组基于Java语言的企业级开发规范。你可以把它理解成一套“盖房子的标准图纸”规定了你用什么材料、怎么架构、各部分之间怎么配合。真正落地的时候我们接触最多的其实是JavaWeb那一套Servlet、JSP、Filter、Listener、Session、Cookie以及后来的Spring、SpringMVC、MyBatis这些框架。我记得自己刚开始看概念的时候被“容器”“应用服务器”“重量级”这些词绕晕了。后来才慢慢明白对于绝大多数中小型项目我们需要的核心能力不是去编程实现一个完整的JavaEE服务器而是会用已有的容器和框架把网站后端做出来。所以学习JavaEE第一步不是背术语而是要有一个朴素的目标学会用Java处理一个HTTP请求把数据从数据库搬出来渲染到页面上再把用户提交的数据写进数据库。围绕这个目标去学才不会迷路。1.2 狂神说Java系列的内容结构与学习顺序这套系列不是从JavaEE直接开讲的而是先有一堆前置内容。我完整跟下来的主线是Java基础、MySQL、JDBC、HTML/CSS/JavaScript、JavaWebServlet/JSP/Filter等)、Maven、Spring、SpringMVC、MyBatis、SSM整合、SpringBoot。为什么这么强调顺序是因为它们之间有严格的依赖关系。Java基础不牢看不懂反射和动态代理后面的Spring IoC就没法理解MySQL不会写SQLMyBatis的Mapper里就不知道该怎么配SQLJDBC不理解连接、Statement、ResultSet看MyBatis的源码会一头雾水不会HTML和JavaScript连JSP页面上怎么写跳转都搞不清楚。这套系列妙就妙在它把学习路径铺得很平滑每一阶段都在为下一阶段打地基而不是直接甩一个“企业级项目”让你云里雾里。我在看这部分内容时给自己定了一条规矩每个视频看完不管多简单都要自己敲一遍代码。看视频永远觉得自己会了一关上视频写代码就露馅。这条规矩陪我走完了整个JavaEE学习阶段后面我会细说怎么实操。2. 核心知识点拆解那些必须死磕的JavaEE地基2.1 ServletJavaWeb的第一个“正儿八经”的组件Servlet是JavaWeb最核心的东西。在没有Servlet概念的年代浏览器发一个请求服务器层面要做各种底层处理Servlet把这件事封装成了一个Java类。你只需要继承HttpServlet重写doGet或者doPost方法就能处理对应的请求。我当初学Servlet时老师其实就是教程里那个声音反复强调一个生命周期init、service、destroy。一开始我还不理解为什么要背这些后来才明白这是理解Tomcat工作机制的钥匙。Tomcat启动时会创建Servlet实例然后调用init做初始化来了请求就调用service方法根据请求方式分发到doGet或doPost关闭时调用destroy清理资源。写一个最简单的Servlet在IDEA里建一个Web项目写一个类继承HttpServlet重写doGet方法再用WebServlet(/hello)注解或者web.xml配置映射关系然后部署到Tomcat上访问。整个过程看起来简单但背后藏着不少细节注解方式比web.xml配置方便但老项目更多用web.xml两种至少都要会一种。Servlet是单实例多线程的多个请求可能同时进入service方法所以不要在Servlet里随意修改共享的成员变量否则会有并发问题。如果重写了doGet而不重写doPostPOST请求过来会报405错误。我记得第一次配置Servlet映射时路径写错了访问一直404。折腾半天才发现我访问的是/hello但映射写成了/helloworld。这种低级错误在初学阶段非常常见所以后来我养成了一个习惯写完映射先反复核对URL再启动Tomcat。2.2 JSP与MVC别再用JSP写业务逻辑JSP本质上也是一个Servlet。JSP文件第一次被访问时会翻译成Java源码再编译成Servlet执行。它最大的方便在于可以里写HTML代码通过% %写Java代码所以早期很多项目都是JSP一统天下页面里塞满了业务逻辑。《狂神说Java系列》里有一个非常关键的劝诫JSP只用来展示数据不要在里面写太复杂的Java代码。我一开始没当回事后来自己做了一个小页面往JSP里塞了两百多行Java逻辑结果页面一改就要跟着改Java维护起来苦不堪言。后来我老老实实把页面上的Java代码交给EL表达式和JSTL标签逻辑都放在后端处理清爽太多。这里要重点掌握的是每种技术的分工Cookie是保存在浏览器端的小数据Session是保存在服务器端的数据Filter是请求拦截器Listener是监听器EL表达式是访问JavaBean属性的语法糖JSTL是JSP标准标签库。很多人把Cookie和Session搞混我提供一个特别土的理解方式Cookie是发给你手里的小票Session是商家后台的会员档案。小票上可能只写个会员号商家拿着号去后台查详细档案。对应到登录场景服务器生成了一个SessionId放在Cookie里发给浏览器浏览器后续请求带上这个Cookie服务器通过SessionId找到对应的Session对象就知道你登录过了。2.3 Maven与依赖管理JavaEE项目的“脚手架”Maven在JavaEE学习中太关键了。它解决了我早期最痛苦的问题各种jar包去哪里找版本怎么选怎么保证大家机器上依赖一致Maven的核心是pom.xml文件里面声明了项目的坐标groupId、artifactId、version和依赖dependency。它会根据坐标从仓库中下载jar包并自动传递依赖。你引入一个Spring它会自动把Spring需要的其他依赖一起拉下来不用手动去找几十个jar包。我学Maven时对几个命令印象很深mvn clean删除target目录相当于把编译产物清掉。mvn compile编译源代码。mvn package打包成jar/war包。mvn install安装到本地仓库供其他模块使用。实际操作中我刚开始总是下载依赖特别慢后来在Maven的settings.xml里配置了国内镜像仓库速度才正常。这个细节教程里也会提到但我建议你自己动手配一次否则依赖下载这一个环节就能消磨掉你大半的耐心。Maven还有一个生命周期概念clean、validate、compile、test、package、verify、install、deploy。不用刻意背理解成一条流水线就好先清理再编译测试打包安装。每个命令都会执行它之前的步骤。比如执行mvn install它会先compile、test再package最后把war包或者jar包装进本地仓库。2.4 Spring与SpringMVC容器和控制器学到Spring的时候很多人的感受是“突然上线了一大堆新概念”。IoC控制反转、DI依赖注入、AOP面向切面编程一个接一个每个都听着很玄。我用一个生活例子帮助自己理解以前你想用一个音箱你得自己买材料、自己组装、自己接线这叫“控制权在你手里”。有了Spring你只需要跟商店说“我要一个音箱”商店就会把组装好的交到你手里这叫“控制权反转给容器”。当你需要某个对象时Spring容器会帮你把依赖的对象实例都创建好并注入进来这就是依赖注入。SpringMVC是Spring在Web层上的扩展核心是DispatcherServlet。它把所有请求都先送到前端控制器再由控制器分发给对应的Controller方法返回结果后由视图解析器渲染成JSP或JSON响应。我学习时画过一条请求链路浏览器发出请求 → DispatcherServlet → HandlerMapping找到Controller → Controller调用Service → Service调用Dao → 返回ModelAndView → 视图解析器解析 → 渲染响应回浏览器。把这条链路背下来你就基本掌握了SpringMVC的运转逻辑。3. 实操过程与关键细节从零搭建一个SSM项目3.1 环境准备版本匹配是第一个大坑JavaEE教程一般会让你准备JDK、Tomcat、Maven、MySQL和IDEA。我只讲最容易踩坑的版本问题。我当时用的是JDK8、Tomcat8.5、Maven3.6、MySQL5.7。很多人会图新鲜装JDK17结果发现Tomcat版本要么不兼容要么很多老教程的写法在JDK17下跑不通。如果你的目标只是学习JavaEEJDK8仍然是目前最稳妥的选择。Tomcat版本最好别去追最新版跟着教程推荐版本走。MyBatis用了MySQL8的话数据库驱动类名就不再是com.mysql.jdbc.Driver而是com.mysql.cj.jdbc.Driver连接url里还要加serverTimezoneAsia/Shanghai否则会有时区报错。这些细节教程里不一定每版都会讲所以我强烈建议你每新装一套环境就在一个笔记文档里记下来JDK版本、Tomcat目录、Maven仓库路径、数据库端口、IDEA里Artifact配置。环境配置出了问题排查起来极其折磨人有笔记能救你一命。3.2 创建Maven工程与目录结构我用的方式是新建一个Maven项目GroupId填写项目的包名比如com.exampleArtifactId填写模块名打包方式选择war。这样idea会自动生成标准目录结构src/main/javaJava源码src/main/resources配置文件src/main/webappWeb资源JSP、CSS、JSpom.xmlMaven配置目录结构不标准会带来一堆问题比如配置文件放错位置导致Spring上下文找不到JSP放在非webapp目录导致页面访问不了。我第一次就是因为手动建了webapp目录却忘了把它标记为Web资源目录结果页面一直404。后来我学会在IDEA中右键webapp目录选择“Mark Directory As”里的Web Resource再配置好Web Facet问题才解决。3.3 pom.xml里要引入哪些依赖一个最基础的SSM项目pom里至少要包含以下依赖Spring核心依赖spring-context、spring-web、spring-webmvc。MyBatis与MyBatis-Spring整合包mybatis、mybatis-spring、mysql驱动。数据库连接池教程中常用Apache的commons-dbcp或者阿里巴巴的Druid我建议你跟着教程先跑通一种之后再换连接池。Servlet API、JSP API、JSTL用于编写Servlet、JSP页面和标签。JSON处理包jackson-databind用于Controller返回JSON数据。不要去记所有依赖的完整坐标可以直接用Maven仓库网站搜索。但是要知道每个依赖是干什么的。比如spring-webmvc包含了DispatcherServlet等Web相关的类如果不引入启动Tomcat时就会报ClassNotFoundException。这种依赖缺失的报错很常见排查时关键看异常信息里提示缺少哪个类再去搜索引擎查这个类属于哪个jar包。3.4 配置web.xml和Spring配置文件SSM有两个关键配置文件一个是web.xml部署描述符一个是SpringMVC配置文件通常叫spring-mvc.xml还有一个Spring配置通常叫applicationContext.xml。web.xml的核心是配置Spring的监听器、SpringMVC的前端控制器以及字符编码过滤器。我记得最头疼的是字符编码。如果我忘了在web.xml里加CharacterEncodingFilter那么POST提交中文到后端就会乱码。教程里一般会提供以下配置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 /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping这个过滤器必须配置在第一个而且要确保它拦截的是所有请求否则有些请求还是会乱码。另外数据库连接时url里也要加characterEncodingutf8JSP页面顶部要加% page contentTypetext/html;charsetUTF-8 %服务器层面IDEA的Tomcat运行配置里VM options也可以设置-Dfile.encodingUTF-8。好几层都对了中文才完全没问题这个坑我至少碰到过三次。3.5 编写实体类、Mapper和Service以一张最基础的用户表为例public class User { private Integer id; private String username; private String email; // getter/setter }MyBatis的Mapper是一个接口配合XML文件把方法名映射到SQL。比如public interface UserMapper { ListUser selectAll(); User selectById(Integer id); }对应的UserMapper.xmlmapper namespacecom.example.mapper.UserMapper select idselectAll resultTypecom.example.entity.User select * from user /select select idselectById parameterTypeint resultTypecom.example.entity.User select * from user where id #{id} /select /mapper这里最需要注意的是resultType和parameterType要写全类名SQL里的字段名要和实体类属性名对应如果不对应要么在SQL里起别名要么配置驼峰映射。我一开始总是查询出空对象但数据库里明明有数据后来才发现是实体类属性是userName数据库字段是user_name名称对不上。解决方案是在MyBatis配置里开启settings setting namemapUnderscoreToCamelCase valuetrue/ /settings这样下划线字段就能自动映射到驼峰属性了。Service层则是调用Mapper接口完成业务逻辑Controller层接收请求参数、调用Service、返回结果或视图。每一层职责必须清楚这是SSM项目的灵魂。3.6 运行与部署的点滴经验启动Tomcat后输入http://localhost:8080/项目上下文路径/路径。我记得自己总是忘记项目上下文路径一直访问主页404。IDEA里配置Artifact时必须注意“部署名称”一般默认是项目名。如果觉得名字太长可以在Deployment界面里把Application context改成/这样直接访问http://localhost:8080就行。运行时常见报错里我自己碰到最多的就是Tomcat日志里出现“Cannot resolve MVC view”或者“IllegalStateException: No WebApplicationContext found”。前者往往是没有配好视图解析器后者一般是spring-mvc.xml没被加载或者web.xml里的DispatcherServlet配置的init-param路径写错了。排查这种问题有一个笨但绝对有效的方法启动时看Tomcat的启动日志从第一行异常开始找不要只看最后一行。很多时候错误根因在中间部分被淹没只盯着最后一行根本看不出来。4. 常见问题与排查技巧实录跟着教程学习JavaEE的过程中几乎每个人都会在同一个地方跌倒。我把这些问题整理成了一张速查表每一条都来自我实际踩过的坑问题现象可能原因排查思路与解决办法IDEA里访问页面总是404部署的Artifact没配置好或上下文路径不对检查Run/Debug Configurations中的Deployment确认Artifact已添加并核对Application context路径。页面中文乱码多个环节编码不一致依次检查JSP页面编码、web.xml中CharacterEncodingFilter、数据库连接url是否带characterEncodingutf8、响应内容类型是否charsetUTF-8。启动Tomcat报端口被占用8080端口被其他进程占用用命令行查看端口占用并结束对应进程或修改Tomcat的server.xml里Connector端口。ClassNotFoundException: Spring相关类pom里缺少对应依赖或依赖没有下载检查pom.xml是否引入该依赖是否成功加载本地仓库尝试mvn clean compile刷新Maven。SQL语句执行报错结果是空Mapper的resultType映射不上检查实体类与数据库字段名是否一致返回类型是否写全限定名SQL是否真的正确。MyBatis绑定异常Mapper接口和XML文件没绑定检查Mapper接口的路径、XML里的namespace是否等于接口全类名mybatis配置里是否正确扫描Mapper包。请求404但Controller存在SpringMVC扫描包没扫到Controller在spring-mvc.xml里配置context:component-scan确保Controller所在包路径正确。排查这些问题我有一个心得不要瞎猜要学会看日志。Tomcat启动日志、IDEA控制台里的异常堆栈、Maven构建输出这些信息已经把你的问题答案提示得很具体了只是很多初学者一看到一大段英文异常就慌了。其实你只需要关注第一句“Caused by”相关信息或者搜索“Exception”后面紧挨着的英文关键字。把异常信息复制到搜索工具里搜索往往比你自己改半天配置更快。另外还有一个特别容易被忽略的问题数据库驱动版本和MySQL版本不匹配。如果你MySQL装的是8.x但驱动用的还是5.x启动时会报异常甚至可能能连上但查询时报兼容性问题。最简单的解决办法是去Maven仓库搜最新版本的mysql-connector-java或者在你的环境里保持教程推荐的版本组合。我后来专门记录过一个版本组合表比如“MySQL8 mysql-connector-java 8.0.33 JDK8 Tomcat9”这组搭配在我的项目里一直很稳。5. 学习JavaEE的几个真实建议最后分享一点我自己的体会不是鸡汤都是很实际的建议。第一看视频一定要跟着敲。狂神说Java系列的视频节奏不算慢有些地方讲得很快光靠看绝对留不下什么。我在看Servlet和SpringMVC的时候每看完一个知识点就会自己动手建一个最小的示例项目哪怕只是“get请求跳转到一个页面”这种最小案例。运行通了这个知识才算真正属于你。第二遇到报错不要立刻去求人。先自己读日志再搜索。我发现自己独立解决过的问题印象会特别深。比如MyBatis字段映射的问题第二次遇到时我几乎不用查就能定位。而那些靠别人远程操作解决的问题我大概率还会再错一次。第三教材和教程会过时但原理不会。跟着这套系列学到SpringBoot之后你会发现前面学的SSM那些手动配置过程渐渐被自动配置取代了。但这不代表前面的学习白费。恰恰相反只有理解了Servlet如何被映射、Spring容器如何创建Bean你才能真正看懂SpringBoot的自动配置注解。不要嫌JavaWeb阶段的东西过时那是JavaEE的底层骨架。第四学完一个阶段要用自己的话写一篇笔记。这不是让你写什么漂亮文章而是强迫自己去输出。我学完SSM整合后写过一篇特别粗糙的中文笔记过了三个月回头看发现很多当时以为自己懂了的细节其实理解有偏差。这种“模糊感”靠看视频是发现不了的只有写出来或者讲给别人听才能暴露出来。JavaEE这条路对新手来说确实比较长知识点之间环环相扣学起来很磨人。但只要你按着路线走每一步都动手实践大概率会在两个月内打通从Servlet到SpringBoot的主干。到那时候再回头看最初的Web工程结构你会清晰看到自己走了多远。我到现在依然保留着最初那个乱糟糟的SSM练习项目偶尔翻一翻还能找出一些当时不懂的地方。这也是一个不错的检验方式如果你觉得以前的代码烂透了说明你确实进步了。