servlet2.3规范之五——响应

来源:互联网 发布:linux 最大文件打开数 编辑:程序博客网 时间:2024/06/05 14:17

 

5 响应

response对象封装所有从服务器要返回给客户端的所有信息。在HTTP协议中,这些信息从服务器传输给客户端,可以是HTTP header,也可以请求消息体。

 

5.1 缓冲

允许但不要求servlet容器出于效率考虑对发送给客户端的输出进行缓冲。通常进行缓冲的服务器会默认,但是允许servlet指定缓冲参数。

 

ServletResponse接口的下列方法允许servlet访问和设置缓冲信息:

 

getBufferSize

setBufferSize

isCommitted

reset

resetBuffer

flushBuffer

 

ServletResponse接口提供的这些方法允许执行缓冲操作,无论servlet是使用ServletOutputStream还是Writer

 

getBufferSize方法返回正在使用的底层缓冲大小。如果没有正在使用的缓冲,该方法必须返回int0

 

servlet可以使用setBufferSize方法来请求一个希望的缓冲大小。分配的缓冲不要求是servlet请求的大小,但是不能比所请求的小。这使得容器可以使用一组规定大小的缓冲,如果合适的话提供更大的缓冲。该方法必须在使用ServletOutputStreamWriter输出内容之前调用。如果已经有内容输出,该方法将抛出IllegalStateException异常。

 

isCommitted方法返回一布尔值,指出是否已经有响应字节返回给客户端。flushBuffer方法强制缓冲中的内容输出到客户端。

 

reset方法在响应未被提交时清空缓冲中的数据,并且reset调用之前,必须同时清空由servlet设置的header和状态码。resetBuffer方法则只在响应未被提交时清空缓冲内容,而不清空header和状态码

 

如果响应已提交,并且调用了resetresetBuffer方法,则必须抛出IllegalStateException异常。响应和相关缓冲不作修改。

 

当使用缓冲时,一旦缓冲填满,容器必须立即将缓冲内容刷新给客户端。如果这是发送给客户端的第一批数据,响应就被认为已提交。

 

5.2 Header

servlet可以通过HttpServletResponse接口的下列方法设置HTTP响应的header

 

setHeader

addHeader

 

setHeader方法使用指定名称和值来设置header,原header被新header所替换。如果存在该名称的一组header值,那么这些值被清空,并用新值来替换。

 

addHeader方法使用指定的名称向集合中添加header值。如果还没有该名称的header,则创建一组新的。

 

header可以包含表示int或者Date对象的数据。HttpServletResponse接口的下列便捷方法允许servlet使用对应数据类型的正确格式来设置header

 

setIntHeader

setDateHeader

addIntHeader

addDateHeader

 

要成功地传送回客户端,必须在响应提交之前设置header。在提交之后设置header会被servlet容器忽略。

 

servlet编程人员负责确保servlet生成内容时,response对象中正确设置了Content-Type headerHTTP 1.1规范不要求在HTTP响应中设置header。如果servlet编程人员没有设置该类型,servlet容器不可以设置默认内容类型。

 

5.3 便捷方法

HttpServletResponse接口提供下列便捷方法:

 

sendRedirect

sendError

 

sendRedirect方法将设置合适的header与内容体,将客户端重定向到另一个URL。使用相对URL路径调用该方法是合法的,不过底层容器必须将相对路径转换成全限定URL,返回给客户端。如果给出的是URL片段,并且因为某种原因不能转换成有效的URL,那么该方法必须抛出IllegalArgumentException异常。

 

sendError方法将设置合适的header错误信息内容体,返回给客户端。可以给sendError方法提供一个可选的字符串参数,用于显示错误内容体。

 

如果响应还没有提交的话,这两个方法将提交响应,并且终止响应。在这些方法调用之后servlet不会再向客户端输出。如果有数据在这些方法调用之后输出到响应,那么将忽略这些数据。

 

如果数据已经被输出到响应缓冲,但是还没有返回给客户端(也就是响应未提交),那么响应缓冲中的数据必须被清空,用这些方法所设置的数据来替换。如果响应已提交,那么这些方法必须抛出IllegalStateException异常。

 

5.4 国际化

当客户端以特定语言请求一个文档,或者设置了语言偏好时,servlet将使用ServletResponse接口的setLocale方法设置响应的语言属性。该方法必须正确地设置Content-Language header(和HTTP/1.1规范描述的其他机制一样),以准确地将Locale通知给客户端。

 

开发人员最好是在调用ServletResponse接口的getWriter方法之前,调用setLocale方法。这将确保返回的PrintWriter已经正确地配置了目标Locale

 

注意如果使用一个指定内容类型的charset组件调用setContentType,将在调用setLocale之前重写该组值。

 

如果servlet程序员未指定,响应编码默认为“ISO-8859-1

 

5.5 Response对象的关闭

当响应关闭后,容器必须立即刷新客户端响应缓冲中保留的所有数据。下列事件表示servlet已经满足请求,并且响应对象将被关闭:

 

• servletservice方法终止。

• responsesetContentLength方法指定的内容大小已经输出到响应。

调用了sendError方法。

调用了sendRedirect方法

 

5.6 Response对象的生命周期

每一个response对象只在servletservice方法作用域,或者filterdoFilter方法作用域内有效。容器通常循环response对象以避免response对象创建所引起的性能开销。开发人员必须认识到在上述的作用域之外对response对象进行引用可能会导致无法预期的后果。

 
原创粉丝点击