站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题Servlet/JSP 容器开发手记1

Servlet/JSP 容器开发手记1

摘要: 开发手记 Servlet JSP ServletInputStream

2004 年春节假期,忽然心血来潮,想自己开发一个类似于Tomcat的Servlert/JSP容器,实现Servlet2.3 和 JSP 1.2 规范,
同时把开发过程的心得及体会写成手记供各位网友和程序员参考及指正,欢迎大家提供宝贵意见。开发完成后,将所有开发文档及
源码与大家分享。谢谢!


ESoftWind
2004/2/4

ServletInputStream

HTTP/1.1协议的请求包由一个请求行(RequestLine),多个请求头(Header),数据内容(BodyContent)组成,请求头与数据内容以\r\n分开,请求头的Cotent-Length属性说明了BodyContent的长度。如果请求头中不包含Content-Length属性,说明请求包中不包含BodyContent

ServletInputStream实现读取BodyContent的输入流

read 方法的实现:

必须返回 -1 以表示流的结束,对底层来自Socket的输入流(底层流),除非客户端关闭了Socket,底层流是永远不会返回 -1 的,如果底层流的数据已读完,此时再调用底层流的 read 方法时,将造成当前线程的阻塞,因此,想依靠底流来返回 -1 来表明 ServletInputStream 的结束是不可行的。

因此,只能依靠Content-Length属性来判断流是否结束,如果已读取的数据总量超过Content-Length时,则返回 -1 。

对于Content-Type 等于 application/x-www-form-urlencoded 请求,Container 必须从底层流读取以解析request parameter , 对这种情况, ServletInputStream 不能简单通过读取底层流的数据来实现 read 方法(因为BodyContent已被读取了),而只能通过缓存读取 request parameter 时的数据来实现 ServletInputStream



↑返回目录
前一篇: Servlet/JSP 容器开发手记2
后一篇: WIN2000+PHP+MYSQL+APACHE+TOMCAT+JSP完全整合说明