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>

 

转载于:https://www.cnblogs.com/wqh17/p/6429498.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值