JavaEE之Servlet
- 一、WEB容器
- 二、Servlet常用API和简单说明
- 三、Servlet生命周期
- Servlet对象是什么时候被创建的?
- Servlet被称为假单例
- 一个请求对应一个request和一个response
- 四、Servlet属性设置——三个范围(请求、会话、应用)
- 五、会话、过滤器
一、WEB容器
- 什么是WEB容器
web容器干啥用的:
- 管理
Servlet
的生命周期; - 维持浏览器和服务器之间的通信(对话);
- 加载web应用,处理请求。
- 多线程支持。
…
二、Servlet常用API和简单说明
Tomcat10
是jakarta
,如果不是这个版本就是javax
,本质没变.
jakarta.servlet
和jakarta.servlet.http
包表示servlet api
的接口和类。
jakarta.servlet
包中包含servlet
或容器使用的许多接口和类。这些接口不是特定于任何协议。
jakarta.servlet.http
包中包含仅用于负责http请求的接口和类。
注:以下说的是一些常用的,并不是所有。
🙌jakarta.servlet包中的接口:
Servlet
ServletRequest//service方法第一个参数
ServletResponse//service方法第二个参数
RequestDispatcher//请求转发对象
ServletConfig//Servlet配置信息
ServletContext//应用项目配置信息
Filter //过滤器
FilterChain // doFilter方法中的一个参数类型,该实现是由所使用的Tomcat猫它实现的。当然也可以是别的服务器
🙌jakarta.servlet包中的类
GenericServlet//实现了Servlet接口的抽象类(适配器)
ServletException
🙌jakarta.servlet.http包中的接口
HttpServletRequest//继承了ServletRequest接口
//在ServletRequest接口方法外,还有getMethod(),getContextPath()等有用方法
HttpServletResponse//继承了ServletReponse接口
HttpSession//session会话,会话域对象
🙌jakarta.servlet.http包中的类
HttpServlet//继承了GenericServlet抽象类,HttpServlet也是一个抽象类
Cookie // 一种会话跟踪技术
HttpServlet
不同于GenericServlet
抽象类的地方是它享有Http协议
;
它使用了模块化设计
,可以针对请求类型做出响应的操作,而这个是GenericServlet
所达不到的。
三、Servlet生命周期
Servlet
的生命周期可以分为几步来看:
Tomcat
小猫咪去web.xml
文件中找对应的Servlet
,然后通过反射对Servlet进行加载;- 通过类对象创建出对应的
Servlet
对象(通过Servlet
中的无参构造); - 有了
Servlet
对象,然后调用里面的init
方法进行初始化Servlet
;此时ServletConfig对象被创建。 - 然后调用
Servlet
类的service
方法; - 最后调用
destroy
方法,在服务中删除Servlet
实例之前,该方法使得Servlet
有机会清理所有的资源,例如:内存,线程等等。
Servlet对象是什么时候被创建的?
- 是首次向服务器发送请求的时候创建的。服务器是先判断内存中是否存在该
Servlet
对象,如果存在就直接调用service
方法,不存在就执行上面四大步。 - 那能否在打开服务器的时候就创建对象呢?
可以的;在web.xml
文件中配置< load-on-startup>
(加载优先级)< /load-on-startup>
如下图所示(未发送请求就创建好对象咯):
- 也可以通过
WebServlet
注解去进行设置;
Servlet被称为假单例
我们所知道的单例都是把构造方法给私有,然后通过方法获取实例对象,但Servlet
构造方法仍然是可以用的,但它在服务器出现的次数是一次的,所以说它是假单例。
如何验证?
通过init
方法服务器调用的次数就可以简单验证了,当然最准确的验证是在Servlet
构造方法中输出个东西,反复的发送请求看看构造方法中的输出语句会不会反复执行?
服务器中init
方法只执行一次,当重复发送请求的时候,是先检验内存中是否有该对象,如果存在就直接调用service
方法,并不会反复的去创建Servlet
对象。
一个请求对应一个request和一个response
四、Servlet属性设置——三个范围(请求、会话、应用)
- request(对应的类名:
ServletRequest
)
请求域(请求级别的) - session(对应的类名:
HttpSession
)
会话域(用户级别的) - application(对应的类名:
ServletContext
)
应用域(项目级别的,所有用户共享的)
这三个域对象的大小关系:request<session<application
他们三个域对象都有以下四个公共的方法:
void setAttribute(String name,Object obj)//向域中绑定数据
Object getAttribute(String name)//获取域中的数据
void removeAttribute(String name)//删除域中的数据
Enumeration< String> getAttributeNames()//得到域中所有数据对应的name
使用规则:尽量使用小的域
注:
HttpServletRequest是ServletRequest的一个子接口;
getContextPath
getSession
getServletPath
getMethod
.....等好用的方法是在HttpServletRequest
五、会话、过滤器
可以看看下面这些博客了解,Servlet 中的会话机制和过滤器(采用了责任链设计模式设计的)
Session会话机制
Cookie会话
Filter过滤器