JavaWeb开发之HttpServletResponse
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>
JavaWeb开发之HttpServletResponse的更多相关文章
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
HttpServletRequest获取请求头信息 (1)获取客户机请求头 String getHeader(String name) Enumeration<String> getHe ...
- JavaWeb开发之Servlet
1. Servlet有关概念和前置知识 1.1 什么是动态网页 如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面. 动态网 ...
- JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)
JSTL JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用: 提供给Java Web开发者一个标准通用的标签函数库 和E ...
- JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用
Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...
- JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...
- javaweb开发之jsp
一.WEB应用的目录结构 通常我们是在IDE中创建web应用程序,IDE自动为我们实现了WEB的目录结构,下面来看如何徒手创建一个WEB程序. 首先来看一下Tomcat自带的一个web应用的目录结构 ...
- Javaweb开发之路
本文作者:DavidLin 欢迎转载,但请保留文章原始出处→_→ 本文地址:http://www.cnblogs.com/univeryinli/p/programming-skill-yinli.h ...
- javaweb开发之get与post请求的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
随机推荐
- Jquery之JSON的用法
今天讲了Jquery里面JSON的用法,下面是今天讲课给的例子: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" &quo ...
- 咖啡师之路:第一日一杯Espresso
代码敲累了.产品要发布了.熬夜啊加班啊. 精神完全不在状态. 咋办--- 咋办--- 咋办---! 来一杯Espresso浓缩咖啡.各位码农,码神们的必备良品! 咖啡每天要2-3杯,不管是速溶还是现磨 ...
- gulp折腾日记——gulp-livereload
大家好,虽然在博客园注册了很长一段时间,但我还没在博客园写过博客,这是在博客园的第一篇博客,希望能养成每周写博客的好习惯 O(∩∩)O~~) 今天要聊得是gulp的一个实时刷新的插件gulp-live ...
- struts.xml语法
<!-- 1. struts.xml配置常量, 用来覆盖struts.properties中的默认常量配置 一般情况下, 这个配置放在struts.xml中, 不要放在各个模块的xml中. co ...
- MD5加密 32位
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; ...
- 浅谈jquery插件开发模式
首先根据<jQuery高级编程>的描述来看,jQuery插件开发方式主要有三种: 通过$.extend()来扩展jQuery 通过$.fn 向jQuery添加新的方法 通过$.widget ...
- Levenshtein distance 编辑距离
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符 实现方案: 1. 找出最长 ...
- Spring还使用基于 JSR-250 注释,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释
@PostConstruct 和 @PreDestroy 注释: 你可以使用 @PostConstruct 注释作为初始化回调函数的一个替代,@PreDestroy 注释作为销毁回调函数的一个替代,其 ...
- matplotlib根据Y轴数量伸缩画图的py脚本
#coding:utf-8import numpy as npimport matplotlib.pyplot as plt #X,Y轴数据y = [20,59,11,12,16,20,15,12,1 ...
- C++—引用的作用
引入 C语言中函数有两种传参的方式: 传值和传址.以传值方式, 在函数调用过程中会生成一份临时变量用形参代替, 最终把实参的值传递给新分配的临时变量即形参. 它的优点是避免了函数调用的副作用, 确无法 ...