HttpServletResponse应用 的 简单介绍

HttpServletResponse是专门用于HTTP协议的ServletResponse接口,它用于封装HTTP响应消息,允许操控HTTP协议相关数据,包括响应头和状态码,支持Cookies和session跟踪,HttpServletResponse也定义了一系列用于描述各种HTTP状态码的常量。

WEB服务器回送给WEB客户端的HTTP响应消息分为三部分,状态行、响应消息头 和 消正文(也叫实体内容)。

***WEB响应消息的响应状态行可分为三部分:http版本、状态代码和一条相关的提示信息,如:HTTP/1.1 200 OK

HttpServletResponse中定义了几个用于产生HTTP消息的响应状态行的方法和对应各个响应状态码的常量。***

  • 状态码常量:略;
  • setStatus(int
    status)方法:用于设置HTTP响应消息的状态码,并生成响应状态行。由于响应状态行中的状态描述信息直接与状态码相关,而 HTTP
    版本由服务器确定,因此,只要通过 setStatus(int
    status)方法设置了状态码,即可实现状态行的发送。需要注意的是,在正常情况下,Web 服务器会默认产生一个状态码为 200 的状态行。
  • sendError(int sc)方法:该方法用于发送表示错误信息的状态码。例如,404
    状态码表示找不到客户端请求的资源。response 对象提供了两个重载的 sendError(int sc)方法,具体如下: public
public void sendError(int code) throws java.io.IOException 
  public void sendError(int code,String message)throws java.io.IOException

在上面重载的两个方法中,第一个方法只发送错误信息的状态码,而第二个方法除了发送状态码以外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。


Servlet 向客户端发送的响应消息中包含响应头字段,由于 HTTP 协议的响应头字段有很多种,因此,HttpServletResponse 接口定义了一系列设置 HTTP 响应头字段的方法


方法声明功能描述
void addIntHeader(String name,int value)这两个方法都是用于设置 HTTP 协议的响应头字段。其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响 应头字段的值。不同的是,addHeader() 方法可以增加同名的响应头字段(HTTP响应消息中允许同一名称的头字段出现多次),而 setHeader() 方法则会覆盖同名的头字段
void setIntHeader(String name, int value)
void addIntHeader(String name,int value)这两个方法专门用于设置包含整数值的响应头,避免了使用 addHeader() 与 setHeader() 方法时需要将 int 类型的设置值转换为 String 类型的麻烦
void setIntHeader(String name, int value)
void addDataHeader(String name,long date)这两个方法专门用于设置包含日期值的响应头,HTTP响应头中的日期通常都为GMT格式,避免了以毫秒为单位的长整数转换为GMT时间串的麻烦
void setDataHeader(String name, long date)
void setContentLength(int len)设置响应中内容主体的长度。在HTTP servlet中,此方法设置HTTP Content-Length标头。参数:len-一个整数,指定要返回给客户端的内容的长度;设置Content-Length标头
void setContentType(String type)该方法用于设置 Servlet 输出内容的 MIME 类型,对于 HTTP 协议来说,就是设置 Content-Type 响应头字段的值。例如,如果发送到客户端的内容是 jpeg 格式的图像数据,就需要将响应头字段的类型设置为 image/jpeg。需要注意的是,如果响应的内容为文本,setContentType() 方法还可以设置字符编码,如 text/html;charset = UTF-8
void setLocale (Locale loc)该方法用于设置响应消息的本地化信息。对 HTTP 来说,就是设置 Content-Language 响应头字段和 Content-Type 头字段中的字符集编码部分。需要注意的是,如果 HTTP 消息没有设置 Content-Type 头字段,则 setLocale() 方法设置的字符集编码不会出现在 HTTP 消息的响应头中,如果调用 setCharacterEncoding() 或 setContentType() 方法指定了响应内 容的字符集编码,则 setLocale() 方法将不再具有指定字符集编码的功能
void setCharacterEncoding(String charset)该方法用于设置输出内容使用的字符编码,对 HTTP 协议来说,就是设置 Content-Type 头字段中的字符集编码部分。如果没有设置 Content-Type 头字段,则 setCharacterEncoding 方法设 置的字符集编码不会出现在 HTTP 消息的响应头中。setCharacterEncoding() 方法比 setContentType() 和 setLocale() 方法的优先权高,它的设置结果将覆盖 setContentType() 和 setLocale() 方法所设置的字符码表
*此外containsHeader方法用于检查某个名称的头字段是否已经被设置。*

响应头消息的实用案例

  • Servlet的中文输出问题:浏览器接收到的中文字符并不是中文符号本身,它是某种字符集编码数据。同一中文字符可以用多种字符编码,而浏览器也要使用相应的字符集编码才能显示。浏览器显示网页文档时采用的字符集编码可以通过手工方式设置们也可在HTTP响应消息的Content-Type头字段中指定。作为网站开发人员,应避免让客户手动设置浏览器显示网页所采用的字符编码,这个通过调用setContentType方法就能实现(例如response.setContentType(“text/html;chaeset=GB2312”))。
  • 让浏览器定时舒心网页或跳转至其他网页:HTTP协议中定义了一个Refresh头字段,用于高速浏览器多少秒后自动刷新页面。在这个设置值后加分号(;)分隔再指定一个URL地址,就能跳过去访问URL地址的资源了。
    response.setHeader(“Refresh”,“2;URL=…”).
  • 禁止浏览器缓存当前文档内容:有三个HTTP响应头字段都可以禁止浏览器缓存当前页面,事例如下:
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
  • 使用标签模拟响应消息头:HTML语言中专门定义了标签的http-equiv属性来在HTML文档中模拟HTTP响应消息头

发送响应消息体相关的方法

发送响应消息体相关的方法
由于在 HTTP 响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse 遵循以 I/O 流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法。
1)getOutputStream() 方法
该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOutputStream是OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。
2)getWriter() 方法
该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。
注意1:虽然 response 对象的 getOutputStream() 和 getWriter() 方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生 IllegalStateException 异常。
注意2:虽然Servlet的sercice方法结束后,Servlet引擎会检查这两个方法返回的输出流对象有没有调用close方法,没有会帮忙调一下,但是作为Servlet开发人员最好还是把close方法加上,以便尽快释放相关资源。
3)输出缓存区
Servlet程序输出的HTTP消息的响应正文不是直接发送到客户端,而是首先被写入到了Servlet引擎提供的输出缓存区中,这个缓存区就跟个蓄水池似地,要等被填满或者Servlet程序写完了所有响应内容,缓存区的内容才会被发送到客户端。
setBufferSize方法: 设置期望的输出缓冲区大小
getBufferSize方法: 返回Servlet引擎实际使用的缓冲区大小
flushBuffer方法: 将输出缓冲区内容强制输出到客户端
reset方法: 清空输出缓存区的内容
isCommitted方法: 判断是否提交到了客户端
4)实现动态文件内容下载:当要下载的文件不是真正存在与WEB服务器的文件系统中,而是需要用一个Servlet程序临时在服务器内存中动态产生后再传送到客户端。
servlet程序必须告诉浏览器其所输出的内容的类型不是普通文本文件或者HTML文件,而是一个淘宝村到本地的下载文件,这就需要HttpServletResponse.setContentType方法来设置Content-Type头字段的值为浏览器无法使用某种方式活着激活某种程序来处理的MIME类型,例如"application/octet-stream";
通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名";
因为附件可以是各种文件类型文件,需将附件文件内容传至客户端,其中内容当作二进制处理,所以当调用HttpServletResponse.getOutputStream方法返回的ServletOUtputStream对象来想客户端写入附件内容
5)图像访问计数器:统计和显示页面的访问次数是一个常见的WEB应用,因为在网页每次被访问时,页面的访问次数都要发生改变,所以这个功能必须通过服务器端的程序来实现。具体内容:略;

请求重定向与请求转发

  1. 在Servlet程序中,有时需要调用另外一个资源来对浏览器的请求进行响应,这可以通过两种方式实现:其中一种是调用RequestDispatcher.forward方法实现的请求转发,另一种是调用HttpServletResponse.sendRedirect方法实现的请求重定向。1)1)1)1)RequestDispatcher接口:在Servlet
    API中定义的接口,它定义了RequestDispatcher实例对象的方法
    RequestDispatcher接口中定义了两个方法:forward方法和include方法,分别用于将请求转发到RequestDispatcher对象封装的资源
    和 将RequestDispatcher对象封装进资源作为当前响应内容的一部分包含进来。
    ServletContext接口中定义了获取RequestDispatcher对象的方法:getRequestDispatcher方法、getNameDispatcher方法,具体略。
  2. 用include方法进行包含:略
  3. 用forward方法实现请求转发:略
  4. 请求转发与请求重定向的比较
    RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect
    方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
    如果传递给HttpServletResponse.sendRedirect
    方法的相对URL以“/”开头,它是相对于服务器的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
    调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward
    方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
    HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
    RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动站应该尝试百度MIP的五个原因

MIP 是什么?MIP 是百度在 2016 年提出的移动网页加速器项目。 MIP 能做什么?MIP 能帮助站长和网站开发者快速搭建移动端页面。 MIP 怎么加速?MIP 从前端渲染和页面网络传输两方面进行优化,杜绝页面渲染中的阻塞问题,…

Vim从理解到应用

1991 年,来自荷兰的一名工程师 Bram Moolenaar 为了在他的Amiga计算机上复制Vi的功能,正式发布 了Vim的第一个版本。在当时无论谁也没想到,这款软件未来能在技术圈爆发出那么大的威力,为千千万万的工程师节省了无数时间&#xff0…

如何用百度MIP快速搭建体验友好的移动页面

在读这篇文章之前,请确定你已经了解 MIP 定义及加速原理。如果不确定的话,可以到 MIP 官网了解。 改造前期准备和注意事项: 你可以选择直接将原先的移动站点直接改成 MIP 站,也可以单独再做一套 MIP 站点与移动站并存。 复杂的页面暂不建议…

JAVA知识基础(一):数据类型

在我们学习一门编程语言时,最先要了解的就是数据类型,而数据类型又都是抽象的概念,初学者理解起来比较困难,所以我们往往是先应用再理解,但是在本篇文章我决定用先理解再应用的方式尝试一下,试试效果。 1、…

百度MIP移动页面加速——不只是CDN

MIP 是用 CDN 做加速的么?准确答案是:是,但不只是。 MIP 全称 Mobile Instant Pages,移动网页加速器,是百度提出的页面加速解决方案。MIP 从前端渲染和页面网络传输两方面进行优化,杜绝页面渲染中的阻塞问…

JAVA知识基础(二):基本语法

本篇主要介绍JAVA的运算符、循环结构以及条件结构。 1、JAVA运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言的Java也提供了一套丰富的运算符来操纵变量。 JAVA运算符可以大致概括为几类:算术运算符、关系运算符、位运算符、逻辑运…

JAVA知识基础(三):修饰符

JAVA中根据修饰对象的不同可以分为类修饰符、方法修饰符、变量修饰符三类,其中每种修饰符又可以单独分成两类:访问修饰符和非访问修饰符。为了便于理解,本文以访问和非访问的角度展开。 1、访问修饰符 访问修饰符有四个:public、…

百度推出新技术 MIP,网页加载更快,广告呢?

MIP 项目在 2016 年年初正式发布,帮助移动页面加速(原理)。内测数据表明,MIP 页面在 1s 内加载完成。现在已经有十多家网站加入 MIP 项目,有更多的网站正在加入中。在MIP收到的反馈中,大部分都提到了广告的…

JAVA知识基础(四):深入理解static关键字

1、static存在的主要意义 static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法! static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方…

MIP改造常见问题二十问

在MIP推出后,我们收到了很多站长的疑问和顾虑。我们将所有疑问和顾虑归纳为以下二十个问题,希望对大家理解 MIP 有帮助。 1、MIP 化后对其他搜索引擎抓取收录以及 SEO 的影响如何? 答:在原页面 MIP 化,不会影响其它搜…

Nginx(零):背景

我们今天开始对Nginx的学习,本来是打算第一篇就是基础知识介绍的,但是我感觉在学习一个新知识之前总应该知道,我们为什么要学习它,学习它的意义何在吧!所以我加了背景这一篇作为Nginx开始学习的标志。 1、Nginx的诞生…

Nginx(一):概念基础

上一篇我们介绍了Nginx的背景,现在我们就要开始正式对Nginx的学习了。本篇我们将对Nginx的基本定义进行介绍,了解Nginx到底是什么。然后我们会介绍Nginx最基本的三个概念:反向代理、负载均衡、动静分离。 1、Nginx是什么 Nginx(“engine x”…

MIP 官方发布 v1稳定版本

近期,MIP 官方发布了 MIP 系列文件的全新 v1 版本,建议开发者尽快完成升级。 一、 我是开发者,如何升级版本? 对于 MIP 页面开发者来说,* 只需替换线上引用的 MIP 文件为 v1 版本 *,就可以完成升级。所有…

百度MIP页规范详解 —— canonical标签

百度 MIP 的规范要求必须添加强制性标签 canonical&#xff0c;不然 MIP 校验工具 会报错&#xff1a; 强制性标签 <link rel"/^(canonical)$/"> 缺失或错误 这个标签怎么写&#xff1f;又是干什么用的呢&#xff1f; ** 简单来说&#xff0c;canonical 标签…

Nginx(二):安装、配置、常用命令

1、Nginx在Linux操作系统中的安装 这里简单介绍一下nginx的安装了 1.1、前期准备 在安装nginx之前我们要提前准摆好它的编译工具以及库文件&#xff1a;zlib、poenssl。 还有有让Nginx支持Rewrite功能的PCRE. 安装的途径有很多可以参考&#xff1a;https://www.runoob.com/lin…

JAVA知识基础(五):深入理解final关键字

1.final 关键字 final关键字主要用在三个地方&#xff1a;变量、方法、类。 final修饰变量&#xff1a;final修饰一个类时&#xff0c;表明这个类不能被继承。final修饰方法&#xff1a;final修饰方法&#xff0c;方法不可以重写&#xff0c;但是可以被子类访问 【前提&#…

CMS模板应用调研问卷

截止目前&#xff0c;已经有数十家网站与我们合作&#xff0c;进行了MIP化改造&#xff0c;在搜索结果页也能看到“闪电标”的出现。除了改造方面的问题&#xff0c;MIP项目组被问到最多的就是&#xff1a;我用了wordpress&#xff0c;我用了织梦cms&#xff0c;怎么改MIP呢&am…

Nginx(三):反向代理

我们本篇将通过两个实例进行对Nginx反向代理的学习。 1、概念基础 反向代理&#xff0c;其实客户端对代理是无感知的&#xff0c;因为客户端不需要任何配置就是可以访问。我们只需要将请求发送到反向代理服务器上&#xff0c;有反向代理服务器去选择目标服务器获取数据后&…

VIP站长大会(北京站)常见问题解答

功能支持问题 1. react 能否和 MIP 结合使用&#xff0c;如果暂时不能以后是否有考虑&#xff1f;是否会和其他 JavaScript 框架 (比如 Angular ) 结合 ? 目前暂无计划支持。 2. MIP 页是否支持自定义 cookie? 实现 登录、统计、广告等功能 ? <mip-cookie>组件正在…

Nginx(四):负载均衡Load balancing

1、概念基础 Load balancing&#xff0c;即负载均衡&#xff0c;是一种计算机技术&#xff0c;用来在多个计算机&#xff08;计算机集群&#xff09;、网络连接、CPU、磁盘驱动器或其他资源中分配负载&#xff0c;以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避…