`
sailor90
  • 浏览: 10404 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Servlet Specification V2.4——SRV.5 The Response

阅读更多

SRV.5 The Response

response对象封装了用来从server返回client的所有信息。根据HTTP协议,这些信息通过HTTP header和request的message body两者中的任意一个从server传送至client。

 

 

SRV.5.1 Buffering

        Servlet container允许为了提高效率而缓冲发送至client的output,但不是必须的。一般情况下,server默认启用buffering,但允许servlet制定buffering参数。
        以下来自ServletResponse接口的方法允许servlet存取buffering信息:

  • getBufferSize
  • setBufferSize
  • isCommitted
  • reSet
  • resetBuffer
  • flushBuffer

        这些方法由ServletResponse接口提供,用来执行buffering操作,不管servlet使用的是ServletOutputStream还是Writer。
        getBufferSize方法返回当前缓冲使用的大小。如果没有使用buffering,该方法返回0(int型)。
        Servlet可以通过setBufferSize方法设置一个首选的缓冲大小。分配的缓冲不一定要和servlet默认的大小一样,但至少要等于默认大小。这样才可以使container可以重用整套的固定大小的缓冲,提供比要求的更大的缓存,如果需要的话。setBufferSize方法必须在使用ServletOutputStream或者Writer写任何内容之前被调用。如果由任何内容已经被写入或者response对象已经被提交,这个方法就会抛出IllegalStateException。
        isCommitted方法通过返回一个boolean值来表明是否有response字节已经被返回给客户端。flushBuffer方法将缓冲中的内容强制发送给客户端。
        如果response没有被commit,reSet方法可以清除buffer中的数据。servlet在reSet方法被调用前set的headers和status codes也一定会被清除。resetBuffer方法也会清除buffer中的内容,如果response没有被提交的话,resetBuffer不会清除headers和status code。
        如果response被commit后reset方法或者resetBuffer方法被调用,IllegalStateException会被抛出。Response和与它关联的buffer将不会产生变化。
        当使用了缓冲时,container一定会立即把已经装满的缓存的内容flush到client。If this is the first data is sent to the client, the response is considered to be committed

 

 

SRV.5.2 Headers

Servlet可以通过以下的HttpServletResponse接口的方法设置HTTP response的headers:

  • setHeader
  • addHeader

        setHeader方法使用给定的name和value来set header。之前的header会被新的header替换,当header集合中出现了相同的name时,新value会替代原value。
        addHeader方法使用给定的name和value来add header。如果没有header与指定的name相关联,就创建一个新的集合。
        Headers可以以int或者Date行对象存储数据。下面的HttpServletResponse接口的便利的方法允许servlet通过正确的格式来set a header:

  • setIntHeader
  • setDateHeader
  • addIntHeader
  • addDateHeader

        为了成功地回传给client,headers必须在response被commit之前set。在response提交后被set的headers会被servlet container忽略。
        Servlet程序员有责任确保response对象中的Content-Type header被正确地设置,为了由servlet生成的内容。HTTP 1.1规范中并没有要求这个header必须被set到HTTP response中。如果servlet程序员没有set这个type,Servlet container一定也不会设置一个默认的content type。
        一般来说,containers被推荐使用X-Powered-By HTTP header来发布它的实现信息。这个字段的值应当由一个或多个implementation type组成,比如“Servlet/2.4”。还有一些可选的补充信息可以通过小括号被追加到implementation type。The container should be configurable to suppress this header.
        这里有一些header的例子:

  • X-Power-By: Servlet/2.4
  • X-Power-By: Servlet/2.4 JSP/2.0 (Tomcat/5.0 JRE/1.4.1)

 

 

SRV.5.3 Convenience Methods

以下是HttpServletResponse提供的接口:

  • sendRedirect
  • sendError

        sendRedirect方法会恰当地设置headers和content body,来redirect client到一个不同的URL,必须以相对URL路径调用此方法,然而,底层的container必须将相对路径翻译成完整的合法的URL,以便回传至client。如果传入了不完整的URL,不管什么原因,不能被转换成合法的URL的话,方法就会抛出IllegalArgumentException。
        sendError方法会恰当地设置headers和content body,以便返回给client一个错误信息。sendError方法有一个可选的String类型的参数,可以用在error的content body里面。
        如果response还没有被commit的话,这些方法会使response commit掉,并且终止response。在这些方法被调用以后,servlet不会再输出任何东西到client。如果数据数据在这些方法被调用后写入response,它们会被忽略。
如果数据已经被写入response缓冲,但没有return、到client(response没有被commit),response 缓冲里的数据一定会被清除并且被这些方法set的数据替换。如果response被commit了,这些方法会抛出IllegalStateException。

 

 

SRV.5.4 Internationalization

        servlet应该被设置locale和response字符编码。Locale使用ServletResponse.setLocale方法设置。此方法可以重复调用;但是response提交后调用无效。如果servlet没有在页面被提交前set locale,container会启用自身的默认locale以决定response的locale,但不生成任何关于与client交互的说明 ,比如Content-Language header,如果是HTTP的话。

        见图SRV.5.4-1.png

        如果元素没有出现或者没有提供一个映射,setLocale方法会使用container依赖的映射。setCharacterEncoding,setContentType和setLocale方法可以被重复调用来改变字符编码。在servlet response的getWriter方法已经被调用或者在response被commit后调用这些方法不会对字符编码产生任何作用。调用setContentType方法设置字符编码,只有在给定的content type string 为字符集属性提供了一个值的情况下才有效。调用setLocale方法设置字符编码,只有在setCharacterEncoding方法或者setContentType都没有被使用来设置了字符编码的情况下才有效。
        如果servlet没有在ServletResponse接口的getWriter方法被调用之前或者response被提交之前指定一个字符编码,那么会使用默认的ISO-8859-1。
        Container必须通过发送给client的servlet response的writer来与locale和字符编码通讯,如果启用的协议提供了这么做的方式。在HTTP的情况下,locale通过Content-Language header传达,字符编码则作为文本媒体类型的Content-Type header的一部分。需要注意的是,在servlet没有设定content-type的情况下,字符编码不能通过HTTP header被传达;然而,它仍被用于通过servlet response的writer来编码输入的文本。

 

 

SRV.5.5 Closure of Response Object

当response关闭时,container必须立即flush发往client的response的buffer中所有剩余的content。以下事件表明servlet已经满足了request的要求并且response对象即将关闭:

  • servlet的service方法的终止
  • responses的setContentLength方法设置的content的总长度已经被写到response
  • sendError方法被调用
  • sendRedirect方法被调用

 

 

SRV.5.6 Lifetime of the Response Object

        每个response对象都只在servlet的service方法范围内有效,或者在filter的doFilter方法范围内。一般来说,container为了避免创建response对象对性能的额外开销影响而回收response对象。开发者必须注意的是,在上述范围之外维持response对象的引用可能导致不可预测的行为。

  • 大小: 8.6 KB
2
1
分享到:
评论

相关推荐

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    Python双语言混合开发 中go语言版 mxshop_goods-srv.sql

    VSuite.Ramdisk.Srv.Setup 永久试用XX版

    首先很高兴VSuite.Ramdisk.Srv.Setup.4.6.7531.1240总算win 64位系统上实现永久使用了,虽然离完美破解还是很遥远,但是值得庆贺,特此说明: 1、64位系统较32位难破解原因主要在于数字签名上,由于rxvstor.sys是...

    srv蓝屏解决补丁

    标题中的“srv蓝屏解决补丁”指的是针对服务器运行过程中出现的蓝屏问题,特别是由于srv.sys驱动程序导致的问题,而提供的一种修复解决方案。在Windows操作系统中,srv.sys是服务子系统的主要驱动程序,它负责处理...

    Java™ Servlet 规范.

    专家组成员 ........................................................................................................................................................5 答谢 .................................

    Primo.Ramdisk.Srv.Mui.Setup.5.6.0

    Primo Ramdisk(VSuite Ramdisk II) 内存虚拟硬盘软件 使用内存模拟出超快速的硬盘,突破系统IO瓶颈,飞速提升计算机性能 Primo Ramdisk软件的主要功能是通过独特的软件算法将物理内存模拟成一个超快速的硬盘,在这个...

    Primo.Ramdisk.Srv.Mui.5.6.

    安装Primo Ramdisk Srv Mui 5.6.0的过程相对简单,用户只需运行"Primo.Ramdisk.Srv.Mui.Setup.5.6.0.exe"这个安装文件,按照向导指示操作即可。值得注意的是,为了激活软件,可能需要使用到"PrDSrv56crk.reg"这个...

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240 win 64 永久试用XX版

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240是一款专为Windows 64位操作系统设计的内存虚拟磁盘软件。该版本为永久试用的XX版,允许用户在一定时间内无限制地体验其功能。Ramdisk技术是一种将计算机的RAM(随机存取内存...

    PrimoCache.Srv.Mui.Setup.3.0.2.rar PrimoCache server 3.02 服务器版,中文版,64位

    PrimoCache 是一款可以将物理内存、SSD 硬盘或闪存盘等虚拟成硬盘缓存的软件,它可以自动将硬盘中读取的数据存入物理内存等速度较快的设备,当系统再次需要该数据时它可以很快从缓存设备中读取,而无需再次访问速度...

    VSuite.Ramdisk.Srv.Setup.zip 服务器版

    VSuite.Ramdisk.Srv.Setup.zip VSuite+Ramdisk+.Crack.By.XLTH.rar 包含配置文件

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240服务器版

    VSuite.Ramdisk.Srv.Setup.4.6.7531.1240是一款专为服务器设计的内存虚拟硬盘软件,它充分利用了服务器内存的高速性来创建临时的虚拟硬盘,以此提升数据的读写速度并减轻对物理硬盘的磨损。这款工具的核心理念在于将...

    srv.exe 空连接接开telnet

    嘿嘿。ipc入侵里开telnet需要用的srv 个人收集来的。。奉上

    srv.cpp.tar.gz_Server

    标题中的“srv.cpp.tar.gz_Server”表明这是一个与服务器端编程相关的项目,主要涉及C++语言,因为源代码文件“srv.cpp”通常代表C++程序。这个压缩包包含了一个名为“srv.cpp”的文件,我们可以推断这可能是服务器...

    srv.rar_srv

    标题中的“srv.rar_srv”可能是指一个压缩包文件,其中包含了一个名为“srv”的服务器端程序。这个程序基于socket编程,用于实现简单的通信服务。在IT领域,socket编程是网络编程的基础,它允许两个或多个应用程序...

    History_07_Srv.txt

    History_07_Srv.txt

    srv.rar_聊天工具

    【标题】"srv.rar_聊天工具" 涉及的核心知识点是聊天工具的服务器端开发,其中使用了winsock编程技术。Winsock是Windows操作系统中的一个API,它为应用程序提供了网络通信的能力,使得开发者能够创建基于TCP/IP协议...

    SAS94_09P3PC_70068130_Win_X64_Wrkstn_Srv.txt

    SAS9.4,sid码更新日期到2020年5月30日。 sas工具9.4版本,的sid更新代码,直接把begin里的内容做替换 或者直接使用renewsas进行更新

    srv.rar_srv_服务端 DELPHI_服务端集合

    《srv.rar_srv_服务端 DELPHI_服务端集合》是一个综合性的资源包,主要针对的是使用DELPHI开发服务端应用的初学者。这个压缩包包含了一系列与srv服务端相关的材料,旨在帮助用户理解srv服务端的工作原理,并提供...

    Primo.Ramdisk.Srv.Mui.Setup.6.3.1.zip

    压缩包中的Primo.Ramdisk.Srv.Mui.Setup.6.3.1.exe是主安装程序,用户可以通过运行这个文件来安装Primo Ramdisk的服务器版。该程序集成了服务器端的所有功能,包括动态分配内存、设置内存盘大小、配置启动项等,使得...

    tac_plus_srv.zip

    tac_plus_srv.zip服务器源码。ubuntu下解压安装,方法都在对应的文档中

Global site tag (gtag.js) - Google Analytics