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/archive/2009/08/17/1960629.html
Tomcat源码学习(9)-How Tomcat works(转)相关推荐
- Tomcat源码学习(4)-How Tomcat works(转)
ServerSocket类 Socket类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个HTTP服务器或者FTP服务器,你 ...
- Tomcat源码学习(7)-How Tomcat works(转)
Response类 ex01.pyrmont.Response类代表一个HTTP响应,在Listing 1.6里边给出. Listing 1.6: Response类 package ...
- Tomcat源码学习(一)
Tomcat源码学习(一) 已有 9159 次阅读 2008-3-13 03:10 |个人分类:Tomcat|系统分类:开发 http://blog.ccidnet.com/home.php?mod= ...
- java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动
在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...
- Tomcat源码解析五:Tomcat请求处理过程
前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程. 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求-> ...
- tomcat源码分析(一)从tomcat架构说起
首先dowload源码并导入到Eclipse中,导入后代码代码的层次如下图所示.先简单来看下tomcat源码的结构.javax这个包主要是有关JavaEE规范的,比如Servlet等等,并不是我们主要 ...
- tomcat源码学习
2019独角兽企业重金招聘Python工程师标准>>> 1.下载源码 在eclicpse 用svn导入源码 http://svn.apache.org/repos/asf/tom ...
- Tomcat源码解析三:tomcat的启动过程
Tomcat组件生命周期管理 在Tomcat总体结构 (Tomcat源代码解析之二)中,我们列出了Tomcat中Server,Service,Connector,Engine,Host,Context ...
- (精)tomcat 源码学习
Tomcat6是最新版本的web容器,其支持最新版本的servlet2.5和jsp2.1.而且Tomcat6架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程.显然,这是一个通过阅读To ...
最新文章
- ubuntu常用指令
- Java 抖音授权登录
- docker部署resin应用
- [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)
- [html] 举例说明写一个button的按钮的方法有哪些?
- java进入dos_java启动dos命令收集笔记一
- ubuntu windows mysql 中文乱码解决
- Git — 解决“requested upstream branch ‘origin/master‘ does not exist“
- 专访ThoughtWorks王磊:从单块架构到微服务架构
- 关于Webstorm汉化后无法打开设置,谈谈心里的想法
- linux 实现不同网段网络互通
- 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
- 树莓派4+lede+移远5G模组RM500Q
- Microsoft project 2016 使用出现的bug
- AI教程 如何在 Illustrator 中创建渐变颜色?
- 福大计算机课程表,福州大学课程表(非全日制工程硕士研究生2015年周末班公共....doc...
- Linux基础和命令大全
- 解决运行web项目问题:localhost: 8080 is already in use
- JavaScript --函数 (实例结合)
- 函数式编程语言的入门级了解
热门文章
- 这5条职场心机,句句真实,引发深思
- Qt——P27 QListWidget控件
- Linux平台安装Clion
- iptables的端口范围映射
- python PyQt5初级教程hello world
- sql server 内存_SQL Server内存性能指标–第1部分–内存页/秒和内存页故障/秒
- 索引sql server_维护SQL Server索引
- azure云数据库_Azure Data Studio中Windows的数据库管理工具扩展
- 在SQL Server中使用architectureid
- 《梦断代码》读后感03——为什么我们不能像造桥一样造软件