"响应已经承诺"究竟是什么意思?那么如何处理异常呢?

yln*_*gar 3 jsf servlets response

我知道在getter和setter中编写业务逻辑是一种非常糟糕的编程习惯,但如果响应已经提交,有没有办法处理异常?

"响应已经提交"和"标题已经发送给客户"的含义究竟是什么?

Bal*_*usC 13

如果响应已经提交,则没有很好的方法来处理异常.HTTP响应基本上存在标题和正文.标题基本上指示客户端(webbrowser)应该如何处理响应,例如内容类型,内容长度,字符编码,正文编码,缓存指令等.

您可以在webbrowser的开发人员工具集的HTTP流量监视器中查看标头.在Chrome/IE9 +/Firefox23 +中按F12,然后选中"网络"标签.以下屏幕显示是我的Chrome在您当前的问题上显示的内容:

在此输入图像描述

(注意:"响应"选项卡显示响应正文)

响应主体是实际内容,通常是一堆HTML代码的味道.服务器通常有一个固定大小的缓冲区来写响应.缓冲区大小取决于服务器品牌/版本和配置,通常为2KB~10KB.如果此缓冲区溢出,则它将刷新到连接的另一端即客户端.这是响应的提交.客户端已经获得了响应的第一部分,通常已经代表了整个标题集,也可能是正文的一部分.

提交回复是一个不归路.服务器无法恢复已发送的字节.更改响应标头为时已晚(例如,重定向基本上由Location其中包含新URL 的标头指示),更不用说响应主体了.最好的办法是将错误信息附加到已写入的响应正文中.但这可能最终出现在一些奇怪的HTML中,因为不知道哪个HTML标签需要在那时关闭.浏览器可能无法以适当的方式呈现它.

除了避免使用getter中的业务逻辑以便在呈现响应时不抛出异常,避免已提交响应的另一种方法是将响应缓冲区大小配置为与webapp可以提供的最大页面一样大.如何做到这一点取决于服务器make/version.例如,在Tomcat中,您可以将其配置为元素的bufferSize属性<Connector>.请注意,如果您自己的代码(隐式)调用flush()响应输出流,则不会阻止刷新.