How Tomcat Works读书笔记1

  • 一个Servlet容器要为一个Servlet请求提供服务,基本上有三件事要做:

    • 创建一个request对象并填充那些有可能被关联的Servlet使用的信息,如参数、头部、cookies、查询字符串、URI等等。一个request对象是 javax.servlet.ServletRequestjavax.servlet.http.ServletRequest接口的一个实例。
    • 创建一个response对象, 关联的servlet利用该对象来给客户端发送响应。一个response对象是javax.servlet.ServletResponsejavax.servlet.http.ServletResponse接口的一个实例。
    • 调用servletservice方法,并传入requestresponse对象。在这里servlet会从request对象取值,通过reponse来发送响应。
  • Catalina 是一个非常复杂的,并优雅的设计开发出来的软件,同时它也是模块化的。基于“Servlet 容器是如何工作的”这一节中提到的任务,你可以把 Catalina 看成是由两个主要模块所组成的:连接器(connector)和容器(container)。
  • 连接器是用来连接容器里面的请求的。它的工作是为接收到的每一个HTTP请求构造一个requestresponse对象。然后它把流程传递给容器。容器从连接器接收到requestresponse对象之后调用servletservice方法用于响应。不过这个描述只不过是冰山一角而已,这里的容器做了很多事情。比如,在它调用servletservice方法之前,它必须加载这个servlet,验证用户(假如需要的话),更新用户会话等等。一个容器为了处理这个进程使用了很多不同的模块,这也并不奇怪。例如,管理模块是用来处理用户绘画,而加载器是用来加载servlet类等等。
  • Web服务器也称为HTTP服务器,因为它使用HTTP来跟客户端通信,客户端通常是个web浏览器。一个基于Java的Web服务器使用两个重要的类:java.net.Socketjava.net.ServerSocket。当然现在还有基于NIO的Web服务器,使用的是java.nio.channels.SocketChanneljava.nio.channels.ServerSocketChanneljava.nio.channels.Selector
  • 一个HTTP请求包含三个组成部分
    • 方法 统一资源标识符(URI) 协议/版本
    • 请求的头部
    • 主体内容

下面是一个HTTP请求的例子:

POST /examples/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

lastName=Franks&firstName=Michael

每个HTTP请求可以使用HTTP标准里提到的多种方法中的一种。HTTP 1.1 支持7种类型的请求:GET, POST,HEAD, OPTIONS, PUT, DELETETRACEGETPOST 在互联网应用里边最普遍使用的。

URI 完全指明了一个互联网资源。URI 通常是相对服务器的根目录解释的。因此,始终一斜线/开头。统一资源定位器(URL)其实是一种 URI(查看 http://www.ietf.org/rfc/rfc2396.txt)来的。

请求的头部包含了关于客户端环境和请求的主体内容的有用信息。例如它可能包括浏览器设置的语言,主体内容的长度等等。每个头部通过一个回车换行符(CRLF)来分隔的。

对于 HTTP 请求格式来说,头部和主体内容之间有一个回车换行符(CRLF)是相当重要的(加上前一个头部的CRLF,其实是2个CRLF)。 CRLF告诉HTTP服务器,主体内容是在什么地方开始的。在一些互联网编程书籍中, CRLF 还被认为是 HTTP 请求的第四部分。

Web服务器也正是根据HTTP请求的格式才能将其解析出我们想要的数据。

  • 一个 HTTP 响应也包括三个组成部分:

    • 协议/版本 状态码 描述状态的短语
    • 响应的头部
    • 主体内容

下面是一个 HTTP 响应的例子:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112

<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome to Brainy Software
</body>
</html>

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  1. 1xx消息——请求已被服务器接收,继续处理
  2. 2xx成功——请求已成功被服务器接收、理解、并接受
  3. 3xx重定向——需要后续操作才能完成这一请求
  4. 4xx请求错误——请求含有词法错误或者无法被执行
  5. 5xx服务器错误——服务器在处理某个正确请求时发生错误

虽然RFC 2616中已经推荐了描述状态的短语,例如”200 OK”,”404 Not Found”,但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。

响应头部和请求头部类似,也包括很多有用的信息。响应的主体内容是响应本身的内容。头部和主体内容通过 CRLF 分隔开来。

  • Socket类和ServerSocket

    这两个类就Java网络编程的基础。

    套接字是网络连接的一个端点,它使得一个应用可以从网络中读取和写入数据。放在两台不同计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要知道另 一个应用的IP地址和套接字端口。在Java中,套接字指的是java.net.Socket类。你可以通过和Socket关联的InputStreamOutputStream来接收和传送数据。若想发送一个HTTP请求,那么只需要遵循上面提到的HTTP协议就可以了。

    ServerSocket用来建立一个服务器端,可以监听某一个端口,等待客户端的连接请求。一旦服务器套接字获得一个连接请求,它会创建一个Socket实例来与客户端通信。通常服务器套接字将会监听本地机器。服务器套接字正在监听的IP地址被称为是绑定地址。服务器套接字的另一个重要属性是backlog,当服务器的连接请求队列长度达到backlog后,服务器套接字将拒绝再进入的请求。

  • 如何自己来实现一个简单的Web服务器

    我们可以根据本文最开头说的那几个要点来实现:

    1. 首先用ServerSocket来监听某一个端口(比如8080)等待客户端连接
    2. 创建Request对象并通过从SocketInputStream中读取的信息来填充
    3. 创建Response对象,将其与SocketOutputStream关联
    4. 调用对应的Servletservice方法,并传入RequestResponse对象
    5. service方法中来处理请求并把响应传回客户端。
时间: 2024-08-11 03:31:51

How Tomcat Works读书笔记1的相关文章

how tomcat works 读书笔记(二)----------一个简单的servlet容器

app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/article/details/39378157) 回顾我们上一章,我们开发了一个最最简单的web服务器,它可以使用户访问服务器内的静态资源.当然这是远远不够的,在这一节里,我们就试着让服务器在能相应静态资源的基础上继续支持servlet. servlet接口 javax.servlet.Servlet接口

how tomcat works 读书笔记四 tomcat的默认连接器

其实在第三章,就已经有了连接器的样子了,不过那只是一个学习工具,在这一章我们会开始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足以下几个要求 1 实现org.apache.cataline.Connector接口 2 负责创建实现了org.apache.cataline.Request接口的request对象 3 负责创建实现了org.apache.cataline.Response接口的response对象 这里默认的连接器的原理很简单,就是等待http请求,创建re

How tomcat works 读书笔记十七 启动tomcat 上

一路跋山涉水,这是最后一章了. 关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类. 理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了. 为了让用户更方便的启动tomcat,还有批处理文件startup.bat(终于见到最顶层的模块了!!) Catalina 先说Catalina 它里面有一个Server组件(不懂的看第14章).同时在它的start方法中包含一个Digester对象(不懂的看第15章)用来解析conf/下的Server.x

How tomcat works 读书笔记十七 启动tomcat 下

在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释,解释器不会执行rem开始的命令 2 pause 用于暂停正在执行的批处理文件,按任意键后继续 3 echo 在控制台显示一段文本 如果显示变量的值需要在变量前后加% 如echo %var% 如果要输出操作系统的名字 就是 echo %os% 4 echo off 可以将命令本身隐藏 如果要连ech

how tomcat works读书笔记 七 日志记录器

大家能够松一口气了,这个组件比較简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. package org.apache.catalina; import java.beans.PropertyChangeListener; public interface Logger { public static final int FATAL = Integer.MIN_VALUE; public s

How Tomcat Works读书笔记三-------连接器

几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是http网络服务 当然如果以后再有其他的网络服务,可以再定义一个类,让它实现Servlet即可. HttpServletRequest,ServletRequest 先说ServletRequest接口,它用来传递网络服务的请求,用在Servlet类的service方法. 那么HttpServletReq

how tomcat works 读书笔记 十一 StandWrapper 上

方法调用序列 下图展示了方法调用的协作图: 这个是前面第五章里,我画的图: 我们再回顾一下自从连接器里 connector.getContainer().invoke(request, response); 这句代码运行之后发生的事情; 这是第五章的时序图,放在这一章同样适用... 我们仔细分析一下: 1首先连接器创建请求与响应对象; 2调用这行代码 connector.getContainer().invoke(request, response) (我们一StandContext为顶层容器)

how tomcat works 读书笔记(一)----------一个简单的web服务器

http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext transfer protocol). http分两部分,一个是请求(客户端发给服务器),一个是回复(服务器发给客户端). 先看http请求 下面就是一个http请求的例子,其中的各项参数,请查阅相关资料.(http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/

How tomcat works 读书笔记十五 Digester库

Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loader loader = new WebappLoader(); context.setLoader(loader); 就完成了向context容器里添加WepappLoader的功能. 这么做的问题就在于,一旦我想更改配置就必须得重新加载Bootstrap类. 幸运的是tomcat的设计者使用了一

How tomcat works 读书笔记十五 Digester库 下

在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的configured变量置为true.在这里我们看看完整版的ContextConfig都干了什么. 在tomcat的实际部署中,StandContext类的实际监听器是org.apache.catalina.startup.ContextConfig的实例. ContextConfig完成加载验证器阀,