轻量级Java EE企业应用开发实战
上QQ阅读APP看书,第一时间看更新

3.6 响应

响应对象封装了从服务器返回客户端的所有信息。在HTTP协议中,这些信息包含在从服务器传输到客户端的HTTP头信息或响应的消息体中。

3.6.1 缓冲

出于性能的考虑,Servlet容器允许(但不要求)从缓存中输出内容到客户端。一般情况下,服务器是默认执行缓存的,但也允许Servlet来指定缓存参数。

下面是ServletResponse接口允许Servlet来访问和设置缓存信息的方法:

  • getBufferSize
  • setBufferSize
  • isCommitted
  • reset
  • resetBuffer
  • flushBuffer

无论Servlet使用的是一个ServletOutputStream还是一个Writer,ServletResponse接口提供的这些方法都允许执行缓冲操作。getBufferSize方法返回使用的底层缓冲区大小。如果没有使用缓冲,该方法就必须返回一个Int值0。Servlet可以请求setBufferSize方法来设置一个最佳的缓冲大小。isCommitted方法返回一个表示是否有任何响应字节已经返回到客户端的boolean值。flushBuffer方法强制刷出缓冲区的内容到客户端。当响应没有提交时,reset方法用来清空缓冲区的数据。头信息、状态码和在调用reset之前Servlet调用getWriter或getOutputStream设置的状态也必须被清空。如果响应没有被提交,resetBuffer方法就清空缓冲区中的内容,但不清空请求头和状态码。

如果响应已经提交并且reset或resetBuffer方法已被调用,就必须抛出IllegalStateException,响应及它关联的缓冲区将保持不变。

当使用缓冲区时,容器必须立即刷出填满的缓冲区内容到客户端。

3.6.2 头

Servlet可以通过下面HttpServletResponse接口的方法来设置HTTP响应头:

  • setHeader
  • addHeader

setHeader方法通过给定的名字和值来设置头。前面的头会被后来新的头替换。如果已经存在同名的头集合的值,集合中的值就会被清空并用新的值替换。

addHeader方法使用给定的名字添加一个头值到集合。如果没有头与给定的名字关联,就创建一个新的集合。头可能包含表示Int或Date对象的数据。以下HttpServletResponse接口提供的方法允许Servlet对适当的数据类型用正确的格式设置一个头:

  • setIntHeader
  • setDateHeader
  • addIntHeader
  • addDateHeader

为了成功地传回给客户端,头必须在响应提交前设置。响应提交后的头设置将被Servlet容器忽略。

Servlet开发人员负责保证为Servlet生成的内容设置合适的响应对象的Content-Type头。HTTP/1.1规范中没有要求在HTTP响应中设置此头。当Servlet程序员没有设置该类型时,Servlet容器也不能设置默认的内容类型。

容器使用X-Powered-By HTTP头发布其实现信息,其字段值应包含一个或多个实现类型,例如Servlet / 4.0。还可以在括号内(实现类型之后)添加容器和底层Java平台的补充信息,当然补充信息是可选地。以下是设置“X-Powered-By”HTTP头的示例:

3.6.3 方法

HttpServletResponse提供了如下简便的方法:

  • sendRedirect
  • sendError

sendRedirect方法将设置适当的头和内容体将客户端重定向到另一个地址。使用相对URL路径调用该方法是合法的,但是底层的容器必须将传回到客户端的相对地址转换为全路径URL。无论出于什么原因,如果给定的URL是不完整的,且不能转换为一个有效的URL,那么该方法必须抛出IllegalArgumentException。

sendError方法将设置适当的头和内容体用于给客户端返回错误消息。可以使用sendError方法提供一个可选的String参数用于指定错误的内容体。

如果响应已经提交并终止,这两个方法将对提交的响应产生负向作用。这两个方法调用后,Servlet将不会产生到客户端的后续输出。这两个方法调用后,如果有数据继续写到响应,这些数据就会被忽略。

如果数据已经写到响应的缓冲区,但没有返回到客户端(例如,响应没有提交),响应缓冲区中的数据就必须被清空并使用这两个方法设置的数据替换。如果响应已提交,这两个方法就必须抛出IllegalStateException。