zoukankan      html  css  js  c++  java
  • 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命令。
        应用程序里边的每个类都会在以下各节中进行讨论。

  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/macula7/p/1960789.html
Copyright © 2011-2022 走看看