Servlets 简明教程
Servlets - Life Cycle
Servlet 生命周期可以定义为从创建到销毁的整个过程。以下是 servlet 遵循的路径。
A servlet life cycle can be defined as the entire process from its creation till the destruction. The following are the paths followed by a servlet.
-
The servlet is initialized by calling the init() method.
-
The servlet calls service() method to process a client’s request.
-
The servlet is terminated by calling the destroy() method.
-
Finally, servlet is garbage collected by the garbage collector of the JVM.
现在,让我们详细讨论生命周期方法。
Now let us discuss the life cycle methods in detail.
The init() Method
init 方法只被调用一次。只在创建 servlet 时调用,之后不会为任何用户请求调用。因此,它用于一次性初始化,就像 applet 的 init 方法一样。
The init method is called only once. It is called only when the servlet is created, and not called for any user requests afterwards. So, it is used for one-time initializations, just as with the init method of applets.
servlet 通常在用户首次调用对应于 servlet 的 URL 时创建,但你也可以指定在服务器首次启动时加载 servlet。
The servlet is normally created when a user first invokes a URL corresponding to the servlet, but you can also specify that the servlet be loaded when the server is first started.
当用户调用 servlet 时,将创建一个每个 servlet 的单个实例,每个用户请求都会产生一个新线程,该线程将根据需要传递给 doGet 或 doPost。init() 方法简单地创建或加载一些数据,这些数据将在 servlet 的整个生命周期内使用。
When a user invokes a servlet, a single instance of each servlet gets created, with each user request resulting in a new thread that is handed off to doGet or doPost as appropriate. The init() method simply creates or loads some data that will be used throughout the life of the servlet.
init 方法的定义如下:
The init method definition looks like this −
public void init() throws ServletException {
// Initialization code...
}
The service() Method
service() 方法是执行实际任务的主要方法。servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并将格式化的响应写回客户端。
The service() method is the main method to perform the actual task. The servlet container (i.e. web server) calls the service() method to handle requests coming from the client( browsers) and to write the formatted response back to the client.
每次服务器收到对 servlet 的请求时,服务器都会生成一个新线程并调用 service。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并根据需要调用 doGet、doPost、doPut、doDelete 等方法。
Each time the server receives a request for a servlet, the server spawns a new thread and calls service. The service() method checks the HTTP request type (GET, POST, PUT, DELETE, etc.) and calls doGet, doPost, doPut, doDelete, etc. methods as appropriate.
此方法的签名如下:
Here is the signature of this method −
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
service() 方法是由容器调用,而 service 方法会根据需要调用 doGet、doPost、doPut、doDelete 等方法。因此,你无需操作 service() 方法,但可以根据从客户端收到的请求类型覆盖 doGet() 或 doPost()。
The service () method is called by the container and service method invokes doGet, doPost, doPut, doDelete, etc. methods as appropriate. So you have nothing to do with service() method but you override either doGet() or doPost() depending on what type of request you receive from the client.
doGet() 和 doPost() 是各个 service 请求中使用最多的方法。以下是这两个方法的签名。
The doGet() and doPost() are most frequently used methods with in each service request. Here is the signature of these two methods.
The doGet() Method
GET 请求来自对 URL 的常规请求或未指定 METHOD 的 HTML 表单,应当由 doGet() 方法处理。
A GET request results from a normal request for a URL or from an HTML form that has no METHOD specified and it should be handled by doGet() method.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
The doPost() Method
POST 请求来自明确列出 POST 为 METHOD 的 HTML 表单,应当由 doPost() 方法处理。
A POST request results from an HTML form that specifically lists POST as the METHOD and it should be handled by doPost() method.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
The destroy() Method
destroy() 方法仅在 servlet 生命周期的末尾调用一次。此方法可以让你的 servlet 有机会关闭数据库连接、停止后台线程、将 cookie 列表或点击数写入磁盘,以及执行其他此类清理活动。
The destroy() method is called only once at the end of the life cycle of a servlet. This method gives your servlet a chance to close database connections, halt background threads, write cookie lists or hit counts to disk, and perform other such cleanup activities.
调用 destroy() 方法后,servlet 对象会被标记为垃圾回收。destroy 方法的定义如下:
After the destroy() method is called, the servlet object is marked for garbage collection. The destroy method definition looks like this −
public void destroy() {
// Finalization code...
}
Architecture Diagram
下图描绘了一个典型的 servlet 生命周期场景。
The following figure depicts a typical servlet life-cycle scenario.
-
First the HTTP requests coming to the server are delegated to the servlet container.
-
The servlet container loads the servlet before invoking the service() method.
-
Then the servlet container handles multiple requests by spawning multiple threads, each thread executing the service() method of a single instance of the servlet.