赞
踩
很久很久以前,在学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
)。
IntelliJ IDEA 2022.1(Ultimate Edition)
(今天,也就是2022年4月19日的最新版本)jdk-11.0.12
apache-tomcat-10.0.20-windows-x64
(今天,也就是2022年4月19日的最新版本),Tomcat安装可查看我的这篇文章。IntelliJ IDEA
,如下:Java Enterprise
” 生成器来创建项目,对应的设置如下:Tocmat
的安装路径即可,如下 :IntelliJ
会自动检测出此Tomcat
的对应版本,如上图,显示Tomcat
版本为10.0.20
。Jakarta EE 9
(默认是 Java EE 8
),它对应支持的 Servlet
是 5.0.0
版本,这个会自动勾选上的,最后点击 “创建” 按钮即可。生成的项目如下:index.jsp
和 HelloServlet.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 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日)的最新正式版本。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。