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方法中来处理请求并把响应传回客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值