IDEA创建JavaWeb项目并配置Tomcat从零到跑通Servlet
2026/9/18 11:19:36 网站建设 项目流程

先说结论: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.servlet
IDEA2022~2024任意版本旗舰版社区版也够用,后面我会说明区别
MavenMaven 3.6~3.9用Maven方便拉Servlet依赖和打war包

Tomcat版本对应关系我列个表,免得你下载时选错。Tomcat 8.5对应Servlet 3.1,Tomcat 9对应Servlet 4.0,Tomcat 10对应Servlet 5.0,Tomcat 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就在这里
  • conf:server.xml配端口,web.xml配全局Servlet映射
  • lib:Servlet 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> <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>

注意scopeprovided,意思是这个依赖在编译时需要、但部署到Tomcat时不需要打包进去,因为Tomcat自带Servlet API。如果你写成compile,最后war包里会把servlet-api.jar也带上,运行时会跟Tomcat自带的冲突,轻则报警告,重则类加载异常。

接着补上war打包方式:

<packaging>war</packaging>

再补一个构建插件,确保后面能正确打包:

<build> <finalName>javaweb-demo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>

2.3 项目结构到底长什么样

配置完成后,项目结构应该是这样的:

javaweb-demo/ ├── pom.xml └── src/main/ ├── java/ // 源码根目录 ├── resources/ // 配置文件根目录 └── webapp/ // Web根目录 ├── WEB-INF/ │ └── web.xml └── index.jsp

java目录是写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而不是JDK,Tomcat可能起不来或报找不到类。一般在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,然后新建类HelloServlet

package 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;charset=UTF-8"); resp.getWriter().write("<h1>JavaWeb 项目跑通了</h1>"); } }

这里的@WebServlet("/hello")是Servlet 3.0之后引入的注解方式,Tomcat 9支持得很好。如果你使用的是老项目或者想在web.xml里配置映射,也可以:

<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</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.encoding=UTF-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 port="8080" protocol="HTTP/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但没配Deployment,Tomcat能启动,但不会加载你的项目,访问/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报500

500错误说明Servlet执行过程中抛了异常。在IDEA控制台里通常能看到堆栈信息,常见的有这些:

  • ClassNotFoundException:Servlet类没有被加载到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,也都是基于这套基本认知往上叠框架而已。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询