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传递参数. 你可能自己 ...
随机推荐
- 应用控制台应用程序开发批量导入EXEL程序。
一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了.每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行 ...
- hadoop使用笔记
一:hadoop程序添加三方包: 使用hadoop jar 运行时 抛出 java.lang.NoClassDefFoundError 原因:找不到三方包 解决方案: 1.可以将需要使用的包添加进 $ ...
- Rotate Array leetcode
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- java aes encrypt
本次使用aes 对称加密算法. 选用aes的原因是,可以还原加密串. 程序如下: public static String encode(String content){ KeyGenerator k ...
- Intellij Idea自动加载改动文件和自动自动热部署加载
1:准备原料 我的Intellij Idea的版本是15. 之后tomcat自动加载修,你只需要在浏览器刷新一下页面即可. ************************************** ...
- 【G】开源的分布式部署解决方案文档 - 使用手册
G.系列导航 [G]开源的分布式部署解决方案 - 导航 已知问题 导航没有联动 因为权限只是做了基础的登录校验,考虑到后面导航要跟权限关联上暂时是写死的. 只有部分界面使用了Vue.js 因为刚开始没 ...
- kvm的sshd起不来
同事不知道在一台KVM虚拟机执行了chmod -R 777 / 将更目录中的所有文件的权限都改为777,重启该虚拟机之后发现该虚拟机登不上去了,来找我,我尝试重启了几次虚拟机之后,发现总是可以被pi ...
- Spring MVC 处理异常的3种方式
使用Spring MVC开发的博客网站时,遇到了如何处理业务层抛出的异常的问题,查阅到了spring官方博客-spring MVC中异常的处理,以下将会以登录模块为示例. 愚蠢的处理方式 处理异常遵循 ...
- java里的日期时间
为了更好理解java的日期时间类,在这里我们先介绍一下关于历法.标准时间的一些概念. 历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏 ...
- .net core 持续构建简易教程
环境需求:jenkins和.netcore 由于jenkins在真机上的部署比较麻烦,所以在这里我使用基于jenkins的Docker,只要任何一台运行docker的环境都可以进行以下的操作. doc ...