Tomcat常见问题
当我们在Eclipse上开发web工程时,工程部署到Tomcat上了,所以修改文件的源码时,Eclipse会自动将更改后的文件重新部署到Tomcat上,但是如果你做出修改的内容仍然在浏览器中看不到,那么可以使用以下几种常用的解决方法:
1. 右键点击部署的工程,选择清理模块文件夹:
右键点击Tomcat,选择Clean,清理Tomcat的工程目录:
- 右键点击Tomcat,选择Restart重新启动:
- 点击stop停止Tomcat服务器,并删除部署的工程,然后再重新部署工程运行:
- 检查以下几个细节:
ip地址是否有写错
端口是否有写错或者是否通行
工程名称有没有访问错误
请求页面的名称是否有写错
- 清理Tomcat的工作环境:
删除Tomcat中部署的所有工程,只运行目前的工程。
还是不行就删除整个Tomcat,重新下载一个
- 如果是在启动服务器时报错,要查看控制台打印的日志信息,找出错误来源,学会分析日志信息对于解决错误很有帮助:
- 查看Eclipse中的server目录下的文件是否正常,有没有缺失:
思维导图:
关于创建web工程时的一些问题:
在Eclipse中创建Dynamic Web Porject(动态web工程)时,会让我们选择以下几个配置:
1. 上图中的工程名称不用多解释,关于运行服务器则不一定要选择Tomcat,可以使用其他的web服务器:
我们选择Tomcat并不是说针对Tomcat这个服务器去开发,开发后的工程并不是只能应用于这个服务器,Tomcat只是作为一个运行我们开发工程的载体,在Tomcat上开发的工程完全可以在其他的支持Java的服务器中运行。
我们使用Tomcat作为运行服务器是为了导入Tomcat的jar包类库,每个支持Java的web服务器都实现了Java所定制的接口规范,我们开发web工程的时候需要借助这些接口来进行开发,就像使用JDBC连接数据库一样,需要导入JDBC的jar包,通过它根据接口规范所实现的操作类去开发连接数据库的模块,这也是Java面向接口编程普遍的应用之一。
- 动态web模块版本需要视服务器的版本而选择,因为不同版本的web服务器支持的动态web模块版本不一样,这里以Tomcat为例,Tomcat8.0以上的版本才可以支持3.1的web模块版本,那么如何得知当前使用的web服务器版本支持什么版本的web模块?这个可以在官方的文档上查看到,同样的以Tomcat为例:
选择一个版本点击进去:
在工程创建时的点击Configuration(配置)右边的按钮,可以在里面勾选一些Project Facets,并且能选择不同的版本:
Project Facets可以理解为:“项目的特性”。Project Facets的作用特性:
- facet 定义了 java ee 项目的特性和要求
- 为项目添加 EAR facet 会自动添加 web.xml (deployment descriptor file) ,并重新设置classpath
- 项目创建时至少已经有一个 facet,开发人员可以按需添加其他 facet
- 有的 facet 会依赖其他 facet
- 有的 facet 可能和其他 facet 互斥
- facet 可以设置版本
下面用实际例子来演示一下Project Facets的作用:
例如我现在有一个普通的Java工程:
右键点击此工程的属性,进入属性界面后点击Project Facets,可以看到这个工程勾选了哪些Project Facets:
可以看到只勾选了Java,这是被默认选中的配置,因为这是一个最简单的java项目,如果想把这个java项目变成一个web项目,勾选其中的Dynamic Web Module并点击Apply即可:
此时查看工程目录可以看到多了一个WebContent目录:
重新打开Project Facets面板框,会发现JavaScript选项框也被选中了:
从这个例子应该可以很轻易地明白Project Facets的作用。
Servlet开发
介绍如何开发servlet之前,先介绍一下什么是servlet:
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
所以Servlet就是一个接收用户请求,处理完请求后生成动态Web内容的一个Java程序。是一个简单的Java类,这个类中写的是处理用户请求的代码,因为web服务器都是以http协议来进行通信的,所以开发基于http协议的Servlet需要继承一个叫做HttpServlet的类,并且要实现它里面的一个方法,这个方法用来处理用户的请求。
示意图:
除了需要继承一个父类,我们还需要配置Servlet的web访问映射,需要给它起一个别名,在浏览器中只需要访问这个别名就可以访问到这个Servlet类。有两种配置方式:一种是通过web.xml文件进行配置,一种是通过注解来配置。首先介绍通过xml来配置,因为注解相对于xml来说要简单一些,至于为什么要有一个别名:
- 在创建web工程的时候勾选创建web.xml文件:
2. 创建一个Java类,继承于HttpServlet,并重写父类的doGet方法,并在方法中写上一句打印语句:
3. 打开web.xml文件,删除一些内容:
- 增加以下配置信息:
简单解释一下这段配置信息的意义:
5. 配置完之后,将工程部署到Tomcat中,并启动Tomcat服务器,然后在浏览器中访问以下地址:
http://localhost:8080/myweb/hello
打开后会发现控制台打印了一段消息:
这是因为这个Servlet被访问了,所以方法中的代码也就会执行了。
从浏览器访问Servlet的过程:
Tomcat服务器接收到浏览器的访问时,会先去webapps这个目录下找到该访问的目标Servlet所在的工程目录,然后在此工程目录下找到WEB-INF目录,询问此目录下的web.xml文件,会在此文件中先寻找到<url-pattern>标签所声明的内容,再找到与此标签相对应的<servlet-class>标签里声明的Servlet操作类。寻找到后就会去classes目录下找到这个Servlet操作类,接着就会实例化此操作类的对象,然后调用此类中的doGet方法,就会执行此方法里面的代码。
所以最后会在控制台打印一段消息,每次访问Servlet都是这样的一个流程,这只是最简单Servlet访问流程,还有更复杂的。
以上是通过web.xml去配置Servlet的web访问,下面介绍一下使用注解来配置,但是要注意的是注解的配置方式是Servlet3.0才有的特性:
1.创建web工程,这次不需要勾选创建web.xml文件了,然后同样的创建一个Java类,继承于HttpServlet,并重写父类的doGet方法,在方法中写上一句打印语句:
- 配置注解,在类上声明@WebServlet() 注解,并在注解的小括号里上此Servlet类的web访问名称:
可以看到通过注解的方式来配置,比web.xml不知道高到哪里去了,一个注解就搞定了,要简单很多,所以xml渐渐地比较少使用了,只不过一些老工程可能是使用xml文件配置的,所以了解一下xml的配置方式还是有必要的,免得到时候遇到了抓瞎。
3. 配置完之后,同样的将工程部署到Tomcat中,并启动Tomcat服务器,然后在浏览器中访问以下地址:
http://localhost:8080/myweb/hello
打开后也会发现控制台打印了一段消息:
你访问几次就会打印多少句:
通过数组,注解能一次性配置多个别名,而xml文件需要写好几个标签:
通过以上的几个别名都可以访问这个Servlet:
控制台:
甚至可以加上任意后缀:
访问它时依旧是个Servlet:
控制台:
每次修改Servlet的别名后记得重启Tomcat服务器,不然不会生效的。