【发布时间】:2014-03-26 17:00:37
【问题描述】:
servlet 容器何时调用方法 doPost / doGet?它是否在开始处理之前等待接收来自 Web 客户端的完整请求。还是在接收到 HTTP 标头并识别 HTTP 请求的方法(POST、GET 等)之后调用方法(doPost 或 doGet)?
我的问题与以下链接中的问题完全相同: Does servlet engine read the whole request before calling a servlet?
但除此之外,假设 servlet 容器将在识别 HTTP 方法和内容长度后立即调用方法 doPost / doGet,如果 Web 客户端在完整的 HTTP 请求发送到 Web 服务器之前终止会发生什么/servlet 容器。 servlet 线程如何知道收到的请求未完成。
【问题讨论】:
-
这不是 Servlet 规范中指定的。每个 Servlet 容器都可以选择以任何他们想要的方式实现该行为。您想了解哪个 Servlet 容器?
-
我有兴趣了解 Tomcat。
-
这是为了回答我自己的问题 - servlet 线程如何知道收到的请求未完成?
-
当servlet容器收到HTTP头时,根据收到的HTTP头调用doPost/doGet方法。它不会等待接收到完整的请求(如内容长度所示)。如果应用程序开发人员调用了 getParameter 或其变体,那么此时,此方法将等待,直到收到完整的请求。如果 Web 客户端在未发送完整请求的情况下关闭,则 getParameter 返回 null。应用程序开发人员需要明确处理这种情况。
-
我个人的看法是,getParameter应该有办法判断是网络I/O错误,而不是返回null。抛出异常更好。有什么想法吗?