Tomcat&Servlet
web服务器软件
- 服务器:安装了服务器软件的计算机
- 服务器软件:接收用户的请求,处理请求,做出响应
- web服务器软件:接收用户的请求,处理请求,做出响应
- 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
- web容器
常见的java相关的web服务器软件
webLogic
Oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范、收费的
webSphere
IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
JBOSS
JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
Tomcat
Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp、开源的,免费的
Tomcat(web服务器软件)
使用步骤
下载
安装:解压压缩包即可
- 注意:安装目录建议不要有中文和空格
卸载:删除目录就行了
启动
- 找到bin/startup.bat,双击运行该文件即可
- 浏览器访问自己的:http://localhost:Tomcat端口号(默认8080)
- 浏览器访问别人的:http://别人的ip:tomcat端口号
关闭
- 正常关闭
- bin/shutdown.bat
- ctrl+c
- 强制关闭
- 点击启动窗口的X
- 正常关闭
配置
部署项目的方式
直接将项目放到webapps目录下即可
简化部署:将项目打成一个war包,再将war包放置在webapps目录下(war包会自动解压缩)
配置conf/server.xml文件
在标签体中配置
1
2
3
4
5
6<Context docBase="D:\hello" path="/hehe" />
<!--
docBase:项目的存放路径
path:虚拟目录(/hehe)
-->
在conf\Catalina\localhost创建任意名称的xml文件,在文件中编写
- 现在的虚拟目录名称就上面任意名称的xml文件的名称
可能遇到的问题
黑窗口一闪而过
- 原因:没有正确配置JAVA_HOME环境变量
- 解决方案:正确配置JAVA_HOME环境变量
启动报错
暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
netstat -ano
温柔:修改自身的端口号
- conf/server.xml文件中
- 一般会将tomcat的默认端口号修改为80,80端口号是http协议的默认端口号
- 好处:在访问时,就不用输入端口号
动静态项目
java动态项目的目录结构
- 项目的根目录(ROOT)
- WEB-INFO目录
- web.xml:web项目的核心配置文件
- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包
tomcat集成到IDEA
tomcat与IDEA相关配置
IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 查看控制台的log:Using CATALINA_BASE: “C:\Users\Administrator.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_68_tomcat”
- 可以在上述路径中的conf/Catalina/.xml中找到项目磁盘路径(tomcat第三种部署方式)
工作空间项目和tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目”
“tomcat部署的web项目”对应着”工作空间项目” 的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
断点调试:使用”小虫子”启动 dubug 启动
Servlet(server applet)
概念
- servlet就是一个接口,定义了java类被浏览器访问到(tomcat识别)的规则
- 将来我们自定义一个类,实现Servlet接口,重写里面的方法
快速入门
创建JavaEE项目
定义一个类,实现Servlet接口
实现接口中的抽象方法
配置Servlet(url的请求路径)
在web.xml中的配置
1
2
3
4
5
6
7
8
9
10
11
<!-- url访问路径:
http://localhost:8080/demo1
--->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.zhuixun.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容
- 如果有,则找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其service方法
Servlet生命周期
被创建(执行init方法,只执行一次)
提供服务(执行service方法,执行多次)
每次访问Servlet时,service方法都会被调用一次
被销毁(执行destroy方法,只执行一次)
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
只有服务器正常关闭时,才会执行destroy方法
destroy方法在Servlet被销毁之前执行,一般用于释放资源
什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Servlet的创建时机
在标签下配置
第一次被访问时创建
的值为负数
在服务器启动时创建
的值为0或正整数
Servlet的init方法,只执行一次,说明Servlet在内存中只存在一个对象,Servlet是单例的
多个用户同时访问时,可能存在线程安全问题
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值
Servlet3.0
支持注解配置,可以不需要在web.xml中配置了
步骤
- 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 重写方法
- 在类上使用@WebServlet注解,进行配置
- 格式:@WebServlet(“资源路径”)
1 |
|
Servlet体系结构
- Servlet接口
- GenericServlet抽象类
- HttpServlet抽象类
GenericServlet
将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet
对http协议的一种封装,简化操作
- 定义类继承HttpServlet
- 复写doGet/doPost方法
Servlet相关配置
urlpartten(Servlet访问路径)
一个Servlet可以定义多个访问路径
@WebServlet({“/d4”,”/dd4”,”/ddd4”})
路径定义规则
- /xxx:路径匹配
- /xxx/xxx:多层路径,目录结构
- *.do:扩展名匹配