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方法域内可用。容器通常会自动回收响应对象以避免过多创建响应对象造成的性能问题。开发人员必须意识到响应对象的作用域之外引用该对象的话很可能会造成难以名状的行为或问题。

文档信息

Servlet 2.4 规范之第六篇:响应

时间: 2024-09-30 04:33:20

Servlet 2.4 规范之第六篇:响应的相关文章

Servlet 2.4 规范之第四篇:Servlet上下文

SRV.3.1    ServletContext接口说明 ServletContext接口定义了运行servlet的web应用中和servlet相关的视图信息.容器提供者负责提供ServletContext的一套具体实现.通过ServletContext对象,servlet能记录事件.获得资源引用,以及设置和保存当前context上其他servlet的一些属性信息. ServletContext以web应用的某一路径为根节点,例如,servlet上下文能写成http://www.mycorp.

Servlet 2.4 规范之第七篇:过滤器

过滤器是一套java组件,用于在请求—>资源—>应答的这一过程中即时转换处理负载和头信息. 本章讲述了Servlet 2.4 API中一些类和方法,这些类和方法提供了一套轻量级框架用于过滤动态和静态内容.它讲述了web应用下如何配置过滤器.指定过滤器的实现类. servlet过滤器的API会在SRV.14的“javax.servlet”章节提供,而其配置语法会在SRV.13章“部署描述符”的语法中讲解.读者阅读本章的同时也应该参考下对应的章节内容. SRV.6.1    什么是过滤器 过滤器是

Servlet 2.4 规范之第四篇:Servlet上下文最注坐卒揍琢

http://www.ebay.com/cln/1vz_jbnv/2015-01-30/166653198017 http://www.ebay.com/cln/ntx_ntnd/2015-01-30/166918113011 http://www.ebay.com/cln/pt3_hzzh/2015-01-30/166764520010 http://www.ebay.com/cln/r5d_thbr/2015-01-30/166738785014 http://www.ebay.com/cl

Servlet 2.4 规范之第一篇:概览

      写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还请各位海涵并留言纠正.       SRV.1.1    Servlet是什么? Servlet是一种用于生成动态内容的Java Web组件技术,由容器(Container)负责管理其生命周期.和Java领域的其他技术一样,Servlet被编译为平台中立的class文件,然后动态的载入并运行在Web serv

Servlet 2.4 规范之第二篇:Servlet接口

Servlet接口是Servlet API的最核心抽象类.所有的servlets都直接实现了这个接口,或者以更通用的方式继承了这个接口的实现类.Servlet API自带了两个实现了Servlet接口的类:GenericServlet和HttpServlet.绝大多数情况下,开发人员都会继承HttpServlet来开发servlets. SRV.2.1    处理请求的方法 Servlet接口定义了一个service方法来处理客户端请求.servlet容器把每一个请求都路由到对应的Servlet

[老老实实学WCF] 第六篇 元数据交换

原文:[老老实实学WCF] 第六篇 元数据交换 老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个终结点上建立通道从而进行通信.我们通过手写代码(或配置)的方式为服务端编写了元数据信息,没有借助元数据交换就实现了通信.然而在实际应用中,元数据往往是很多的,而且重复编写元数据的工作也是不值得的,因此必然会用到元数据交换的方式让客户端获取元数据,本篇我们就来进一步了解一下元数

ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

Python之路【第六篇】:socket

Python之路[第六篇]:socket Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭