很久很久以前,在学JavaEE的时候,开发工具用的是Eclipse。后来我做了Android开发,当前IntelliJ是JavaEE开发的主流工具,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)。
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 8之后就是Jakarta EE 9,Java EE从此改名Jakarta EE。Java EE的前一个名称为J2EE。
使用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-servlet即Servlet的路径,相比以前确实简单多了,如部署的目录为ServletTest_war_exploded,则HelloServlet的访问链接为:http://localhost:8080/ServletTest_war_exploded/hello-servlet
如果想要修改部署目录,可以点击下图中的 “编辑配置…”:
如上图,显示了项目的主页URL,默认的部署目录就是项目名称加上 “_war_exploded”,无须修改这个URL,点击 “部署” 选项卡,如下:
修改这里的 “应用程序上下文”,比如改成如下:
此时再切换回 “服务器” 选项卡,会发现 “URL”自动更新,如下:
这里修改了部署目录,所以需要重新部署以查看效果。
如上图,还有一个很有用的设置: “切换出IDE时”,我们设置为 “更新类和资源”,如下:
这样,当我们运行项目后,在浏览器查看效果,然后回到IDE修改了Java类或者修改了相关资源文件后,再打开浏览器(此时就切出了IDE),刷新之前的页面即可查看修改后的效果,无需在IDE中手动更新。
官网版本有一个链接告诉我们如何选择版本: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.0和Servlet 5.0。
基于上图的说明,我选择使用Tomcat 10.0.20版本,这是当前(2022年4月19日)的最新正式版本。