1. HttpServletResponse简介
Web服务器回送给Web客户端的HTTP响应消息分为三个部分:状态行,响应消息头,响应体. Servlet API中定义了ServletResponse接口用于创建响应消息,Servlet程序通过调用ServletResponse对象的方法可以向客户端回送基本的响应消息. HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息,允许操作HTTP协议相关数据,包括响应头和状态码,支持Cookies和Session跟踪. HttpServletResponse也定义了一系列用于描述各种 HTTP状态码的常量.
对于一个Servlet的每次访问请求,Servlet引擎都会创建一个用于封装HTTP请求消息的对象和一个代表HTTP响应消息的对象,然后调用此Servlet对象的service方法,并将这两个对象作为参数传递给该方法. 其中,作为参数传递进来的响应消息就是HttpServletResponse对象,在service方法内部可以调用它的各种方法来创建响应消息.
2. 产生响应状态行
HTTP响应消息的响应状态可分为三个部分:HTTP版本,状态代码和一条相关的提示信息,如下所示:
HTTP/1.1 200 OK
HttpServletResponse中定义了几个用于产生HTTP消息的响应状态行的方法和对应各个响应状态码的常量.
2.1 状态码常量
计算机里只有数值,计算机里的一切都是用数值表示的,数值可以代表任何意义,但是,如果在程序代码中直接使用数值,显然不如使用英文单词那么直观和容易记忆,即用一个英文单词定义为一个数值,在要使用到该数值的地方,用已定义的响应英文单词来替换,这些英文单词就被称之为常量.
在一般情况下使用常量来表示数值,可以使用程序代码易读易写. HTTPServletResponse中定义了若干与状态码数值对应的常量,每个常量的名称以前缀SC(State Code)开头,显然是HTTP1.1规范中所表示的状态信息的英文单词的组合,每个单词之间用下划线连接,切所有字母都大写.
2.2 常用方法
setStatus方法: 用于设置HTTP响应消息的状态码,并生成响应 状态行.
sendError方法: 用于发送表示错误信息的状态码(一般是404)
3. 构建响应消息头
HttpServletRequest和HttpServletResponse接口中定义了若干用于产生HTTP响应消息中的头字段的方法,其中,addHeader和setHander方法是两个通用的方法,可用于设置所有的的头字段. 除了这两个方法外,HttpServletResponse还定义了一些其他便利的方法,如:setContentType,setContentType,setIntHeader,setDateHeader等方法,用来设置那些常用或有日期,整数数据的响应头.
通过服务器响应给客户端一些头信息,可以让浏览器执行 一些特殊功能,例如禁止浏览器刷新,让浏览器停留几秒后刷新等.要想利用HTTP响应头字段来实现一些特殊功能,必须了解 响应头字段有哪些作用及具体用法.
3.1 常用方法
3.1.1 addHeader和setHander方法
addHeader和setHander方法都可以设置HTTP响应消息的各种头字段,他们的语法定义如下:
public void addHeader(String name,String value)
public void setHander(String name,String value)
其中的第一个参数为响应头的字段名,第二个参数为字段取值. 这两个方法都是增加一个新的头字段.其中,如果已经设置过同名的头字段,setHander方法将用新的设置值取代原来的设置值,而addHeander方法则是增加一个同名的响应头. HTTP响应消息中允许统一名称的头字段出现多次,addHeander方法正好可用于在消息头中生成要出现次数的头字段.这两个方法很简单,但要想充分有效的利用好这两个方法,还必须要好好掌握各个响应头的作用.
3.1.2 addIntHeader与setIntHeader方法
HttpServletResponse提供了两个专门用于设置包含整数值的响应头的方法,他们定义语法如下:
pubilc void addIntHeader(String name,int value)
public void setIntHeader(String name,int value)
3.1.3 addDateHeader与setDateHeander方法
HttpSerlvetResponse提供了两个专门用于设置包含日期值的响应头方法,他们定义语法如下:
public void addDateHeader(String name,Date value)
public void setDateHeader(String name,Date value)
3.1.4 setContentLength方法
setContentLength方法用于设置响应消息的响应体的大小,单位为字节. 对于HTTP协议来说,这个方法就就是设置Content-Length响应头的值.
3.1.5 setContentType方法
setContentType方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头的值.
3.1.6 setCharacterEncoding方法
此方法用于设置输出内容的编码方式,对于HTTP协议来说,就是设置HTTP-ContentType头字段中的字符集编码部分.注意:此方法比setContentType和setLocal方法的优先权高,它的设置结果覆盖setContentType和setLocal方法所设置的字符集编码.
4. 响应头的两个练习
4.1 利用响应头实现2秒后跳转页面
Http协议中定义了一个refresh头字段,用于告诉浏览器过多少秒后自动刷新页面. 在Refresh头字段的时间设置值后面还可以用分号(;)分隔后,再指定一个URL地址,这将浏览器在指定的时间值后自动去访问该URL地址指向的资源.
1. 在Servlet的service方法中写入如下代码:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("Refresh", "2;http://www.baidu.com");
}
2.然后部署到tomcat并启动服务器
3.在浏览器访问此Servlet
4.2 禁止浏览器缓存
为了提高网页的访问效率,浏览器可以在本地缓存以前访问过的页面,当路蓝旗再次访问那些已经缓存了的页面时,浏览器就不用再去请求远程服务器了,而直接从本地读取出来展示就可以了. 缓存提高了浏览器访问效率,但有时也会带来负面效果,那就是服务端的内容变化不能被实时反应到客户端,因此就需要手动禁止浏览器缓存. 有三个响应头都可以禁止浏览器缓存,如下:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("Expires", "0");
resp.setHeader("cache-control", "no-catch");
resp.setHeader("pragma", "no-catch");
}
由于不是所有浏览器都能完全支持上面这三个响应头,因此最好是同时使用上面的三个响应头,只要浏览器能支持其中任何一种,就能可靠的禁止浏览器缓存当前页面.
5. 使用meta标签模拟响应消息头
利用HTTP消息的响应头字段, 可以让浏览器完成各种有用的功能, 但是, 这需要通过编写 Web服务器端的程序来实现。 如果不会服务器端编程的普通HTML 页面制作者也想借助HTTP 消息的响应头字段来实现一些特殊功能,他们该怎么办呢?为此, HTML语言中专门定义了<meta>标签的 http-equiv属性来在HTML 文档中棋拟HTTP响应消息头,当浏览器读取到 HTML 文档中具有 http-equiv属性的<meta>标签时,它会用与处理 Web服务器发送的响应消息头一样的方式来进行处理。这样,静态HTML页面的制作者不用编写 Web服务器端的程序, 就可以在静态HTML 页面中实现HTTP 响应消息头的功能了 。例如, 如果不想让浏览器缓存一个内容经常要被更新的静态HTML页面, 那么可以在它的<head></head>标签对之间增加如下三条<meta>语句:
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>