标签:
一个Servlet
容器要为一个Servlet
请求提供服务,基本上有三件事要做:
request
对象并填充那些有可能被关联的Servlet
使用的信息,如参数、头部、cookies、查询字符串、URI
等等。一个request
对象是 javax.servlet.ServletRequest
或 javax.servlet.http.ServletRequest
接口的一个实例。response
对象, 关联的servlet
利用该对象来给客户端发送响应。一个response
对象是javax.servlet.ServletResponse
或javax.servlet.http.ServletResponse
接口的一个实例。servlet
的service
方法,并传入request
和response
对象。在这里servlet
会从request
对象取值,通过reponse
来发送响应。Catalina
是一个非常复杂的,并优雅的设计开发出来的软件,同时它也是模块化的。基于“Servlet
容器是如何工作的”这一节中提到的任务,你可以把 Catalina
看成是由两个主要模块所组成的:连接器(connector
)和容器(container
)。
连接器是用来连接容器里面的请求的。它的工作是为接收到的每一个HTTP
请求构造一个request
和response
对象。然后它把流程传递给容器。容器从连接器接收到request
和response
对象之后调用servlet
的service
方法用于响应。不过这个描述只不过是冰山一角而已,这里的容器做了很多事情。比如,在它调用servlet
的service
方法之前,它必须加载这个servlet
,验证用户(假如需要的话),更新用户会话等等。一个容器为了处理这个进程使用了很多不同的模块,这也并不奇怪。例如,管理模块是用来处理用户绘画,而加载器是用来加载servlet
类等等。
Web服务器也称为HTTP
服务器,因为它使用HTTP
来跟客户端通信,客户端通常是个web浏览器。一个基于Java的Web服务器使用两个重要的类:java.net.Socket
和java.net.ServerSocket
。当然现在还有基于NIO
的Web服务器,使用的是java.nio.channels.SocketChannel
、java.nio.channels.ServerSocketChannel
和java.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
, DELETE
和 TRACE
。GET
和 POST
在互联网应用里边最普遍使用的。
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位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
虽然RFC 2616
中已经推荐了描述状态的短语,例如”200 OK”,”404 Not Found”,但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
响应头部和请求头部类似,也包括很多有用的信息。响应的主体内容是响应本身的内容。头部和主体内容通过 CRLF
分隔开来。
Socket
类和ServerSocket
类
这两个类就Java网络编程的基础。
套接字是网络连接的一个端点,它使得一个应用可以从网络中读取和写入数据。放在两台不同计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要知道另 一个应用的IP地址和套接字端口。在Java
中,套接字指的是java.net.Socket
类。你可以通过和Socket
关联的InputStream
和OutputStream
来接收和传送数据。若想发送一个HTTP
请求,那么只需要遵循上面提到的HTTP
协议就可以了。
ServerSocket
用来建立一个服务器端,可以监听某一个端口,等待客户端的连接请求。一旦服务器套接字获得一个连接请求,它会创建一个Socket
实例来与客户端通信。通常服务器套接字将会监听本地机器。服务器套接字正在监听的IP地址被称为是绑定地址。服务器套接字的另一个重要属性是backlog
,当服务器的连接请求队列长度达到backlog
后,服务器套接字将拒绝再进入的请求。
如何自己来实现一个简单的Web服务器
我们可以根据本文最开头说的那几个要点来实现:
ServerSocket
来监听某一个端口(比如8080)等待客户端连接Request
对象并通过从Socket
的InputStream
中读取的信息来填充Response
对象,将其与Socket
的OutputStream
关联Servlet
的service
方法,并传入Request
和Response
对象service
方法中来处理请求并把响应传回客户端。标签:
原文地址:http://blog.csdn.net/u012345283/article/details/44761341