Tomcat下构建Web应用时,常犯的一些通用错误
笔者报错时的运行环境:
JDK 13.0.2
Maven 3.6.3
Tomcat 9.0.41(Servlet 4.0,JSP 2.3)
Intelli] 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下有一个文件夹demoweb,而文件夹demoweb中有一个文件 demoapp.jsp 。那么,访问这个JSP文件 demoapp.jsp 的路径如下:
- Web应用的基路径:localhost:8080
- Web应用名:demoweb
- Web应用相对路径:demoapp.jsp
- 完整URL:http://localhost:8080/demoweb/demoapp.jsp
- 文件夹WEB-INF的位置:必须位于Web应用的目录(文件夹)的下一级目录(文件夹)(注意:是下一级,不是下N级)。
-
部署方式为Tomcat安装目录下的文件夹webapps:
如果通过将Web应用放置到Tomcat安装目录下的文件夹webapps中来部署,且Web应用的名称为demoweb,那么,文件夹demoweb需要放到webapps中,而文件夹WEB-INF需要放到demoweb中。如果把文件夹WEB-INF放到文件夹demoweb中更深层次的文件夹,这将导致文件夹WEB-INF不被识别。(即Tomcat下的webapps里放demoweb,demoweb里放WEB-INF。) -
部署方式为Tomcat安装目录下的文件夹conf内的XML配置文件:
如果Web应用是通过在路径 Tomcat的安装路径\conf\Catalina\localhost\Web应用名.xml 中的XML文件中配置路径部署的,那么请注意,此XML文件指定的路径是Web应用的路径,不是Web应用的路径的上一级文件夹的路径。- 比方说,如果上述XML文件你命名为 myroute.xml ,在该文件中指定的路径是 <Context docBase=“D:\Tomcat\myweb” debug=…> 。那么,Web应用名是myroute(不是myweb),且文件夹WEB-INF需要放到文件夹myweb中。如果你把文件夹WEB-INF放到文件夹myweb中更深层次的文件夹,这将导致文件夹WEB-INF不被识别。
-
部署方式为IntelliJ IDEA工程中的文件夹webapp:
如果Web应用是通过在IntelliJ IDEA新建的Web工程中建立的,则应用的部署文件夹为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及之前,凡是在地址栏输入Web应用没有设置过的路径,浏览器均会报此错误。