Tomcat是常见的免费的web服务器.
Tomcat 这个名字的来历,Tomcat是一种野外的猫科动物,不依赖人类,独立生活。 Tomcat的作者,取这个名字的初衷是希望,这一款服务器可以自力更生,自给自足,像Tomcat这样一种野生动物一般,不依赖其他插件,而可以独立达到提供web 服务的效果。
如何启动TOmcat
下载 tomcat.rar–>运行批处理文件: D:/tomcat/bin/startup.bat
(这里我用的Tomcat 9.0版本的,启动时候出现了控制台乱码,可以修改tomcat的conf下的logging.properties
中的参数:
java.util.logging.ConsoleHandler.encoding = GBK)
最后如果你看到Server startup in xxx ms,就表明启动成功了。
注 :Tomcat启动之后,不要关闭。。。。 关闭了就不能访问了。。。。
部署一个网页
部署一个功能完备的web应用 有很多种方式,但是如果只是部署一个test.html
,很简单
把test.html 复制到 D:\tomcat\webapps\ROOT
目录下,就可以通过 http://127.0.0.1:8080/test.html
访问.
8080是什么
8080
是tomcat默认使用的端口号
平时上网的网址,比如 http://12306.com/index.html
是没有端口号的,也可以给tomcat改端口
tomcat默认的端口号是8080
,可以通过配置把端口号修改成80
tomcat改端口
server.xml
tomcat的端口配置相关信息在 server.xml
中
server.xml
记录了非常多的tomcat配置信息,其中就包括端口
用记事本打开 D:\tomcat\conf\server.xml
查询 ctrl+f
,输入8080
可以找到两个8080,一个在注释中,不用理会。 另一个是
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8543" />
这就表明使用的是8080端口,把它修改为80,保存。
接着,必须重启tomcat
重启tomcat就是先关掉之前打开的startup.bat
,再运行startup.bat
…
80端口:
接着就可以直接通过 http://127.0.0.1/test.html
访问网页了。
80
端口就是web
服务默认的端口号,所以就不需要显式写这个端口号了
80端口被占用:
有时候80端口被占用了,无法使用该端口。、
端口被占用就无法启动tomcat,所以要找到端口被占用的程序是哪一个,然后再关闭对应的程序即可
1.查看80端口被哪些程序占用了
使用命令
netstat -ano|findstr "80"
查看 端口号包含"80"的占用情况
查询结果找到 80,8009,8005
(这三个都包含80)。对应的pid(process id)
进程id
是1828
2.根据pid(进程id) 查询对应的应用程序
使用命令:
tasklist|findstr "1828"
1828
根据上一步找到的对应的pid,发现是一个java.exe
程序占用了80
端口
3.根据名称 结束该程序
最后使用
taskkill /f /t /im java.exe
结束
java.exe
结束成功会提示:
成功: 已终止 。。。
或者通过pid终止:
taskkill /f /pid 1828
问题排查
Tomcat常见的问题,如不能启动,屏幕一闪而过,启动之后,访问总是出现404
等等常见问题。
以下排查手段都是针对通过startup.bat
独立方式启动的Tomcat,集成开发环境IDE(IDEA,ECLIPSE,MYECLIPSE等)
下的Tomcat启动不在此知识点讨论范围之内。
点击startup.bat
之后,屏幕一闪而过
1.检验:如图所示, 首先通过cmd命令进入控制台,然后切换到对应的目录执行startup命令,得到JRE_HOME environment ....
这么个提示,就表示JAVA_HOME环境变量没有设置。
分析:Tomcat本身是JAVA程序,必须要有JDK才可以执行,所以必须配置JAVA_HOME。
解决:配置JAVA_HOME,
2.检验:如图所示, 首先通过cmd命令进入控制台,然后切换到对应的目录执行startup命令,得到CATALINA_HOME environment ....
这么个提示,就表示CATALINA_HOME
环境变量设置错误。
分析:Tomcat执行必须依赖CATALINA_HOME
或者CATALINA_BASE
这两个环境变量。 如果没有在环境变量里配置过,那么会自动采用bin
目录的父目录作为CATALINA_HOME和CATALINA_BASE
。 如果配置了,而所配置的地方又不是正确的TOMCAT
目录,那么就会出现这个错误。
解决:
- 在环境变量中删除CATALINA_HOME,CATALINA_BASE的配置,记得不仅要检查环境变量,还要检查用户变量。
- 或者把CATALINA_HOME设置为正确的TOMCAT目录。
Tomcat可以成功启动,但是就是不能访问自己配置的web应用,老是提示404错误
检验:如图所示, 在环境变量里,CATALINA_HOME
设置在了另一个合法的tomcat
目录上,所以无论运行哪个startup.bat
,都会导致这个d:/tomcatxxxx
目录下的程序被启动,而不是你期望的那个。
分析:默认的Tomcat会优先根据环境变量中的CATALINA_HOME
来定位目录,并运行。
解决:
- 在环境变量中删除CATALINA_HOME,CATALINA_BASE的配置,记得不仅要检查环境变量,还要检查用户变量。
- 或者使用网站的纯净版 Tomcat,已经取消了对环境变量CATALINA_HOME和CATALINA_BASE的依赖。
屏幕一闪而过,或者不会关闭,但是提示大量错误,其中会看到如图所示的Address already in use: JVM_Bind :80,即表示端口被占用了
检验:如果是这个错误,在TOMCAT目录下的logs目录里,会有一个日志文件:catalina.yyyy-mm-dd.log
(当天时间),在这个日志文件里会记载一样的错误:Address already in use: JVM_Bind <null>:80
。即表明80
端口被占用了。
分析:端口是独占式的,一旦一个程序占用了这个端口,其他程序就不能够再去占用它了。而80端口,有可能是被已经存在的Tomcat占用了,也有可能是被其他不知名的软件占用了,比如Apache,IIS,Oracle等等,可以关闭占用的程序,或者更改端口号。
404错误
1.localhost.yyyy-mm-dd.log
检验:打开tomcat/logs
目录里的localhost.yyyy-mm-dd.log
文件,发现大量的报错信息。
分析:当server.xml
, web.xml
配置错误的时候,当前web应用就会部署失败,并且会将错误信息输出到localhost.yyyy-mm-dd.log
文件中。
解决: 要在localhost.yyyy-mm-dd.log
文件中看提示什么错误,有可能是配置的context目录不存在,有可能是多了一个>
符号,具体问题,具体分析了。
2.现象:404错误,明明有文件,但是就是不能访问。
检验:这个严格地说,也是配置失败,但是tomcat不会大量报错,只会偷偷地来这么一句: startup failed due to previous errors
。
分析:过滤器启动失败就会报这个错。
解决:同样的,过滤器启动失败原因也是多种多样,好在它都会把具体错误信息输出到localhost.yyyy-mm-dd.log
,这样打开localhost.yyyy-mm-dd.log
根据实际情况分析,就可以较快定位问题所在了。
3.404错误,明明有文件,但是就是不能访问。
检验:在命令行中运行java -version
检查一下当前java的版本
分析:当部署的web应用中的类是由高版本JDK编译生成,而当前tomcat运行所使用的JDK又是低版本的话,就会报出如图所示的错误:UnsupportedClassVersionError
,进而导致web应用启动失败。
解决:请使用JDK8或者更高版本,请参考 检测JDK版本,以及下载与配置
404问题大排查
404问题:404表示File Not Found
, 文件不存在错误。
可能的问题:
正确的端口号
出现404错误证明,TOMCAT是启动成功了的。 但是在一台计算机上,可以启动多个端口号不一样的TOMCAT,所以请确保自己访问的是正确的那个端口号,别自己启动的是8080端口号的TOMCAT,但是访问的地址却用的是80端口(默认),这样肯定会出现404错误的。
环境变量
假设有两个Tomcat A和 B,自己分明运行的是B 下的startup.bat
, 但是启动的却是A,为什么会这样呢? 这就是环境变量在作祟了。
在环境变量中有两个属性:分别是CATALINA_HOME和CATALNIA_BASE,
如果这个值指向的是A,那么即便运行的是B下的startup.bat,
真正启动的还会是A。
解决办法: 删除掉这个环境变量,或者使用移除了环境变量影响的纯净版 Tomcat。
确定Web应用是否成功启动
虽然Tomcat启动成功了,但是对应的Web应用启动失败,依然会导致404错误。
怎么判断Web应用成功与失败呢? 倘若Web引用启动失败,那么就一定会在Tomcat的logs目录下的 localhost.当前日期.log
里留下错误信息。 打开这个文件,检查对应的Web应用是否启动过程中报错了。
也许是web.xml多写了一个标签结束,也许是对应的servlet类找不到。
webapps下的ROOT目录
有的时候,在server.xml
中配置的<context
是以“/"
为开始路径的,与此同时,在webapps
目录下还存在一个ROOT
目录,这个ROOT
目录其实也是告诉tomcat,以“/”
为开始路径,那么这样就发生冲突了,Tomcat只能二选一,通常情况下都会选择ROOT
目录,那么在server.xml
中配置的<context
就无法启动了,导致访问对应的资源提示404错误。
解决办法就是删除掉ROOT目录,或者把ROOT目录重命名
访问地址的时候是否加了web应用的名称
这个也是常犯的错误,加入部署的时候,指定了路径,比如:
<Context path="/j2ee" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />
那么访问的时候,要记得加上j2ee
,像这样:
http://127.0.0.1:8080/j2ee/hello
不能访问WEB-INF目录下的资源
从安全角度出发,TOMCAT不允许访问WEB-INF
目录下的HTML,JSP
文件。 所以如果你的资源文件放在WEB-INF下,也会提示404错误
访问地址后面多加了一个斜杠
访问地址后面多加了一个斜杠
如图,本来应该访问
http://127.0.0.1:8080/j2ee/login.html
但是却访问了地址:
http://127.0.0.1:8080/j2ee/login.html/
Tomcat持久化异常
Tomcat启动的时候会报一个Exception loading sessions from persistent storage
异常,但是又不影响正常的业务。
启动报错:
Tomcat启动的时候会报一个Exception loading sessions from persistent storage
异常
该问题的原因是tomcat的session
持久化机制引起的,tomcat这个功能本身的用意在于重启tomcat后保存之前的session
,Tomcat会把session
持久化在%TOMCAT%/work/Catalina/localhost/session.ser
这个文件里。 但是因为tomcat非正常关闭,所以这个文件没有正确地结束(无EOF
标记)
解决办法治标: 只需要删除 session.ser文
件即可。
解决办法治本:关闭tomcat的持久化功能,就能一劳永逸的解决这个问题。具体为修改conf
下的server.xml
文件。在项目的context
间加入一句代码
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>
重启tomcat以后再也不会报这个错误了。
<Context path="/" docBase="D:\\project\\j2ee\\web" debug="0" reloadable="false" >
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>
</Context>
纯净版Tomcat
- 移除了对换变量中配置的CATALINA_HOME和CATALINE_BASE的依赖,运行startup.bat就一定是启动当前的tomcat。
- 删除了webapps里的所有文件夹,避免未删除的ROOT目录与server.xml中的context配置发生冲突可能导致的错误,
下载
Tomcat 部署
在接下来的课程中有大量的J2EE应用,比如servlet, struts, springmvc
,这些 J2EE应用都需要部署在Tomcat
里才可以运行。而初学者又特别容易在这一步犯错,所以本文专门示例如何从0开始,正确地部署一个可运行的J2EE应用,包括在过程中会碰到的问题以及对应的解决办法。
下载一个J2EE应用
接下来下载一个J2EE应用来进行测试,本站有很多可以运行的J2EE应用项目可供下载,尽量使用一个简单点的,不用连接数据库的来测试。
如第一个servlet
知识点右上角有一个j2ee.rar
可供下载。
部署
下载好j2ee.rar后,解压出来,假设解压到如下目录:
E:\download\j2ee
接着用把 前面下载的 tomcat8080
对应的 conf 目录下的 server.xml
文件打开,复制本来被注释掉的
<!--
<Context path="/" docBase="E:\\project\\j2ee\\web" debug="0" reloadable="false" />
-->
如图所示,把e:\\project\\j2ee\\web
修改为 e:\\download\\j2ee\\web
。
如果没有把握就下载右上角的server.xml,并覆盖server.xml。
注: 文件路径是双斜杠,不是单斜杠
重启tomcat,并测试
关闭tomcat, 并重新运行startup.bat
。 然后输入如下网址,看到如图所示的截图,即表示部署成功了。
http://127.0.0.1:8080/hello
1.单个html文件可以直接放在
webapps/ROOT
目录下,启动Tomcat输入对应xx.html
即可
对于项目:
2.直接解压在webapps
目录下,访问localhost:8080/项目名/xx.html
3.修改配置文件conf/server.xml
,添加<Context path="/" docBase="E:/download/j2ee/web" debug="0" reloadable="false" />
这样项目放在任意位置都可以。访问localhost:8080/hello
4.不修改配置文件,容易引起不必要的问题。 在 conf/Catalina/localhost 目录下,新建一个 xml 文件,比如叫 j2ee.xml,里面添加一句
这样也可以部署。
访问变成localhost:8080/j2ee/hello