Servlet 2.4 规范之第六篇:响应
响应对象封装了服务端返回给客户端的所有信息。在HTTP协议中,这些信息通过HTTP头和消息体传送。
SRV.5.1 缓冲
出于效率考量,servlet容器可以缓冲输出数据,但这并非强制要求。常见的WEB服务都会默认使用缓冲,但也允许servlet自行指定缓冲参数。
ServletResponse接口的以下几个方法用于servlet访问和设置缓冲信息:
• getBufferSize
• setBufferSize
• isCommitted
• reset
• resetBuffer
• flushBuffer
这些方法用于servlet在使用ServletOuputStream或Writer时进行对应的缓冲操作。
getBufferSize方法返回被使用的缓冲大小。若未使用缓冲,该方法必须返回0。
servlet也可以通过setBufferSize方法设置一个缓冲大小,它不一定等于servlet请求的大小,但至少必须大于所请求的大小。这样一来容器可以重用固定大小的缓冲集,以提供更大的缓冲空间。这个方法必须在ServletOuputStream或Writer输出任何内容之前调用,否则该方法就会抛出IllegalStateException。
isCommitted方法返回一个代表响应字节流是否已被送往客户端的boolean值。flushBuffer方法强制把缓冲中的所有内容立即送往客户端。
reset方法用于清理未提交响应的缓冲数据,同时它也会清理Headers和状态码信息。resetBuffer方法只会把未提交响应的缓冲数据清理掉,Headers和状态码信息则会保持不变。
如果响应数据都已提交了才调用reset或resetBuffer方法,那必须抛出IllegalStateException异常。响应数据和关联的缓冲此时也不会发生改变。
使用缓冲时,缓冲一满容器必须立刻发送缓冲区的数据到客户端。若这是送往客户端的唯一数据,那这个响应就算提交完成了。
SRV.5.2 Headers
servlet可以通过HttpServletResponse接口的以下方法设置HTTP响应头:
• setHeader
• addHeader
setHeader方法用给定的名值对设置头信息,旧的会被新的头信息替换。如果一个名下存在多个值的集合,那么这些值都会被清理然后被给定的新值替代。
addHeader方法为给定的名字添加一个头的值。如果没有,就会创建新的。
Headers可能包含int或Date型数据。HttpServletResponse接口的下述便捷方法允许servlet使用正确的数据格式设置头信息:
• setIntHeader
• setDateHeader
• addIntHeader
• addDateHeader
为了成功传回客户端信息,响应被提交之前必须设置好所有的头信息。否则头信息会被servlet容器忽略掉。
servlet开发人员负责确保响应对象的Content-Type头信息被正确设置。HTTP 1.1协议并不需要在响应中设置头信息。当开发人员没有设置对应的Content-Type时,servlet容器也并不需要设置一个默认的Content type。
建议容器使用X-Powered-By HTTP头去发布它的实现信息。这个字段值应该由一个或多个实现类型构成,像“Servlet/2.4”等。可选的,容器和java平台的应用信息也可以添加在实现类型后边的括号里。容器应该可以配置成支持这些头信息。
举例如下:
X-Powered-By: Servlet/2.4
X-Powered-By: Servlet/2.4 JSP/2.0 (Tomcat/5.0 JRE/1.4.1)
SRV.5.3 便捷方法
HttpServletResponse接口有以下两个便捷方法:
• sendRedirect
• sendError
sendRedirect方法用于设置合适的头信息和内容体然后重定向客户端到不同的URL下,这个URL路径必须是当前相关的路径,同时当前容器必须把这个路径翻译成对应的全路径然后传回客户端。如果某个URL无法转换成可用的URL,这个方法就必须抛出IllegalArgumentException异常。
sendError方法用于设置合适的头信息和包含错误信息的内容体并返回客户端。可选的字串参数可以用于这个方法的错误信息。
上述方法反过来也会影响响应信息的提交,如果响应未被提交就终止的话。这些方法被调用之后就不会再有输出送给客户端,如果这些方法已调用了,任何试图送往客户端的响应都会被忽略。
如果数据存入缓冲尚未送给客户端,那么这些数据就会被清理掉并用上述方法产生的新数据替换掉。如果响应已提交,上述方法调用时必须抛出IllegalArgumentException异常。
SRV.5.4 国际化
servlet应该设置locale和响应信息的字符编码,locale通过ServletResponse.setLocale方法设置。这个方法可以重复调用,但响应一旦提交就不再产生任何影响。如果servlet未设置locale,容器会检测响应的locale并提供默认值,但没有对应的规范而言,例如:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>ja</locale>
<encoding>Shift_JIS</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
如果这些元素属性不存在或未提供映射,setLocale方法使用容器对应的映射关系。setCharacterEncoding、setContentType和setLocale方法能重复调用以改变字符编码。但getWriter方法一旦被调用或响应信息已提交,这些方法就不会再起效。setLocale方法必须用在setCharacterEncoding或setContentType之前。
如果servlet未指定字符编码或响应已提交之后才指定,那么默认使用ISO-8859-1编码格式。
如果客户端的请求协议中指明了需要的字符编码,那容器必须按照指定的编码格式处理响应信息。在HTTP协议中,locale通过Content-Language信息头来指定,字符编码会作为Content-Type的一部分指定。
SRV.5.5 响应对象的结束
当响应被关闭时,容器必须立刻清理缓冲中的所有响应内容并送往客户端。以下事件指明了servlet满足请求和响应对象被关闭的条件:
1. servlet的service方法结束。
2. 写到响应信息中的内容等于setContentLength方法指定的内容大小。
3. 调用了sendError方法。
4. 调用了sendRedirect方法。
SRV.5.6 响应对象的生命周期
每一个响应对象仅在当前servlet的service方法域内可用,或者在过滤器的doFilter方法域内可用。容器通常会自动回收响应对象以避免过多创建响应对象造成的性能问题。开发人员必须意识到响应对象的作用域之外引用该对象的话很可能会造成难以名状的行为或问题。
文档信息
- 译者:张大爷
- 原文网址:http://www.cnblogs.com/flance/
- 版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
Servlet 2.4 规范之第六篇:响应的更多相关文章
- Servlet 2.4 规范之第七篇:过滤器
过滤器是一套java组件,用于在请求—>资源—>应答的这一过程中即时转换处理负载和头信息. 本章讲述了Servlet 2.4 API中一些类和方法,这些类和方法提供了一套轻量级框架用于过滤 ...
- Servlet 2.4 规范之第五篇:请求
request对象封装了来自客户端的所有请求信息.在HTTP协议中,客户端发给服务端的所有信息都是通过request对象的请求头和请求体来传送的. SRV.4.1 HTTP协 ...
- Servlet 2.4 规范之第四篇:Servlet上下文
SRV.3.1 ServletContext接口说明 ServletContext接口定义了运行servlet的web应用中和servlet相关的视图信息.容器提供者负责提供ServletCon ...
- Servlet 2.4 规范之第三篇:Servlet生命周期
SRV.2.3 Servlet生命周期 servlet有着定义良好且明确的生命周期,它定义了servlet以怎样的方式加载和实例化.初始化.怎样处理客户端请求.以及怎样停止服务.生命周期 ...
- [老老实实学WCF] 第六篇 元数据交换
老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- 解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions (译) http://improve.dk/avoiding-regressions-in-orcamdf-b ...
- JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】
原文地址:http://blog.csdn.net/hills/article/details/40896357 JBoss和Tomcat版本.及Servlet.JSP规范版本对应一览 JBossAS ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
随机推荐
- (转)iOS平台UDID方案比较
苹果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的获取给堵上了.没办法,毕竟人家是老大,说不让你用,你也没办法. 在这边总结一下现有的一部分 ...
- stm32独立看门狗实验
//ALIENTEK Mini STM32开发板V1.9范例代码5//独立看门狗实验//正点原子@ALIENTEK//技术论坛:www.openedv.com STM32F103RBT6属于中容量版本 ...
- Monkeyrunner 简介及其环境搭建
Monkeyrunner是通过坐标.控件ID和控件上的文字操作应用的界面元素,其测试用例是用python写的,这样就弥补了monkey只有简单命令无法执行复杂用例的缺陷.Monkeyrunner采用的 ...
- HDU 5468 Puzzled Elena 莫比乌斯反演
题意: 给出一棵树,每个点上有权值.然后求每棵子树中与根节点互质( \(gcd(a, b) = 1\) )的节点个数. 分析: 对于一颗子树来说,设根节点的权值为\(u\), \(count_i\)表 ...
- CodeForces 568B DP Symmetric and Transitive
题意: 根据离散数学的内容知道,一个二元关系是一个二元有序组<x, y>的集合. 然后有一些特殊的二元关系,比如等价关系,满足三个条件: 自反性,任意的x,都有二元关系<x, x&g ...
- 【Netty】NIO框架Netty入门
Netty介绍 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...
- iOS关于Xcode上的Other linker flags
Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等.还记得我们在学习C程序的时候,从C代码到 ...
- python算法-汉诺塔问题
汉诺塔问题 初始状态: 思考:当盘子的个数是3的时候,大家写出移动顺序 移动的步骤: 3个盘子,从a到c 1.前面两个盘子,从a到b 1)把前面一个盘子,从a到c a->c 2)把第二个盘子 ...
- 【JavaScript】关于 eval()执行JavaScript语句的一次实验测试
实验主题: eval() 函数可以计算某个字符串,并执行其中的 JavaScript 代码.该函数只接受原始字符串作为参数,如果 string 不是原始字符串,那么该方法将不作任何的改变的返回.因此请 ...
- Python hash、xml、configparser、sheve、shutil模块讲解 以及 面向对象初识
今日内容: 1.hash模块2.xml模块3.configparser模块4.sheve 模块5.shutil模块 知识点一:hash什么是hash: hash是一种算法,该算法接受传入的的内容,经过 ...