
5.3 小结
HTTP是目前使用非常广泛的应用层协议,它规定了在网络上传输文档(主要是HTML格式的网页)的规则。HTTP的客户程序主要是浏览器。浏览器访问一个远程HTTP服务器上的网页的步骤如下。
(1)建立与远程服务器的连接。
(2)发送HTTP请求。
(3)接收HTTP响应,断开与远程服务器的连接。
(4)展示HTTP响应中的网页内容。
HTTP服务器必须接收HTTP请求,对它进行解析,然后返回相应的HTTP响应结果。本章创建了一个非阻塞的HTTP服务器,它首先读取HTTP请求,把它们存放在字节缓冲区内,当缓冲区的容量不够时,会扩充它的容量,以保证容纳HTTP请求的所有数据。接着,程序把字节缓冲区内的字节转换为字符串,对其进行解析,获得HTTP请求中的请求方式、URI和协议版本等信息,然后创建相应的HTTP响应,把它发送给客户程序。
本程序仅支持GET和HEAD请求方式,不支持POST等其他请求方式,没有处理请求正文。本程序只能发送静态文档,不能生成动态网页。所谓动态网页,指服务器能根据HTTP请求中的请求参数,动态的生成网页内容。例如,假定HTTP请求中包括“username=weiqin”的表单数据,要求服务器生成的网页内容为“hello:weiqin”。要具备生成动态网页的能力,就需要对HTTP服务器的功能进行以下扩展。
(1)修改Request类的parse()方法,使它能解析HTTP请求中的请求参数。
(2)修改Request类,使它能存放HTTP请求中的所有请求参数,并且能通过getParameter(String paramName)方法来检索特定的请求参数。参数paramName指定请求参数名,该方法返回与之匹配的请求参数值。
(3)创建一个Servlet接口,它的service()方法负责生成动态网页。

(4)修改RequestHandler的处理逻辑,使它支持GET、HEAD和POST请求方式。
(5)修改RequestHandler的处理逻辑。如果用户请求的URI以“/servlet”开头,比如“/servlet/HelloServlet”,就调用相应HelloServlet的service()方法来生成动态网页,否则就按照原来的方式发送静态网页。
(6)修改Response类,增加设置响应正文Content的方法。

(7)根据特定的应用需求,创建相应的Servlet实现类。例如,以下HelloServlet类能读取HTTP请求中的username参数的值XXX,然后生成动态网页内容:“hello:XXX”。

感兴趣的读者可以按照以上方式对程序进行修改,使得用户在浏览器中输入URL:http://localhost/servlet/HelloServlet?username=weiqin时,浏览器中显示的内容为“hello:weiqin”。
值得注意的是,以上Servlet接口与Oracle公司发布的Java Servlet API中的Servlet接口的定义并不完全一样。不过,两者都是服务器端的插件,用来扩展服务器的功能。