Servlet的运行机制和生命周期

来源:互联网 发布:java中文乱码怎么解决 编辑:程序博客网 时间:2024/04/29 21:25
Servlet的运行机制和生命周期
一、Servlet的运行机制

           当浏览器发送给服务器一个Servlet的请求时,如果这个Servlet是第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它。所以,多个线程有可能会去访问共享的全局变量,因此,在使用这些全局变量时,一定要特别小心,让这些线程不会访问到不同步的数据。除非是需要共享的信息。

下面我们使用例子进行演示Servlet的运行过程,说明只创建一个实例,而进行多次线程调用,首先给这个Servlet增建一个构造函数,并在doGet()函数中也打印一个标记,重新部署,看看界面的显示,代码如下所示: 

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class ShoeServlet2 extends HttpServlet {  
  11.   
  12.     public ShoeServlet2() {  
  13.         System.out.println("ShoeServlet2:构造函数");  
  14.     }  
  15.   
  16.     protected void processRequest(HttpServletRequest request, HttpServletResponse response)  
  17.             throws ServletException, IOException {  
  18.         response.setContentType("text/html;charset=UTF-8");  
  19.         try (PrintWriter out = response.getWriter()) {  
  20.             System.out.println("ShoeServlet2:processRequest");  
  21.         }  
  22.     }  
  23.   
  24.     @Override  
  25.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  26.             throws ServletException, IOException {  
  27.         System.out.println("ShoeServlet2:doGet");  
  28.         processRequest(request, response);  
  29.     }  
  30.   
  31.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  32.             throws ServletException, IOException {  
  33.         System.out.println("ShoeServlet2:doPost");  
  34.         processRequest(request, response);  
  35.     }  
  36.   
  37.     @Override  
  38.     public String getServletInfo() {  
  39.         System.out.println("ShoeServlet2:getServletInfo");  
  40.         return "Short description";  
  41.     }// </editor-fold>  
  42.   
  43. }  


运行后在控制台出现如下结果:

第一次进入的显示:

图1 第一次进入时的显示
图2 刷新后的显示
从上面显示效果可以看出:Servlet第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它

二、Servlet的生命周期

从前面的例子可以看出,一个Servlet在服务器上最多只会驻留一个实例,在此期间会涉及到HttpServlet的方法,如下所示:

           在编写Servlet程序时,都是让它继承HttpServlet这个类,然后根据需要去覆盖HttpServlet中的方法。比较常用的方法有:init()、doGet()、doPost()、service()、destroy().

(1)doGet()/doPost()/service()

   service()方法

如果客户端有一个对Servlet的请求发送过来,那么服务器端会产生一个新的线程,并且让它调用Servlet的service()方法。service()方法根据收到的客户端请求类型,决定调

doGet()还是doPost()还是其他的doXXX()方法。

如果不能确定客户端的请求方式到底是GET还是POST方式,那么可以在Servlet中同时定义这两个方法,如下方式让另一个来调用其中一个:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException  
  2.                               {  
  3.         //处理doGet请求  
  4.                              }  
  5. public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{  
  6.         doGet(request,reponse);  
  7.                                  }  
(2)init()方法

           对Servlet做一些初始化工作,这个方法只会被调用一次,不会对每次连接都调用,可以将一些初始化代码放在该函数中

(3)destroy()方法

         如果要删除某个Servlet实例,那么在删除之前服务器会先调用destroy()方法。可以在这个方法中执行一些清理动作,比如释放数据库连接,关闭打开的文件等。

综上,Servlet的生命周期如下图所示:


图 Servlet生命周期图


以上就是Servlet运行机制和生命周期的总结

0 0