一、Servlet执行过程
当客户端向服务器发送一个http请求后,web服务器会将这个请求交给Servlet容器去处理,Servlet容器首先对请求的URL进行解析并根据web.xml配置文件找到对应的Servlet去处理,同时将Request、Response对象传递给它,Servlet通过请求对象可知道客户端的请求者、请求信息等,Servlet处理完请求后会把所需要的信息放入Response对象中并返回给客户端,Servlet一旦处理请求,Servlet容器会刷新Response对象,并把控制权重新返回给web服务器。
二、Servlet生命周期
1、初始化阶段,调用init()方法;
当客户端第一次向服务器请求Servlet时,Servlet容器启动时会自动装载某些Servlet,Servlet类源文件被更新,重新装载Servelt,Servlet被装载后,Servlet容器创建一个Servelt实例并且调用Servlet的init()方法,在Servlet生命周期内,init()方法只调用一次;
Servlet容器启动时会自动装载某些Servlet,实现它,只需要在web.xml文件中配置如下代码:
<!-- 标记Servlet容器是否启动时就加载这个Servlet,当值>=0时,表示Servlet容器启动时就加载这个Servlet, 当数值为负数或者没有指定是,表示Servlet容器在该Servlet选择时才加载,正数的值越小,启动该Servlet的优先级越高。 --> <load-on-startup>1</load-on-startup>
2、响应请求阶段,调用service()方法;
服务器装载并初始化Servlet后,Servlet容器会创建ServletRequest对象与ServletResponse对象,然后调用Servlet的service()方法,service()方法从ServletRequest对象中获取客户请求信息,处理该请求,并通过ServletRespons对象向客户端返回响应信息。在Servlet生命周期内,service()方法调用多次;
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); // 页面跳转 request.getRequestDispatcher("/alluser.jsp").forward(request, response); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); }
3、服务器终止阶段,调用destroy()方法;
当web应用被终止、Servlet容器终止运行、Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroty()方法来释放Servlet所占用的资源,在Servlet整个生命周期内,destroty()方法被调用一次。
Servlet生命周期测试:
public void init() throws ServletException { System.out.println("我是init()方法,我在Servlet生命周期中只执行一次..."); super.init(); } public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("我是service()方法,我负责客户端的request请求与response响应,在Servlet生命周期中执行多次..."); super.service(arg0, arg1); } public void destroy() { System.out.println("我是destrot()方法,在服务器停在或者卸载时执行此方法,我负责释放资源,在Servlet生命周期中执行一次..."); super.destroy(); }
运行效果:
三、Servlet工作原理
客户端发送一个请求,Servlet调用service()方法对请求进行响应,通过源码可见,service()方法对请求的方式进行了匹配,选择调用doGet、doPost等这些方法,然后在进入对应的方法中调用逻辑的方法,实现对客户端的响应,在Servlet接口中是没有doGet、doPost等等这些方法,HttpServlet中定义了这些方法,但是返回error信息,所以,每次定义一个Servlet时,都必须实现doGet或者doPost等这些方法。