中间件-Tomcat-Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
servlet创建
默认是用户第一次调用对应该Servlet的URL时初始化当前Servlet,该Servlet便一直存在,直到长时间不调用、服务器关闭才销毁或者类文件更新后重新载入。但可通过配置指定Servlet在服务器第一次启动的被加载。
<servlet>
<servlet-name>Xxx</servlet-name>
<servlet-class>com.lingz.Xxx</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
初始化init()
init在第一次创建Servlet的时候被调用,是单线程的不用担心多线程安全问题。init简单的创建或加载一些数据,这些数据将被应用于Servlet的整个生命周期。
service()服务过程
- 每收到一个请求,服务器会产生一个新的线程并调用service()服务,根据HTTP的请求类型调用doGet,doPost等方法。
- service()与多线程
servlet是单例的,当多个请求请求同一个servlet时,要注意线程安全。
如果service只使用了当前线程自己的资源,就不需要进行同步控制
如果访问了全局静态变量有读写操作,通常需要加上同步控制语句
如果service访问了全局资源,文件数据库连接等,通常需要加上同步控制语句
destory()销毁
当web服务器认为此servlet没有存在的必要、类重新加载、服务器关闭、长时间未被访问,则可以从内存中销毁。而回收该Servlet内存前必须调用destroy(),web服务器保证该方法被调用时已经结束了请求调用的service()或等待剩余的请求执行完,并且不会再接收请求。当全部请求处理完并响应后,即可destroy() 并进行内存回收。与init一样只执行一次
执行流程
- 根据时机,web容器加载对应的servlet类,并进行init()初始化。
- 默认第一次请求servlet时初始化
- 可设置容器启动时初始化
- Servlet类文件更新后重新转载
- 接收请求,将URL封装成HttPServletRequest和HttpServletResponse对象,根据配置(web.xml)转交给对应的servlet。
- service根据HTTPServletRequest请求的请求类型等信息调用对应的doGet、doPost等方法,进行业务处理。
- 将处理后的HttpServletResponse返回给web容器
- web容器在返回给客户端
来源:CSDN
作者:wilbur_xieyj
链接:https://blog.csdn.net/wilbur_xieyj/article/details/103022508