简要了解servlet

概要

学习目的

本人是学校的咸鱼一条,这学期在学校学习了web的开发,期间老师带我们手写了一个简易的servlet容器。我发现对这块还挺有兴趣的,就去搜索,发现有很多人推荐这本《How Tomcat Works》,就下载了一本,打算一边学习,一边在csdn上与大家分享学习的经历,本人文笔不太好,编程这一块能力有限,有时候文章中会出现一些错误,欢迎各位大佬来指正

简介

《How Tomcat Works》这本书剖析了TomCat4.1.12和5.0.18版本,解释了它的servlet容器的内部的运行机制。Tomcat是一个复杂的系统,由许多不同的组件组成。这本书提供了一个蓝图,为Tomcat中每一个组件构造一个简化的版本,理解后再对真实的组件进行解释

Servlet容器是如何工作的

servlet容器要对一个servlet的请求提供服务,大体分为以下三件事

  • 将一个请求封装为一个request对象,其中包含servlet要使用的所有信息(一个对象为javax.servlet.ServletRequest或javax.servlet.http.ServletRequest接口的一个实例)

  • 创建一个response对象,用来给客户端发送响应(一个response对象为javax.servlet.ServletResponse或javax.servlet.http.ServletResponse接口的一个实例)

  • 通过调用servlet的server方法,传入request和response两个对象,完成两件事。

    • 从request对象取值
    • 给response写值
Catalina架构图

Catalina是一个非常复杂的,并且优雅设计开发出来的软件,同时它也是模块化的。基于“Servlet容器是如何工作的”这一节中提到的任务,你可以把Catalina看成是由两个主要模块所组成的:连接器(connector)和容器(container)
在这里插入图片描述

处理过程(简化版)

连接器是用来“连接”容器里面的请求的

  1. 连接器接收一个HTTP请求构造一个request和response对象
  2. 连接器将request和response对象传给容器
  3. 容器调用servlet的service方法处理两个对象
  4. 补充:这是简化版的处理过程,实际上容器为了处理进程使用了很多不同的模块。eg:管理模块——处理客户会话;加载器——加载servlet类
Tomcat4和5的不同
Tomcat4Tomcat5
支持Servlet2.3和JSP1.2Servlet2.4和JSP2.0
默认连接器有一些更有效率的默认连接器
后台处理线程每个组件都有属于自己的后台处理线程共享一个后台处理线程
是否需要映射组件需要映射组件不需要映射组件

第一章:一个简单的Web服务器

web服务器是如何工作的

Web服务器也成为超文本传输协议(HTTP)服务器,因为它使用HTTP来跟客户端进行通信,这通常是一个web浏览器。基于java的web服务器使用两个重要的类:java.net.Socket和java.net.ServerSocket,并通过HTTP消息进行通信。

HTTP

HTTP是一种协议,允许web服务器和浏览器通过互联网来发送和接受数据。它是一种请求响应协议。客户端请求一个文件而服务器响应请求。HTTP使用的是可靠的TCP连接(默认为80端口)

HTTP请求

一个HTTP请求通常由三部分组成

  • 方法——统一资源标识符(URI)——协议/版本
  • 请求头部
  • 请求内容

下面是一个HTTP请求的例子

//方法:POST, URI:examples/default.jsp, 协议/版本:HTTP/1.1
POST /examples/default.jsp HTTP
Accept:text/plain; text/html //请求头部
Accept-Language:en-gb
Connection: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支持7种请求方法:

GET,POST**(最常用)**,

HEAD,OPTIONS,PUT,DELETE,TRACE

URI:

指明一个互联网资源,通常情况下相对服务器的根目录解释,所以始终以/开头

(URL其实也是一种URI)

请求头部

包含了关于客户端环境和请求主体内容的有用信息,每个头部以换行符(CRLF)分隔

请求内容

实体内容在一个典型的HTTP请求中可以很容易变得很长

HTTP响应

类似HTTP请求,一个HTTP响应也包括三个组成部分:

  • 方法——统一资源标识符(URI)——协议/版本
  • 响应的头部
  • 主体内容

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

HTTP/1.1 200 OK //使用HTTP 1.1 请求成功(200状态码表示成功)
Server: Microsoft-IIS/4.0
Date:Mon, 5 Jan 2004 13:13:12 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112
//响应的主题内容是响应本身的HTML内容,头部与主题通过CRLF分隔开    
<html>
    <head>
    	<title>HTTP Response Example</title>
    </head>
    <body>
    	Welcome to java world
    </body>
</html>
Socket和ServerSocket
Socket类

socket(套接字):由IP+端口号组成,是网络连接的一个端点。套接字使得一个应用可以从网络中读取或写入数据。使用字节流传输,可以接受或发送字节流

ServerSocket类

ServerSocket(服务器套接字):一个随时待命的套接字

ServerSocket和Socket的区别

​ Socket:创建一个你想要通信的对象

​ ServerSocket:等待来自客户端的请求,获得连接请求时再创建Socket实例来通信

​ 注:构造ServerSocket对象时需要另一个参数 int backLog(服务器会把连接请求排成一个队列,backlog即是最大队列长度,到达最大队列长度之后会拒绝后面的请求)

简单的服务器实现原理:

​ ServerSocket通过accpet()得到一个socket实例

​ socket.getInputStream——request对象

​ socket.getOutputStream——response对象
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值