Servlet 生命周期
(1) init()方法初始化Servlet对象
它在第一次创建Servlet时被调用,在后续每次不同用户请求时不再调用。
(2) service()方法来处理客户端的请求
Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个Servlet请求时,服务器都会产生一个新的线程并调用服务。
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
(3) Servlet 通过调用 destroy() 方法终止(结束)
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
HttpServlet的功能
HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对象,并把Http请求直接封装到 HttpServlet对象中,大大简化了HttpServlet解析请求数据的工作量。HttpServlet容器响应Web客户请求流程如下:
(1) Web客户向Servlet容器发出Http请求;
(2) Servlet容器解析Web客户的Http请求;
(3) Servlet容器创建一个HttpServletRequest对象,在这个对象中封装Http请求信息;
(4) Servlet容器创建一个HttpServletResponse对象;
(5) Servlet容器调用HttpServlet的service方法,把HttpServletRequest和HttpServletResponse对象作为service方法的参数传给HttpServlet对象;
(6) HttpServlet(通过doGet(),doPost()等)调用HttpServletRequest的有关方法,获取HTTP请求信息;
(7) HttpServlet(通过doGet(),doPost()等)调用HttpServletResponse的有关方法,生成响应数据;
(8) Servlet容器把HttpServlet的响应结果传给Web客户。
如何编写一个Servlet
(1) 扩展HttpServlet抽象类;
(2) 覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法;
(3) 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串;
(4) 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。
[例]
在IDE中直接创建一个Dynamic web project,再配置好Tomcat即可。servlet3.0后@WebServlet可以直接替代web.xml里的<servlet>标签。
1 package com.servlettest; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Enumeration; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 /** 14 * Servlet implementation class Test1 15 */ 16 @WebServlet("/Test1") 17 public class Test1 extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#HttpServlet() 22 */ 23 public Test1() { 24 super(); 25 } 26 27 /** 28 * @see javax.servlet.GenericServlet#init() 29 */ 30 @Override 31 public void init() throws ServletException { 32 System.out.println("-----Call init() method.-----"); 33 } 34 35 /** 36 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 37 */ 38 @Override 39 protected void doGet(HttpServletRequest request, HttpServletResponse response) 40 throws ServletException, IOException { 41 42 System.out.println("-----Call doGet() method.-----"); 43 response.setContentType("text/html"); 44 PrintWriter out = response.getWriter(); 45 out.println("<table border="1" align="center">"); 46 out.println("<tr><th>Header Name</th><th>Header Value</th></tr>"); 47 Enumeration<String> headerNames = request.getHeaderNames(); 48 while (headerNames.hasMoreElements()) { 49 String paramName = headerNames.nextElement(); 50 out.println("<tr><td>" + paramName + "</td><td> " + request.getHeader(paramName) + "</td></tr>"); 51 } 52 out.println("</table>"); 53 } 54 55 /** 56 * @see javax.servlet.GenericServlet#destroy() 57 */ 58 @Override 59 public void destroy() { 60 System.out.println("-----Call destroy() method.-----"); 61 } 62 63 /** 64 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 65 */ 66 @Override 67 protected void doPost(HttpServletRequest request, HttpServletResponse response) 68 throws ServletException, IOException { 69 System.out.println("-----Call doPost() method.-----"); 70 doGet(request, response); 71 } 72 }