Tomcat 下构建 Web 应用时,常犯的一些通用错误
笔者报错时的运行环境:
JDK 13.0.2
Maven 3.6.3
Tomcat 9.0.41(Servlet 4.0,JSP 2.3)
IntelliJ IDEA 2020.1.2 (Ultimate Edition)
重新开始在 Tomcat 下部署 Web 应用,很容易遇到各种问题。笔者也经常被这些没有技术含量的问题困扰,有时甚至浪费几个小时的时间才得到解决。为了防止自己以后再犯,同时也为了减少其它人的工作量,本文列出了构建 Web 应用时,常犯的一些通用错误以及它们可以引发的问题。
(通用错误指的是,虽然对于不同的项目,浏览器的报错各不相同,但是它们可能是同一类错误导致的。)
这些错误可以引发的问题
Tomcat下useBean类属性[…]的值无效
getInitParameter返回null
源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
常犯的通用错误
-
运行 Web 应用应该使用的 URL 路径为:
Web 应用的基路径
/Web 应用名
/Web 应用相对路径
其中:
-
Web 应用的基路径
:指在 Tomcat 中设置的路径。 -
Web 应用名
:默认为文件夹WEB-INF
的上一级文件夹的文件夹名,但有时也可以选择在服务器中设置。 -
Web 应用相对路径
:指在 Web 程序中指定的相对路径。如果没有在程序中指定,则默认为打开某文件的路径,即 Web 应用文件夹下的某文件的路径。
例如:如果通过将 Web 应用放置到本地 Tomcat 安装目录下的文件夹 webapps 中来部署,且 Tomcat 中设置的端口号为 8080,文件夹 webapps 下有一个文件夹 myweb,而文件夹 myweb 中有一个文件
demo.jsp
。那么,使用本地浏览器访问文件demo.jsp
的 URL 路径如下:-
Web 应用的基路径
:localhost:8080 -
Web 应用名
:myweb -
Web 应用相对路径
:demo.jsp -
完整 URL
:http://localhost:8080/myweb/demo.jsp
-
-
文件夹 WEB-INF 的位置:必须为 Web 应用的目录(文件夹)的下一级目录(文件夹)(注意:是下一级,不是下 N 级)。
-
部署方式为 Tomcat 安装目录下的文件夹 webapps:
如果通过将 Web 应用放置到 Tomcat 安装目录下的文件夹 webapps 中来部署,且 Web 应用的名称为 myweb,那么,文件夹 myweb 需要放到 webapps 中,而文件夹
WEB-INF
需要放到 myweb 中。如果把文件夹WEB-INF
放到文件夹 myweb 中更深层次的文件夹,这将导致文件夹WEB-INF
不被识别。(即 Tomcat 下的 webapps 里放 myweb,myweb 里放WEB-INF
。)注意:只有使用这种方式可以同时在一个文件夹下部署多个 Web 应用。使用本文提到的其它方式就只能在一个文件夹下部署一个 Web 应用,因此该文件夹内需直接放置该 Web 应用的相关文件(如文件夹
WEB-INF
)。
-
部署方式为 Tomcat 安装目录下的文件夹 conf 内的 XML 配置文件:
如果 Web 应用是通过在路径
Tomcat 的安装路径\conf\Catalina\localhost\Web 应用名.xml
中的 XML 文件中配置路径部署的,那么请注意,此 XML 文件指定的路径是 Web 应用的路径,不是 Web 应用的路径的上一级文件夹的路径。- 比方说,如果上述 XML 文件命名为 router.xml ,且在该 XML 文件中指定的路径是 <Context docBase=“D:\Tomcat\myweb” debug=…/> 。那么, Web 应用名是 router(不是 myweb ),且文件夹
WEB-INF
需要放到文件夹 myweb 中。如果把文件夹WEB-INF
放到文件夹 myweb 中更深层次的文件夹,这将导致文件夹WEB-INF
不被识别。
- 比方说,如果上述 XML 文件命名为 router.xml ,且在该 XML 文件中指定的路径是 <Context docBase=“D:\Tomcat\myweb” debug=…/> 。那么, Web 应用名是 router(不是 myweb ),且文件夹
-
部署方式为 IntelliJ IDEA 中的 Maven 原型:
如果 Web 应用是通过在 IntelliJ IDEA 中的 Maven 原型(archetype)中建立的,则应用的部署文件夹为 IntelliJ IDEA 工程中的文件夹 webapp。此时,文件夹
WEB-INF
需要直接放到文件夹 webapp 中。如果把文件夹WEB-INF
放到文件夹 webapp 中更深层次的文件夹,这将导致文件夹WEB-INF
不被识别。
-
- 文件夹
WEB-INF
中的配置文件只会在 Tomcat 开始启动时才会生效。如果更改了WEB-INF
文件夹中的任何内容,则需要重启 Tomcat 服务器。
- Tomcat 可以处理的是
.class
文件,而不是.java
文件。如果不使用 IDE,直接使用 Tomcat ,那么需要在文件夹WEB-INF
下的文件夹 classes 下提供相应的.class
文件,其中.class
文件还需要按 Java 包名目录的规则存放。
- 在 Tomcat 9 及之前,在地址栏输入的 URL 需要输入完整的路径名,而不能选择先输入 Web 应用(Web 文件夹)的路径,然后在浏览器中选择要访问的文件( 从 Tomcat 10 开始才可以这么做)。
总之,在 Tomcat 9 及之前,凡是在地址栏输入没有设置过的路径,浏览器均会报此错误。