HttpServletResponse. 20
产生响应状态行... 20
HTTP状态常量... 20
setStatus(int sc)20
sendError21
构建响应消息头... 21
addHeader与setHeader21
addIntHeader与setIntHeader21
addDateHeader与setDateHeader22
setContentLength. 22
setContentType. 22
setCharacterEncoding. 22
setLocale. 23
containsHeader23
响应头的应用... 23
让浏览器定时刷新网页或跳转到其他页面... 23
禁止浏览器缓存当前文档内容... 24
使用<meta>标签模拟响应消息头... 24
创建响应正文... 24
getOutputStream与getWriter方法... 24
输出缓冲区... 25
文件下载... 27
<img>动态图像... 28
请求转发与请求重定向... 30
RequestDispatcher接口... 30
用include方法实现资源包含... 32
输出静态内容时默认Servlet所采用的流分析... 33
用forward方法实现请求转发... 34
RequestDispatcher.forward方式应用细节... 35
用sendRedirect方法实现请求重定向... 38
请求重定向(sendRedirect)与请求转发(forward)的区别... 39
HttpServletResponse产生响应状态行HTTP响应消息分为三们部分:状态行、响应消息头、消息实体。
HTTP状态常量HttpServletResponse定义了若干与HTTP响应状态码对应的常量,以SC(Status Code)开头。
setStatus(int sc)响应状态行:HTTP版本+状态代码+提示信息
HTTP/1.1 200 OK
用于设置HTTP响应消息的状态码,并生成响应状态行。正常情况下的响应码为200,Web服务器默认自动
产生这种正常情况下的响应状态行,所以,通常情况下的Servlet不需要调用该方法来指定状态代码和产生响应状态行。只有在HTTP响应消息中使用特殊的状态码时,才需要调用这个方法
sendErrorsendError(int sc)
sendError(int sc, java.lang.String msg)
用于发送表示错误信息的状态码(如404,找不到资源)。msg用于提示说有出错的原因,该文本信息将出现在发送给客户端的正文本内容中,注,该消息不是用来替换HTTP响应状态行中提示信息的,它只是出现在实体部分。
response.sendError(405,"xxxxx"); 返回的响应状态行如下:
HTTP/1.1 405Method Not Allowed
构建响应消息头addHeader与setHeaderhttp://www.ietf.org/rfc/rfc2047.txt
addHeader(java.lang.String name, java.lang.String value)
setHeader(java.lang.String name, java.lang.String value)
如果已经设置过同名的响应并没有,setHeader方法将用新的设置值取代原来的设置值,而addHeader方法则是增加一个同名的响应头。HTTP响应消息中允许同一名称的头字段出现多次。
addIntHeader与setIntHeaderaddIntHeader(java.lang.String name, int value)
setIntHeader(java.lang.String name, int value)
与addHeader与setHeader不同的是它们传进的值可以直接是一个整数值。一般很少用这两个方法,使用前面两个完全一样。
response.setHeader("Refresh", "2"); 响应头加上了Refresh头如下:
Refresh: 2
注,头的值一般不会使用双引号引起来的。
addDateHeader与setDateHeaderaddDateHeader(java.lang.String name, long date)
setDateHeader(java.lang.String name, long date)
这两个方法专门用于设置包含日期值的响应头的方法。HTTP响应头中的日期通常都是GMT格式。它们避免了将毫秒数转换成GMT格式时间的麻烦。
setContentLengthsetContentLength(int len)
setContentLength方法用于设置响应消息的实体内容的大小,单位为字节。对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值。因为浏览器与Web服务器之间使用持久(Keep-alive的HTTP连接,如果Web服务器没有采用chunked传输编码方式,那么它必须在每个应答中发送一个Content-Length的响应头来表示各个实体内容的长度,以便客户端能够分辨出上一个响应内容的结束位置。一般来说,Setvlet程序不必调用setContentLength方法来设置Content-Length头字段,因为Servlet引擎在向客户端实际输出响应内容时,它可以自动设置Content-Length头字段或采用chunked传输编码方式。
setContentType设置响应实体的MIME类型,即对Content-Type头的设置。如响应的实体为jpeg图片,则需要将响应内容的类型设置为“image/jpeg”;如果是xml,则要设置为“text/xml”。
页网的类型通常是“text/html”,所以如果以是Servlet程序的方式输出网页内容,则需要显试地调用setContentType方法来指定,否则响应头中不存在Content-Type并没有,那么浏览器会将内容以“text/plain”内型来解释,即以原文本的形式展示。当然如果请求的资源不是Servlet,比如是xx.html,则Web容器会根据你请求的资源的文件的扩展外来在conf/web.xml找相应的已配置的MIME类型,然后自动加上这个头信息,并设置成相应的MIME类型。
在MIME类型后面还可以指定响应内容所使用的字符集类型,如,“text/html; charset=GB2312”,如果没有指定,在Tomcat5.x产生的响应头的MIME类型后默认为ISO8859-1的字符集编码,而Tocmat4.x将不会自动加上。
注,一般charset全小写,但有的厂商是charSet
setCharacterEncodingsetCharacterEncoding是在2.4规范中新增的方法。用于设置输出内容的MIME声明中的字符集编码,对于HTTP来说,即设置Content-Type头字段中的字符集编码部分。
注,如果没有设置Content-Type头字段,该方法的设置的编码不会出现在响应头中(因为实体内容的编码方式只能存放在在Content-Type的后部分),但是它的设置结果仍然决定了输出内容的编码方式(即直接使用out内置对象输出字符串时会采用该方法设置的编码方式,当然如果使用的是response.getOutputStream时,就谈不上编码方式了,因为OutputStream输出不涉及到流)。另外,该方法的比setContentType和setLocale方法的优先权高,它的设置会覆盖这两个方法所设置的字符集编码。
setLocalesetLocale(java.util.Locale loc)
用于设置响应消息的本地化信息,对HTTP来说,它将设置Content-Language响应头和Content-Type头中的字符集编码部分。如果没有设置Content-Type头,该方法设置的字符集不会出现在响应头中(因为实体内容的编码方式只能存放在在Content-Type的后部分),但是它的设置仍然决定了输出内容的编码方式(即直接使用out内置对象输出字符串时会采用该方法设置的编码方式,当然如果使用的是response.getOutputStream时,就谈不上编码方式了,因为OutputStream输出不涉及到流)。
注,如果调用了setCharacterEncoding或setContentType方法已指定了响应内容的字符集,则该方法将不再起效。
由于Local对象中只包含了语言和国家的地区信息,并没有包含字符集编码的信息,所以需要在web.xml中来配置:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>zh_CN</locale>
<encoding>GB2312</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
containsHeaderboolean containsHeader(java.lang.String name)
containsHeader用于检查某个名称的头是否已经被设置
响应头的应用让浏览器定时刷新网页或跳转到其他页面// response.setHeader("Refresh", "2");
response.setHeader("Refresh", "2;URL=ServletContextTest");
// response.setHeader("Refresh","2;URL=http://localhost:8080/myapp/ServletContextTest");
禁止浏览器缓存当前文档内容有三个HTTP响应头可以禁止浏览器缓存当前页面:
response.setDateHeader("Expires", 0);
response.setHeader("PRagma","no-cache");
response.setHeader("Cache-Control","no-cache");
不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头,只要浏览器能支持其中任何一种形式,就能禁止缓存页面。
使用<meta>标签模拟响应消息头上面我们是通过response内置对象来设置响应头的,这只能在Servlet与jsp里使用,如果编写的是静态的html时,我们如果要设置响应消息头,则只能借助于html标签<meta>的http-equiv属性来实现。
<meta http-equiv="Expires"content="0">
<meta http-equiv="Pragma"content="no-cache">
<meta http-equiv="Cache-Control"content="no-cache">
在静态的HTML里我们一般显示地设置页面的编码方式:
<meta http-equiv="Content-Type"content="text/html; charset=GB2312">
注,如果在Servlet或Jsp页面里使用了<meta>来设置编码方式,而又使用也服务器端的设置方式,则以服务器方式的为准,也就是以响应头里的Content-Type信息为准。
创建响应正文getOutputStream与getWriter方法ServletOutputStreamgetOutputStream() throws java.io.IOException
java.io.PrintWritergetWriter() throws java.io.IOException
ServletOutputStream为OutputStream的子类。
getOutputStream返回的是字节流,不涉及到编码
getWriter返回的是字符流,涉及编码方式
这两个方法互相排斥,调用了其中任何一个方法后,就不能再调用另一方法。在Servlet里写以下两行:
Word-spacing: 0px; text-transform: none; word-break: normal; margin: 0cm 0cm 0pt; letter-spacing: normal; line-heig
新闻热点
疑难解答