您当前的位置:首页 > 计算机 > 软件应用 > 开发(IDE)

IntelliJ IDEA Tomcat Servlet 4.0 404

时间:02-09来源:作者:点击数:

前言

很久很久以前,在学JavaEE的时候,开发工具用的是Eclipse。后来我做了Android开发,当前IntelliJJavaEE开发的主流工具,Eclipse早已经没落,公司的JavaEE开发人员也早已不用Servlet,都是用Spring Boot,所以我没办法向他们请教在IntelliJ上开发Servlet项目的相关问题,只能靠自己了。我想用IntelliJ创建Servlet项目,毕竟Servlet是基础,Spring Boot只不过是封装,所以我想在IntelliJ上学习Servlet,在最新版本的IntelliJ上,创建一个Servlet项目还是很方便的,因为有对应的模板,这个模板会创建出一个index.jsp和一个HelloServlet.java,把index.jsp运行起来,这个可以正常显示没问题,但是点击页面中的Servlet进行跳转时报404,非常之恶心,怎么也找不到原因,花了挺多时间的,看了创建模板选的是Java EE 8,对应使用的是Servlet 4.0.1,后来百度Servlet 4.0,有说到这个版本支持https,我以为是要把Tomcat配置为https,于是配置好了https,结果还是报404,Google上也找不到答案,搜索IntelliJ创建Servlet,文章很少,找不到答案,后来还是在IntelliJ官方网站找到了答案,IntelliJ官方视频链接:Creating Your First Jakarta EE Application with IntelliJ IDEA Ultimate(官网也有一个对应的文章),这个视频演示了创建Servlet项目并运行的完整过程,视频中用的服务器是GlassFish,于是我又把Tomcat服务器换成了GlassFish服务器,结果问题依旧,又仔细看了一遍视频,发现它用的JDK版本是1.8,于是我把JDK11换成JDK1.8,问题依旧,又再看一遍视频,发现视频中选的是Jakarta EE 9,对应Servlet 5.0.0,于是问题得到解决!

总结:与Tomcat服务器无关,与https无关,与jdk版本无关,一切问题出在选择的JavaEE版本上,一定要选择Jakarta EE 9,对应Servlet 5.0.0(千万不要选择Java EE 8,对应Servlet 4.0.1)。

IntelliJ创建Servlet项目步骤

  1. 开发环境
    -IntelliJ IDEA 2022.1(Ultimate Edition)(当前最新版本)
    -jdk-11.0.12
    -apache-tomcat-10.0.20-windows-x64(当前最新版本),Tomcat安装可查看这篇文章
  2. 打开IntelliJ IDEA,如下:
    在这里插入图片描述
    选择 “新建项目” ,在“新建项目” 界面中选择 “Java Enterprise” 生成器来创建项目,对应的设置如下:
    在这里插入图片描述
    注:“应用程序服务器” 默认是没有的,可以点击 “新建” 按钮,并选择 “Tomcat服务器”,如下:
    在这里插入图片描述
    在出现的 “Tomcat服务器” 配置对话框中输入Tocmat的安装路径即可,如下 :
    在这里插入图片描述
    输入安装路径后,IntelliJ会自动检测出此Tomcat的对应版本,如上图,显示Tomcat版本为10.0.20
    在这里插入图片描述
    如上图,红圈是关键设置,其它的可自行修改,设置好之后,点击 “下一步”,出现选择 “版本”、“依赖项”的界面,设置如下:
    在这里插入图片描述
    如上图,一定要选择Jakarta EE 9(默认是Java EE 8),它对应支持的Servlet5.0.0版本,这个会自动勾选上的,最后点击 “创建” 按钮即可。生成的项目如下:
    在这里插入图片描述
    项目中的index.jspHelloServlet.java如下
    在这里插入图片描述
    点击右上角的运行按钮,如下:
    在这里插入图片描述
    此时在IntellIj的底部会显示Tomcat的启动信息,以及项目的部署信息,如下:
    在这里插入图片描述
    完整信息如下:
D:\apache-tomcat-10.0.20\bin\catalina.bat run
[2022-04-19 04:32:52,746] 工件 ServletTest:war exploded: 正在等待服务器连接以启动工件部署…
Using CATALINA_BASE:   "C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da"
Using CATALINA_HOME:   "D:\apache-tomcat-10.0.20"
Using CATALINA_TMPDIR: "D:\apache-tomcat-10.0.20\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk-11.0.12"
Using CLASSPATH:       "D:\apache-tomcat-10.0.20\bin\bootstrap.jar;D:\apache-tomcat-10.0.20\bin\tomcat-juli.jar"
Using CATALINA_OPTS:   ""
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
19-Apr-2022 16:32:54.113 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/10.0.20
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建:        Mar 31 2022 14:24:36 UTC
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号:      10.0.20.0
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称:      Windows 10
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本:           10.0
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构:              amd64
19-Apr-2022 16:32:54.117 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量:     C:\Program Files\Java\jdk-11.0.12
19-Apr-2022 16:32:54.118 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本:    11.0.12+8-LTS-237
19-Apr-2022 16:32:54.118 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商:        Oracle Corporation
19-Apr-2022 16:32:54.118 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:     C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da
19-Apr-2022 16:32:54.118 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:     D:\apache-tomcat-10.0.20
19-Apr-2022 16:32:54.119 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       --add-opens=java.base/java.lang=ALL-UNNAMED
19-Apr-2022 16:32:54.119 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       --add-opens=java.base/java.io=ALL-UNNAMED
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       --add-opens=java.base/java.util=ALL-UNNAMED
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djava.util.logging.config.file=C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da\conf\logging.properties
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcom.sun.management.jmxremote=
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcom.sun.management.jmxremote.port=1099
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcom.sun.management.jmxremote.ssl=false
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcom.sun.management.jmxremote.password.file=C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da\jmxremote.password
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcom.sun.management.jmxremote.access.file=C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da\jmxremote.access
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djava.rmi.server.hostname=127.0.0.1
19-Apr-2022 16:32:54.120 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djdk.tls.ephemeralDHKeySize=2048
19-Apr-2022 16:32:54.121 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
19-Apr-2022 16:32:54.121 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dignore.endorsed.dirs=
19-Apr-2022 16:32:54.121 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcatalina.base=C:\Users\Even\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\d475f7d5-b37c-4ef5-9de2-7a5a2497d0da
19-Apr-2022 16:32:54.121 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Dcatalina.home=D:\apache-tomcat-10.0.20
19-Apr-2022 16:32:54.121 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:       -Djava.io.tmpdir=D:\apache-tomcat-10.0.20\temp
19-Apr-2022 16:32:54.124 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.0]加载了基于APR的Apache Tomcat本机库[1.2.32]。
19-Apr-2022 16:32:54.124 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。
19-Apr-2022 16:32:54.129 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 1.1.1n  15 Mar 2022]
19-Apr-2022 16:32:54.344 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"]
19-Apr-2022 16:32:54.374 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[545]毫秒内初始化
19-Apr-2022 16:32:54.486 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina]
19-Apr-2022 16:32:54.487 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/10.0.20]
19-Apr-2022 16:32:54.500 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
19-Apr-2022 16:32:54.522 信息 [main] org.apache.catalina.startup.Catalina.start [146]毫秒后服务器启动
已连接到服务器
[2022-04-19 04:32:54,998] 工件 ServletTest:war exploded: 正在部署工件,请稍候…
19-Apr-2022 16:32:55.802 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 使用[SHA1PRNG]创建会话ID生成的SecureRandom实例花费了[350]毫秒。
[2022-04-19 04:32:55,833] 工件 ServletTest:war exploded: 工件已成功部署
[2022-04-19 04:32:55,833] 工件 ServletTest:war exploded: 部署已花费 836 毫秒
19-Apr-2022 16:33:04.540 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-10.0.20\webapps\manager]
19-Apr-2022 16:33:04.599 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-10.0.20\webapps\manager]的部署已在[58]毫秒内完成

项目部署后,会使用默认浏览器打开index.jsp,如下:

在这里插入图片描述

点击index.jsp页面中的Hello Servlet链接将会打开对应的Servlet,效果如下:

在这里插入图片描述

其它

从此再无Java EE

据说从Java EE 8之后就是Jakarta EE 9Java EE从此改名Jakarta EEJava EE的前一个名称为J2EE

  • J2EE:Java 2 Platform Enterprise Edition,Java 2表示JDK 1.2,后面JDK升级这个Java 2就有点限制了。
  • Java EE:Java Platform, Enterprise Edition
  • Jakarta EE 为什么要再改一次名称?可查看此文章

Servlett路径配置以及部署路径修改

使用IntelliJ创建的Servlet项目中,自动生成的web.xml已经看不到对应的Servlet设置了,如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
</web-app>

Servlet 4.0开始,可以在Servlet类上面使用注解来设置路径,如下:

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
	。。。
}

这里的/hello-servletServlet的路径,相比以前确实简单多了,如部署的目录为ServletTest_war_exploded,则HelloServlet的访问链接为:http://localhost:8080/ServletTest_war_exploded/hello-servlet

如果想要修改部署目录,可以点击下图中的 “编辑配置…”:

在这里插入图片描述
在这里插入图片描述

如上图,显示了项目的主页URL,默认的部署目录就是项目名称加上 “_war_exploded”,无须修改这个URL,点击 “部署” 选项卡,如下:

在这里插入图片描述

修改这里的 “应用程序上下文”,比如改成如下:

在这里插入图片描述

此时再切换回 “服务器” 选项卡,会发现 “URL”自动更新,如下:

在这里插入图片描述

这里修改了部署目录,所以需要重新部署以查看效果。

在这里插入图片描述

自动更新类和资源

在这里插入图片描述

如上图,还有一个很有用的设置: “切换出IDE时”,我们设置为 “更新类和资源”,如下:

在这里插入图片描述

这样,当我们运行项目后,在浏览器查看效果,然后回到IDE修改了Java类或者修改了相关资源文件后,再打开浏览器(此时就切出了IDE),刷新之前的页面即可查看修改后的效果,无需在IDE中手动更新。

Tomcat版本的选择

官网版本有一个链接告诉我们如何选择版本:https://tomcat.apache.org/whichversion.html,主要看一张图片即可,如下:

在这里插入图片描述

如上图,要想使用Servlet 5.0,则必须使用Tomcat 10.0.x版本,当前最新是10.0.20,此Tomcat要求使用的jdk版本为 jdk 8或者更新的版本,由于目前 jdk 11已经很广泛了,所以在项目中我使用了jdk 11。要想使用Servlet 6.0,则必须使用Tomcat 10.1.x,当前最新是10.1.0-M14(alpha)版本,它要求的jdk最低版本是 jdk11,可以看到,它还不是正式版本,所以我没有下载这个版本的Tocmat,而且当前IntelliJ的最新版本创建模板中也没有支持Servlet 6.0,只支持Servlet 4.0Servlet 5.0

基于上图的说明,我选择使用Tomcat 10.0.20版本,这是当前(2022年4月19日)的最新正式版本。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门