购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 响应

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

2.4.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,响应及它关联的缓冲区将保持不变。

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

2.4.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平台的补充信息,以下是设置该头的示例。

2.4.3 方法

HttpServletResponse提供了以下简便的方法。

·sendRedirect

·sendError

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

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

如果响应已经提交并终止,这两个方法将对提交的响应产生副作用。调用这两个方法后,Servlet将不会产生到客户端的后续输出,如果有数据继续写到响应,则这些数据将被忽略。如果数据已经写到响应的缓冲区,但没有返回客户端(如响应没有提交),则响应缓冲区中的数据必须被清空,并使用由这两个方法设置的数据替换。如果响应已提交,则必须抛出IllegalStateException。 xl6wz92uVhPCLxrRTVTNPUyxJxVJ4EX21XVOuv+b+mIQBU7It8G4xrrntJug1Nl1

点击中间区域
呼出菜单
上一章
目录
下一章
×