Tomcat源码学习(9)How Tomcat works(转)

第2章:一个简单的Servlet容器

概要

    本章通过两个程序来说明你如何开发自己的servlet容器。第一个程序被设计得足够简单使得你能理解一个servlet容器是如何工作的。然后它演变为第二个稍微复杂的servlet容器。
    注意:每一个servlet容器的应用程序都是从前一章的应用程序逐渐演变过来的,直至一个全功能的Tomcat servlet容器在第17章被建立起来。
    这两个servlet容器都可以处理简单的servlet和静态资源。你可以使用PrimitiveServlet来测试这个容器。PrimitiveServlet在Listing 2.1中列出并且它的类文件可以在webroot目录下找到。更复杂的servlet就超过这些容器的能力了,但是你将会在以下各章中学到如何建立更复杂的servlet容器。
         Listing 2.1: PrimitiveServlet.java
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class PrimitiveServlet implements Servlet {
     public void init(ServletConfig config) throws ServletException {
     System.out.println("init");
     }
     public void service(ServletRequest request, ServletResponse response)
         throws ServletException, IOException {
         System.out.println("from service");
         PrintWriter out = response.getWriter();
         out.println("Hello. Roses are red.");
         out.print("Violets are blue.");
     }
     public void destroy() {
         System.out.println("destroy");
     }
     public String getServletInfo() {
         return null;
     }
     public ServletConfig getServletConfig() {
         return null;
     }
}

应用程序1

    现在,让我们从一个servlet容器的角度来研究一下servlet编程。总的来说,一个全功能的servlet容器会为servlet的每个HTTP请求做下面一些工作:
  • 当第一次调用servlet的时候,加载该servlet类并调用servlet的init方法(仅仅一次)。
  • 对每次请求,构造一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例。
  • 调用servlet的service方法,同时传递ServletRequest和ServletResponse对象。
  • 当servlet类被关闭的时候,调用servlet的destroy方法并卸载servlet类。
    本章的第一个servlet容器不是全功能的。因此,她不能运行什么除了非常简单的servlet,而且也不调用servlet的init方法和destroy方法。相反它做了下面的事情:
  • 等待HTTP请求。
  • 构造一个ServletRequest对象和一个ServletResponse对象。
  • 假如该请求需要一个静态资源的话,调用StaticResourceProcessor实例的process方法,同时传递ServletRequest和ServletResponse对象。
  • 假如该请求需要一个servlet的话,加载servlet类并调用servlet的service方法,同时传递ServletRequest和ServletResponse对象。
    注意:在这个servlet容器中,每一次servlet被请求的时候,servlet类都会被加载。
    第一个应用程序由6个类组成:
  • HttpServer1
  • Request
  • Response
  • StaticResourceProcessor
  • ServletProcessor1
  • Constants

这个应用程序的入口点(静态main方法)可以在HttpServer1类里边找到。main方法创建了一个HttpServer1的实例并调用了它的await方法。await方法等待HTTP请求,为每次请求创建一个Request对象和一个Response对象,并把他们分发到一个StaticResourceProcessor实例或者一个ServletProcessor实例中去,这取决于请求一个静态资源还是一个servlet。
    Constants类包括涉及其他类的静态final变量WEB_ROOT。WEB_ROOT显示了PrimitiveServlet和这个容器可以提供的静态资源的位置。
    HttpServer1实例会一直等待HTTP请求,直到接收到一个shutdown的命令。你科研用第1章的做法发送一个shutdown命令。
    应用程序里边的每个类都会在以下各节中进行讨论。

原文地址:https://www.cnblogs.com/macula7/p/1960789.html