第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/archive/2009/08/17/1960629.html

Tomcat源码学习(9)-How Tomcat works(转)相关推荐

  1. Tomcat源码学习(4)-How Tomcat works(转)

    ServerSocket类 Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTTP服务器或者FTP服务器,你 ...

  2. Tomcat源码学习(7)-How Tomcat works(转)

    Response类 ex01.pyrmont.Response类代表一个HTTP响应,在Listing 1.6里边给出.          Listing 1.6: Response类 package ...

  3. Tomcat源码学习(一)

    Tomcat源码学习(一) 已有 9159 次阅读 2008-3-13 03:10 |个人分类:Tomcat|系统分类:开发 http://blog.ccidnet.com/home.php?mod= ...

  4. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  5. Tomcat源码解析五:Tomcat请求处理过程

    前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程. 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求-> ...

  6. tomcat源码分析(一)从tomcat架构说起

    首先dowload源码并导入到Eclipse中,导入后代码代码的层次如下图所示.先简单来看下tomcat源码的结构.javax这个包主要是有关JavaEE规范的,比如Servlet等等,并不是我们主要 ...

  7. tomcat源码学习

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载源码 在eclicpse 用svn导入源码   http://svn.apache.org/repos/asf/tom ...

  8. Tomcat源码解析三:tomcat的启动过程

    Tomcat组件生命周期管理 在Tomcat总体结构 (Tomcat源代码解析之二)中,我们列出了Tomcat中Server,Service,Connector,Engine,Host,Context ...

  9. (精)tomcat 源码学习

    Tomcat6是最新版本的web容器,其支持最新版本的servlet2.5和jsp2.1.而且Tomcat6架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程.显然,这是一个通过阅读To ...

最新文章

  1. ubuntu常用指令
  2. Java 抖音授权登录
  3. docker部署resin应用
  4. [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)
  5. [html] 举例说明写一个button的按钮的方法有哪些?
  6. java进入dos_java启动dos命令收集笔记一
  7. ubuntu windows mysql 中文乱码解决
  8. Git — 解决“requested upstream branch ‘origin/master‘ does not exist“
  9. 专访ThoughtWorks王磊:从单块架构到微服务架构
  10. 关于Webstorm汉化后无法打开设置,谈谈心里的想法
  11. linux 实现不同网段网络互通
  12. 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
  13. 树莓派4+lede+移远5G模组RM500Q
  14. Microsoft project 2016 使用出现的bug
  15. AI教程 如何在 Illustrator 中创建渐变颜色?
  16. 福大计算机课程表,福州大学课程表(非全日制工程硕士研究生2015年周末班公共....doc...
  17. Linux基础和命令大全
  18. 解决运行web项目问题:localhost: 8080 is already in use
  19. JavaScript --函数 (实例结合)
  20. 函数式编程语言的入门级了解

热门文章

  1. 这5条职场心机,句句真实,引发深思
  2. Qt——P27 QListWidget控件
  3. Linux平台安装Clion
  4. iptables的端口范围映射
  5. python PyQt5初级教程hello world
  6. sql server 内存_SQL Server内存性能指标–第1部分–内存页/秒和内存页故障/秒
  7. 索引sql server_维护SQL Server索引
  8. azure云数据库_Azure Data Studio中Windows的数据库管理工具扩展
  9. 在SQL Server中使用architectureid
  10. 《梦断代码》读后感03——为什么我们不能像造桥一样造软件