首页 > 编程 > JSP > 正文

Servlet&jsp基础:第二部分

2019-11-14 23:00:16
字体:
来源:转载
供稿:网友
Servlet&jsp基础:第二部分声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.VEVb.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.VEVb.com/jiangzhengjun/p/4289271.html

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

image007

产生响应状态行

HTTP响应消息分为三们部分:状态行、响应消息头、消息实体。

HTTP状态常量

HttpServletResponse定义了若干与HTTP响应状态码对应的常量,以SC(Status Code)开头。

setStatus(int sc)

响应状态行:HTTP版本+状态代码+提示信息

HTTP/1.1 200 OK

用于设置HTTP响应消息的状态码,并生成响应状态行。正常情况下的响应码为200,Web服务器默认自动

产生这种正常情况下的响应状态行,所以,通常情况下的Servlet不需要调用该方法来指定状态代码和产生响应状态行。只有在HTTP响应消息中使用特殊的状态码时,才需要调用这个方法

sendError

sendError(int sc)

sendError(int sc, java.lang.String msg)

用于发送表示错误信息的状态码(如404,找不到资源)。msg用于提示说有出错的原因,该文本信息将出现在发送给客户端的正文本内容中,注,该消息不是用来替换HTTP响应状态行中提示信息的,它只是出现在实体部分。

response.sendError(405,"xxxxx"); 返回的响应状态行如下:

HTTP/1.1 405Method Not Allowed

构建响应消息头addHeader与setHeader

http://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与setIntHeader

addIntHeader(java.lang.String name, int value)

setIntHeader(java.lang.String name, int value)

与addHeader与setHeader不同的是它们传进的值可以直接是一个整数值。一般很少用这两个方法,使用前面两个完全一样。

response.setHeader("Refresh", "2"); 响应头加上了Refresh头如下:

Refresh: 2

注,头的值一般不会使用双引号引起来的。

addDateHeader与setDateHeader

addDateHeader(java.lang.String name, long date)

setDateHeader(java.lang.String name, long date)

这两个方法专门用于设置包含日期值的响应头的方法。HTTP响应头中的日期通常都是GMT格式。它们避免了将毫秒数转换成GMT格式时间的麻烦。

setContentLength

setContentLength(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

setCharacterEncoding

setCharacterEncoding是在2.4规范中新增的方法。用于设置输出内容的MIME声明中的字符集编码,对于HTTP来说,即设置Content-Type头字段中的字符集编码部分。

注,如果没有设置Content-Type头字段,该方法的设置的编码不会出现在响应头中(因为实体内容的编码方式只能存放在在Content-Type的后部分),但是它的设置结果仍然决定了输出内容的编码方式(即直接使用out内置对象输出字符串时会采用该方法设置的编码方式,当然如果使用的是response.getOutputStream时,就谈不上编码方式了,因为OutputStream输出不涉及到流)。另外,该方法的比setContentType和setLocale方法的优先权高,它的设置会覆盖这两个方法所设置的字符集编码。

setLocale

setLocale(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>

containsHeader

boolean 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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表