尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IDEA创建JavaWeb项目并配置Tomcat从零到跑通Servlet

IDEA创建JavaWeb项目并配置Tomcat从零到跑通Servlet 先说结论IDEA里创建JavaWeb项目并配置Tomcat这件事本身不难但版本一多、配置选项一杂就会让新手觉得到处是坑。尤其是Tomcat从启动到能正常访问Servlet中间踩过的坑几乎都是同一类——没搞懂IDEA帮你做了什么、Tomcat需要什么。这篇内容适合刚学JavaWeb的在校学生也适合从Eclipse转IDEA的开发者或者那些打算把过去用MyEclipse写的项目迁到IDEA上的老手。我会按实际操作的顺序来写每一步都说明为什么这样做做完是什么效果出现问题怎么排查。配置好之后你会得到一个能在浏览器里跑通Servlet的完整项目这个过程我会全部拆开给你看。1. 动手之前先把这套环境选型和装好很多教程一上来就叫你装IDEA、装Tomcat装完发现版本不匹配又折腾半天。我建议先在纸上把版本组合定下来后面所有问题都会少一半。1.1 JDK、IDEA、Tomcat版本怎么选先说结论我目前日常用的组合是JDK 8 IDEA 2023.x旗舰版 Tomcat 9.0.x Maven 3.9.x这个是绝大多数JavaWeb教学案例和网上老项目能直接跑起来的配置。如果你想用新版玩JDK 17 Tomcat 10.1.x Jakarta EE也完全可以但注意Tomcat 10之后包名从javax.servlet改成了jakarta.servlet写代码时千万别混。组件我的推荐说明JDKJDK 8 或 JDK 11兼容性最好几乎所有教学项目都能编译TomcatTomcat 9.0.x对应Servlet 4.0包名是javax.servletIDEA2022~2024任意版本旗舰版社区版也够用后面我会说明区别MavenMaven 3.6~3.9用Maven方便拉Servlet依赖和打war包Tomcat版本对应关系我列个表免得你下载时选错。Tomcat 8.5对应Servlet 3.1Tomcat 9对应Servlet 4.0Tomcat 10对应Servlet 5.0Tomcat 10.1对应Servlet 6.0。项目要部署到哪个服务器就用哪个版本的Servlet API去编译不然会出现NoClassDefFoundError这类问题。1.2 Tomcat下载安装的几个细节去Tomcat官网下载页的时候别下Windows Service Installer我建议直接下载64-bit Windows zip这个压缩包版本。原因很简单安装版会注册系统服务启动方式跟IDEA里调试时的启动方式不一致反而容易出问题。压缩包解压后放到一个不含空格和中文的路径下比如D:\apache-tomcat-9.0.89这就够了。解压后的目录结构要心里有数bin启动和关闭脚本startup.bat、shutdown.bat就在这里confserver.xml配端口web.xml配全局Servlet映射libServlet API、JSP API等jar包都在这里IDEA集成时就是依赖这些库webapps把war包丢进去能热部署但我们在IDEA里通常不走这个目录logs查看启动日志和报错信息你不需要手动去启动Tomcat后面IDEA会接管启动流程。但第一次装完建议手动双击bin\startup.bat试试如果能正常看到Server startup in [xxx] milliseconds说明环境没问题。启动后浏览器访问http://localhost:8080/能看到Tomcat首页就算成功。提示如果双击startup.bat后窗口一闪而过多半是环境变量JAVA_HOME没配置。注意Tomcat启动时找的是JAVA_HOME不是JRE_HOME而且它要的是JDK的根目录不是bin目录。1.3 关于IDEA社区版和旗舰版的差别IDEA有两个版本很多新手装了社区版后发现右键没有“Add Framework Support”这个选项也找不到Tomcat的配置入口就开始怀疑自己装错了。其实没装错只是社区版默认不带JavaEE和Web开发支持。我测试过的结果是社区版也能做JavaWeb开发只是需要手动配置。你可以用Maven骨架创建项目然后自己加Servlet依赖Tomcat的集成入口虽然被隐藏了但通过Edit Configurations里的Tomcat Server选项还是能配出来的只是麻烦一点。如果你不想折腾直接装旗舰版网上有试用期拿来学习完全够用。如果你是学生用学校邮箱申请免费授权这是最正规的方式。2. 创建JavaWeb项目我推荐用Maven创建JavaWeb项目有两种主流方式一种是IDEA自带的“Java Enterprise”模板直接生成web项目另一种是用Maven项目手工补全web结构。我推荐后者因为前者依赖IDEA版本的界面隐藏了一些细节出了问题你不知道去哪排查。用Maven的好处是依赖管理明确、打包方便、目录结构是业界标准你以后学Spring Boot会无缝衔接。2.1 创建Maven Web骨架项目打开IDEA选择New Project左侧选Maven勾选Create from archetype然后从列表里找到maven-archetype-webapp。这个骨架会直接生成一个包含src/main/webapp/WEB-INF/web.xml的标准JavaWeb目录。如果没有这个骨架选项也可以用最普通的Maven空项目创建然后自己手动创建一个src/main/java目录并把目录标记为Sources Root再创建src/main/webapp手动补web.xml。这两种方法殊途同归我反而觉得后者更能帮你理解web项目的结构。2.2 用普通Maven项目加Servlet依赖先创建普通Maven项目不勾选任何骨架。建好之后在pom.xml里加Servlet依赖dependencies dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency /dependencies注意scope是provided意思是这个依赖在编译时需要、但部署到Tomcat时不需要打包进去因为Tomcat自带Servlet API。如果你写成compile最后war包里会把servlet-api.jar也带上运行时会跟Tomcat自带的冲突轻则报警告重则类加载异常。接着补上war打包方式packagingwar/packaging再补一个构建插件确保后面能正确打包build finalNamejavaweb-demo/finalName plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target encodingUTF-8/encoding /configuration /plugin /plugins /build2.3 项目结构到底长什么样配置完成后项目结构应该是这样的javaweb-demo/ ├── pom.xml └── src/main/ ├── java/ // 源码根目录 ├── resources/ // 配置文件根目录 └── webapp/ // Web根目录 ├── WEB-INF/ │ └── web.xml └── index.jspjava目录是写Servlet类的地方webapp目录是放JSP、HTML、静态资源的地方WEB-INF下的web.xml是部署描述符。如果你创建的骨架没有生成index.jsp就自己补一个后面启动后能用它验证项目是否跑通。3. 在IDEA里配置Tomcat核心就这几步Tomcat配不好项目跑不起来这是JavaWeb新手最大的坎。我要把每一步讲透。3.1 打开Run Configurations添加Tomcat Server点右上角的Add Configuration...在弹出的窗口左上角点号往下翻找到Tomcat Server选择Local。如果你是社区版这边可能没有Tomcat Server这个选项这时可以回车直接搜索“Tomcat”装了Smart Tomcat插件的话会看到一个Smart Tomcat入口用那个也能启动原理是一样的。选完之后来到Server选项卡点Configure...在弹出的窗口里选择你本地Tomcat的解压目录IDEA会自动识别出Tomcat版本。这里有个小技巧IDEA识别Tomcat时要求目录下有conf\catalina.properties这个文件如果你下载的是精简版可能会提示不是有效的Tomcat目录。3.2 Deployment选项卡才是重头戏很多教程在这里一笔带过但实际上Deployment选项卡才是配置的重点它决定了IDEA要部署什么内容到Tomcat上、用哪个路径去访问。点击Deployment选项卡下的号如果IDEA识别到你的项目是web项目会直接出现Artifact选项。选择javaweb-demo:war exploded这个带exploded后缀的这是“爆炸式部署”意思是不打war包直接用解压后的目录让Tomcat加载好处是改完代码后能热更新不用反复重启。选好后下面会出现一行配置Application context: /javaweb-demo_war_exploded这个值就是你在浏览器里访问项目的根路径。我强烈建议改成/这样直接访问http://localhost:8080/就能进项目首页。不改的话你得访问http://localhost:8080/javaweb-demo_war_exploded/又长又绕。Application context的选择在多人开发、前后端联调时也有影响一般后端接口前缀会跟这个路径保持一致。前期学习阶段直接设成/省心。3.3 Server选项卡的几个关键参数再回到Server选项卡这里有几个关键参数URL启动后自动打开浏览器访问的地址IDEA会根据你的Application context自动生成HTTP port默认8080如果被占用可以改成8081、8082等JMX port用于JVM监控如果启动报端口冲突把它改一下On frame deactivation建议选Update classes and resources这样IDEA失焦时会自动把改过的类或资源同步到Tomcat省去手动重启Before launch建议把Build勾上同时可以把Build Artifacts也加上确保启动前编译最新代码注意IDEA配置Tomcat时“On frame deactivation”只能做到资源热更新Java代码修改后还是需要手动点击Update按钮才能生效这点跟JRebel这类热加载插件的效果不同。3.4 启动前先检查这几个地方配置完成后别急着点启动先检查三处第一File - Project Structure - Modules里确认src/main/java被标记为Sourcessrc/main/webapp被标记为Web Resources Directory。如果webapp没有被标记IDEA会认为你的项目不是web项目部署时Artifact会缺失。第二在Artifacts选项卡里确认Artifact的类型是Web Application: Exploded且Output Layout里能看到src/main/webapp的内容被带出来。如果缺了会出现在Tomcat上访问不到JSP页面或静态资源的问题。第三确认环境变量没问题。IDEA集成Tomcat时它会自己计算JAVA_HOME但如果你IDE启动用的是JRE而不是JDKTomcat可能起不来或报找不到类。一般在IDEA的Project Structure里把Project SDK选对JDK版本这个问题就不存在。配置完毕点右上角的绿色三角形按钮启动IDEA会调起Tomcat控制台里看到类似下面的输出就算成功Using CATALINA_BASE: ...\Tomcat\... 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in [1234] milliseconds启动成功后IDEA会自动打开浏览器访问URL地址看到Tomcat默认首页或者你的index.jsp页面就说明IDEA里创建JavaWeb项目、配置Tomcat这套流程已经跑通了。4. 写一个Servlet把整个请求链路跑通很多教程到Tomcat启动成功就结束了但项目里跑不起来Servlet的还大有人在。这里我写一个最简单的Servlet让你验证整个链路。4.1 创建Servlet类在src/main/java下创建一个包com.example然后新建类HelloServletpackage com.example; 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.IOException; WebServlet(/hello) public class HelloServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/html;charsetUTF-8); resp.getWriter().write(h1JavaWeb 项目跑通了/h1); } }这里的WebServlet(/hello)是Servlet 3.0之后引入的注解方式Tomcat 9支持得很好。如果你使用的是老项目或者想在web.xml里配置映射也可以servlet servlet-namehello/servlet-name servlet-classcom.example.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping两种方式选一种就行注解方式代码更紧凑web.xml方式更直观地反映了Servlet映射逻辑。我建议新手至少在web.xml里写一次能更清楚理解URL到类之间的映射关系。4.2 编译、启动、访问写好Servlet类后点击右上角的Update按钮或者直接启动然后浏览器访问http://localhost:8080/hello。能正常看到“JavaWeb 项目跑通了”这行字就说明JDK编译没问题Tomcat能加载你的项目Servlet注解被扫描到了请求映射生效了整个JavaWeb最基本的请求链路浏览器 - Tomcat - Servlet - 浏览器就串起来了。顺手做一个排查速查表命中你问题的那一行可以直接按方案处理现象可能原因处理方式访问/hello返回404Servlet类没有被编译到classes目录检查Module里java目录是否标记为Sources重新Build访问/hello返回405你请求的是POST但只实现了doGet添加doPost方法或改用GET请求启动时控制台有Servlet API报错pom里依赖版本跟Tomcat不匹配检查javax.servlet包名和Tomcat版本对应关系页面出来但中文乱码请求和响应编码不一致设置resp.setCharacterEncoding(UTF-8)页面meta标签也统一UTF-8想过没为什么IDEA的Project Structure里要确认java目录是Sources Root因为Tomcat部署时加载的是WEB-INF/classes下的.class文件而IDEA就是根据mark directory的类型来决定要不要把.java文件编译输出到那个位置的。这一步没做对Servlet类相当于根本不存在。5. 部署、启动与常见报错排查手册我整理了自己和身边朋友在实际配置过程中踩过的坑按频率排序给出解决方案。5.1 控制台中文乱码IDEA控制台里出现中文乱码或者Tomcat日志输出乱码很常见。这不是代码问题是字符编码问题。原因有三种Tomcat日志编码、IDEA控制台编码、项目编码。先统一设置IDEA全局编码打开Settings - Editor - File Encodings把Global Encoding和Project Encoding都设为UTF-8。再打开Help - Edit Custom VM Options在文件末尾加上-Dfile.encodingUTF-8如果还是有乱码打开Tomcat的conf\logging.properties把java.util.logging.ConsoleHandler.encoding从默认值改成UTF-8。我试过改完后控制台就清爽了。5.2 端口被占用Tomcat起不来启动时提示Port 8080 was already in use说明8080端口被别的进程占了。在Windows命令行执行netstat -ano | findstr 8080查到这个进程的PID后到任务管理器里找到对应进程结束它。或者直接改Tomcat端口打开conf/server.xml找到Connector port8080 protocolHTTP/1.1 ... /改成8081或任意可用端口。要注意的是server.xml里改了端口IDEA的Server选项卡里的HTTP port也要改成一样否则IDEA启动Tomcat时会用它的配置覆盖server.xml两边不一致会有诡异行为。5.3 启动成功但访问项目页面404最常见的情况Tomcat启动成功能看到Tomcat默认首页但访问你的项目路径就是404。排查思路分两个方向第一个方向是Deployment没配好。确认Deployment里勾选了Artifact不是只在Server选项卡加了Tomcat。配了Tomcat但没配DeploymentTomcat能启动但不会加载你的项目访问/hello当然404。第二个方向是Application context不对。在Deployment列表下方你要确认Application context值和项目实际路径一致。前面说过直接设成/最简单。如果两个方向都没问题就看Tomcat的webapps下有没有残留你以前丢进去的war包或者IDEA的编译输出目录target里有没有生成对应的Exploded目录。很多时候IDEA更新了但target目录没刷新手动点击Build - Rebuild Project一次就能解决。5.4 IDEA社区版没有Tomcat配置入口前面提到过社区版不直接带Tomcat Server选项。两个替代方案方案一安装插件Smart Tomcat在Settings - Plugins里搜索安装然后在Edit Configurations里能找到Smart Tomcat这个新类型。配置里填写Tomcat目录、Context Path、Deployment目录一般指向src/main/webapp启动后效果跟旗舰版差不多。方案二不用集成方式直接在命令行启动Tomcat把war包拷到webapps目录下。这种方式很原始但能让你更理解Tomcat的构造。我遇到过有些同学用这种方式反而学得更扎实因为你能看到文件如何被放到容器里又不依赖IDE的帮助。5.5 Tomcat能启动但访问Servlet报500500错误说明Servlet执行过程中抛了异常。在IDEA控制台里通常能看到堆栈信息常见的有这些ClassNotFoundExceptionServlet类没有被加载到WEB-INF/classes。检查编译输出路径或者看IDEA的Project Structure - Artifacts - Output Layout里有没有把编译后的class打进去NoClassDefFoundError通常是某个依赖jar不存在。检查Maven依赖是否成功下载是否设置成provided被排除了NullPointerException看看是不是在init方法里读取了不存在的配置或者session取值为空。这类问题只能用断点调试来定位调试Servlet的时候我强烈建议在IDEA里打断点然后用Debug模式启动Tomcat。因为Tomcat的线程栈比较复杂新手看控制台堆栈容易懵但打断点定位到问题代码行后会清晰很多。5.6 修改代码不生效改完还是返回旧内容这是IDEA的热更新机制导致的。你改了Java代码但Tomcat里跑的还是旧的class。解决方式执行一次Build - Rebuild Project或者点击IDEA里Tomcat运行窗口左下角的Update按钮选择Update classes and resources还不行就把Tomcat停掉重新启动别以为重启Tomcat麻烦我在开发中其实更倾向改动大后直接重启稳定。热更新的姿势不对很可能出现修改不生效、方法签名变了但类没重载这类玄学问题。6. 整个流程再走一遍以及一个偷懒技巧如果你按前面的步骤走应该已经有一条绿色的启动按钮了。在你新建第二个JavaWeb项目时不用重复所有这些步骤可以把当前运行的Tomcat配置保存下来作为模板。IDEA里Run/Debug Configurations窗口右上角有个文件夹图标点击可以配置默认值或保存模板把Tomcat配置导出后下次新建项目直接复用。另外一个小技巧如果不介意把项目打成war包直接在命令行用mvn package把生成的war丢到Tomcat的webapps目录然后启动Tomcat它会被自动解压部署。这种方式在IDEA集成失效或者远程服务器部署时非常有用值得每个JavaWeb学习者掌握。我个人在实际配置过程中的体会是IDEA配置Tomcat最核心的点在于理解Deployment是“把什么东西部署到容器”而不仅仅是“选一个Tomcat路径”。一旦想通这个关系所有跟你绕来绕去的报错都会变得有迹可循。等你真正理解了Tomcat是怎么从URL请求映射到Servlet、Servlet怎么处理请求并返回响应再回头看IDEA里的这些配置就会觉得每一步都是顺理成章的后面的Spring MVC、Spring Boot也都是基于这套基本认知往上叠框架而已。
返回列表