郑州专门做喷绘安装的网站,深圳装修公司排名100强,二手物品交易网站开发意义,单产品网站建设Servlet的生命周期有四个阶段#xff1a;加载并实例化、初始化、请求处理、销毁。主要涉及到的方法有init、service、doGet、doPost、destory等
加载并实例化 Servlet容器负责加载和实例化Servelt。当Servlet容器启动时#xff0c;或者在容器检测到需要这个Servlet来响应第一… Servlet的生命周期有四个阶段加载并实例化、初始化、请求处理、销毁。主要涉及到的方法有init、service、doGet、doPost、destory等
加载并实例化 Servlet容器负责加载和实例化Servelt。当Servlet容器启动时或者在容器检测到需要这个Servlet来响应第一个请求时创建Servlet实例。当Servlet容器启动后Servlet通过类加载器来加载Servlet类加载完成后再new一个Servlet对象来完成实例化。
Servlet 生命周期
Servlet在服务器里是单例的是
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程
Servlet 初始化后调用 init () 方法。Servlet 调用 service() 方法来处理客户端的请求。Servlet 销毁前调用 destroy() 方法。最后Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
现在让我们详细讨论生命周期的方法。
init() 方法
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用在后续每次用户请求时不再调用。因此它是用于一次性初始化就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时就会创建一个 Servlet 实例每一个用户请求都会产生一个新的线程适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据这些数据将被用于 Servlet 的整个生命周期。
init 方法的定义如下
public void init() throws ServletException {// 初始化代码...
}
service() 方法
service() 方法是执行实际任务的主要方法。Servlet 容器即 Web 服务器调用 service() 方法来处理来自客户端浏览器的请求并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型GET、POST、PUT、DELETE 等并在适当的时候调用 doGet、doPost、doPutdoDelete 等方法。
下面是该方法的特征
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{
}
service() 方法由容器调用service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以您不用对 service() 方法做任何动作您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
doGet() 方法
GET 请求来自于一个 URL 的正常请求或者来自于一个未指定 METHOD 的 HTML 表单它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}
doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单它由 doPost() 方法处理。
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}
destroy() 方法
destroy() 方法只会被调用一次在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘并执行其他类似的清理活动。
在调用 destroy() 方法之后servlet 对象被标记为垃圾回收。destroy 方法定义如下所示 public void destroy() {// 终止化代码...}
线程安全问题 Servlet容器通过维护一个线程池来处理多个请求线程池中维护的是一组工作者线程Worker Thread。Servlet容器通过一个调度线程Dispatcher Thread来调度线程池中的线程。
当客户端的servlet请求到来时调度线程会从线程池中选出一个工作者线程并将请求传递给该线程该线程就会执行对应servlet实例的service方法。同样当客户端发起另一个servlet请求时调度线程会从线程池中选出另一个线程去执行servlet实例的service方法。Servlet容器并不关心这些线程访问的是同一个servlet还是不同的servlet当多个线程访问同一个servlet时该servlet实例的service方法将在多个线性中并发执行。 简单的来说就是在多个请求下访问的是同一个Servlet实例对象
所以Servlet对象是单实例多线程Servlet不是线程安全的
举个例子
public class aaaServlet extends HttpServlet{private static final long serialVersionUID 1L;private String username1 null;//实例变量Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{username1 request.getParameter(username1);String username2 request.getParameter(username2);//局部变量}
}
username1则是共享变量多个线程会同时访问该变量是线程不安全的。
username2是局部变量不管多少个线程同时访问都是线程安全的。
架构图
下图显示了一个典型的 Servlet 生命周期方案。
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。Servlet 容器在调用 service() 方法之前加载 Servlet。然后 Servlet 容器处理由多个线程产生的多个请求每个线程执行一个单一的 Servlet 实例的 service() 方法。参考
Servlet生命周期以及线程安全问题_servlet线程安全问题
Servlet 生命周期 | 菜鸟教程