Java Servlet Specification 3.0 之 The Response

Response对象封装了所有从服务器发往客户端的所有信息、通过HTTP消息头或者请求的消息体,从服务器端发到客户端传输这个信息


5.1  Buffering(缓冲作用)

           虽然servlet容器允许,但是不是必须的,由于效率来缓冲到客户端的输出。典型的一般 服务器的缓冲是默认的,但是允许servlets来指定缓冲参数。

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

               getBufferSize

               setBufferSize

               isCommitted

               reset

              resetBuffer

              flushBuffer

           ServletResponse接口提供的这些方法允许这个servlet不管使用一个ServletOutputStream或者一个Writer都能执行缓冲操作。

          

           getBufferSize方法返回使用的潜在缓冲区的大小。如果不使用缓冲区,这个方法返回0;

           

           使用setBufferSize方法,servlet可以请求一个期望的缓冲区大小。虽然分配的缓冲区不需要是servlet请求的大小,但是也必须与请求的大小一样大。这允许容器重用一组固定大小的缓冲区,如果合适地话提供一个比请求的大的缓冲区。这个方法必须在通过ServletOutputStream或者writer写入前调用。如果内容已经写入或者响应对象已经提交,这个方法将抛出一个IllegalStateException.

          

            这个isCommitted方法返回一个布尔值,指明响应字节是否返回客户端。flushBuffer方法强制缓冲区的内容写向客户端。

           

            当响应没有提交的时候,reset方法清空缓冲区中的数据。在调用reset之前,被servlet设置的消息头和状态码也必须清空。如果响应没有提交,也没有情况消息头和状态码resetBuffer方法将缓冲区的数据清空。

           

            如果响应已提交并且调用了reset或者resetBuffer方法,将抛出一个IllegalStateException异常。响应和其关联的缓冲区将不改变。

           

            当使用一个缓冲区,容器必须立即刷新已填满的缓冲区的内容,发向客户端。如果这是发向客户端的第一份数据,考虑提交响应。


5.2    Headers

             一个servlet通过以下方法设置一个HTTP响应的消息头:

                  setHeader

                  addHeader

             

             setHeader方法以一个给定的名字和值设置一个消息头。先前的消息头放置于新的消息头的后面。对于指定名字的一组消息头的值,这些值清空并用新的值替换。

      

             addHeader方法添加一个给定名字的消息头的值。如果没有这个名字关联的消息头,就创建新的一组消息头。

        

             消息头可能包含int或者Date对象的数据。HttpServletResponse接口提供了如下方法获取对应类型的数据:

                     setIntHeader

                     setDateHeader

                     addIntHeader

                     addDateHeader

            


            为了成功传输回客户端,消息头必须在响应提交前设置。如果之后设置会被servlet容器忽略。


            Servlet开发人员负责确保Content-Type消息头在响应对象中,对于Servlet生成的内容进行合适地设置。HTTP1.1规范不需要在响应对象中设置这个消息头。当开发任务不设置这个类型的时候,Servlet容器不必设置一个默认的内容类型。


            建议容器使用X-Powered-By HTTP消息头发布他的实现信息。这个字段值应该由一个或者多个实现类型组成,比如”Servlet/3.0“。作为可选地,可以在实现类型的括号内部添加潜在的Java平台和容器的添加实现。容器应该摒弃这个消息头。

           

            这里是这个消息头的例子:

            X-Powered-By: Servlet/3.0

            X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish v3 JRE/1.6.0)

 


5.3 Convenience Methods(方便的方法)

             HttpServletResponse接口提供了如下方便的方法:

                 sendRedirect

                 sendError

            

            sendRedirect方法设置合适的消息头和内容,使用一个不同的URL定向到客户端。虽然使用一个相对URL路径调用这个方法是合理的,然而,底层的容器必须将相对路径翻译为能够返回客户端的完整的合格的路径。如果给了部分URL,并且因为某些原因,不能转化一个有效的URL,那么这个方法会抛出一个IllegalArgumentException异常。

            

            sendError方法对于返回客户端的错误消息设置合适的消息体和内容体。这个方法提供一个String参数,可以在错误的内容体重的使用。

           

            如果响应对象还没有提交并中断了,这些方法提交响应的时候会有负面影响。在这些方法调用后,没有更多的输出到客户端。在这些方法调用后,数据再写到响应中,这些数据将被忽略。

           

            如果数据已经写到响应缓冲区,但是还没有返回到客户端,(即响应还没有提交),响应缓冲区的数据必须被清空并被这些方法的数据替代。如果响应提交了,这些方法将抛出一个异常IllegalStateException。


5.4    Internationalization(国际化)

              servlets应该设置一个响应的环境和字符编码。通过ServletResponse.setLocale方法设置环境,并能重复的调用。但在响应提交后,调用此方法无效。在页面提交前,Servlet没有设置环境,使用容器默认的环境来决定响应的环境,但是没有规范与一个客户端通信,比如HTTP中的Content-Language消息头。

             

<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方法能多次调用改变字符编码。但在调用servlet响应的getWriter方法或者在提交响应后,调用上述方法改变不了字符编码。调用setContentType设置字符编码仅仅在给的内容类型字符串为charset属性提供了一个值。调用setLocale方法设置字符编码仅在setCharacterEncoding或者setContentType设置字符编码之后。


如果servlet在ServletResponse接口的getWriter方法调用或者响应提交之前没有指定一个字符编码,使用默认的ISO-8859-1。


如果协议提供了以下方式,容器必须使用环境和字符编码为servlet响应的writer与客户端通信。在HTTP这种情况下,为了文本媒介类型,环境使用Content-Language消息头通信,字符编码作为Content-Type消息头的部分。注意如果servlet没有指定一个内容类型,字符编码不能通过HTTP消息头通信;然而,其仍旧使用servlet响应的writer来编码文本。


5.5 Closure of Response Object(关闭响应对象)

          当响应关闭时,容器必须立即刷新发往客户端的响应缓冲区的留下的内容。以下的事件表明servlet已经满意了请求并将关闭响应对象。

        

              Servlet的service方法的终止

             响应中的setContentLength方法指定了内容的数量比0大并且已经写入到响应中

             调用了sendError方法

             调用了AsyncContext的complete方法。


5.6 Lifetime of the Response Object(响应对象的生命周期)

       每个响应对象在一个Servlet的service方法的范围内或者过滤器的doFilter方法内部都是有效的,除非关联的请求对象时异步处理。如果开启了关联请求对象的异步模式,然后请求对象一直有效直到调用了AsyncContext。容器一般循环利用响应对象,避免创建响应对象的数量过大。开发者必须注意维护的响应对象的引用,使与之关联的请求对象的startAsync方法没有调用,如果超出了范围,将引起一个不确定的行为。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值