HttpServletResponse说明

基本概述

HttpServletResponse是用于将Servlet处理好的内容发送给浏览器的类,服务器通过对HttpServletResponse对象中的内容进行截取、拼接就能获得一个完整的HTTP响应信息。

参考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html

依据http协议里面讲过的响应协议格式,response对象的功能分为以下四种:

  1. 响应首行:发送状态码;
  2. 响应头:设置响应头信息;
  3. 响应体:设置响应正文;
  4. 重定向;

负责向客户端(浏览器)发送响应状态码的相关方法

void

setStatus(int sc)

Sets the status code for this response.

l  response.setStatus(200):设置状态码;

void

sendError(int sc)

Sends an error response to the client using the specified status code and clears the buffer.

void

sendError(int sc, String msg)

Sends an error response to the client using the specified status and clears the buffer.

l  response.sendError(404, “您要查找的资源不存在”):当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。

HttpServletResponse定义了很多状态码的常量(具体可以查看Servlet的API),当需要向客户端发送响应状态码时,可以使用这些常量,避免了直接写数字,常见的状态码对应的常量:

状态码404对应的常量

static int

SC_NOT_FOUND

Status code (404) indicating that the requested resource is not available.

状态码200对应的常量

static int

SC_OK

Status code (200) indicating the request succeeded normally.

状态码500对应的常量

static int

SC_INTERNAL_SERVER_ERROR

Status code (500) indicating an error inside the HTTP server which prevented it from fulfilling the request.

负责向客户端(浏览器)发送响应头的相关方法

当Servlet向客户端发送响应消息时,由于HTTP协议的响应头字段有很多种,为此,在HttpServletResponse接口中,定义了一系列设置HTTP响应头字段的方法,如表1-1所示。

表1-1      设置响应消息头字段的方法

       方法声明

功能描述

void addHeader(String name, String value)

这两个方法都是用来设置HTTP协议的响应头字段,

其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。

不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段

void setHeader(String name, String value)

void addIntHeader(String name,

int value)

这两个方法专门用于设置包含整数值的响应头。避免了使用addHeader()与setHeader()方法时,

需要将int类型的设置值转换为String类型的麻烦

void setIntHeader(String name,

int value)

void setContentLength(int len)

该方法用于设置响应消息的实体内容的大小,单位为字节。

对于HTTP协议来说,这个方法就是设置Content-Length响应头字段的值

void setContentType(String type)

该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。

例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。

需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8

void setCharacterEncoding(String charset)

该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。一般不使用。

需要注意的是,在表1-1列举的一系列方法中,addHeader()、setHeader()、addIntHeader()、setIntHeader()方法都是用于设置各种头字段的,而setContetType() 和setCharacterEncoding()方法用于设置字符编码,这些设置字符编码的方法可以有效解决乱码问题。

负责向客户端(浏览器)发送数据的相关方法

由于在HTTP响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse遵循以IO流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法,具体如下。

1.getOutputStream()方法

l  ServletOutputStream out = response.getOutputStream():获取字节流

该方法所获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用getOutputStream()方法。比如文件下载!

2.getWriter()方法

l  PrintWriter out = response.getWriter():获取字符流;

该方法所获取的字符输出流对象为PrintWriter类型。由于PrintWriter类型的对象可以直接输出字符文本内容,因此,要想输出内容全为字符文本的网页文档,需要使用getWriter()方法。

getWriter()和getOutputStream()的区别

getWriter() 用于向客户机回送字符数据

getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)

OutputStream os=response.getOutputStream();

os.write("hello,world".getBytes());

PS:通过该方法也能用getOutputStream()回送字符数据

如何选择

如果是回送字符数据,则使用  PrintWriter对象 ,效率高

如果是回送字节数据(binary date) ,则只能使用 OutputStream

注意事项

PrintWriter,OutputStream 这两个流不能同时使用

比如:

OutputStream os=response.getOutputStream();

os.write("hello,world".getBytes());

PrintWriter out=response.getWriter();

out.println("abc");

会报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

不能同时使用PrintWriter和OutputStream的原因

结论:Web服务器在完成一次service之后会自动关闭流,并销毁当前的request和response对象,故无法同时使用两个流。

重定向

参考:Servlet传递数据方式

案例:

package com.pc;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet7 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");// 演示下载文件response.setHeader("Content-Disposition", "attachment; filename=EVO_120G.jpg");    // 打开文件// 1.获取到要下载文件的全路径String path = this.getServletContext().getRealPath("/EVO_120G.jpg");// 测试System.out.println("path=" + path);// 2.创建文件输入流FileInputStream fis = new FileInputStream(new File(path));// 做一个缓冲字符数组byte buff[] = new byte[1024];int length = 0;// 3.指向response的输出流OutputStream os = response.getOutputStream();// 4.循环读出// length表示每次实际读入的字节数while((length = fis.read(buff)) != -1){os.write(buff, 0, length);}// 关闭os.close();fis.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}
}

----------参考《韩顺平.细说Servlet》

HttpServletResponse说明相关推荐

  1. HttpServletResponse对象(一)

    web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象. request和response对象既然代表请求和响应,那么我 ...

  2. HttpServletResponse,HttpServletRequest详解

    HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求 ...

  3. Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包

    转载: http://xyly624.blog.51cto.com/842520/865630/ Maven项目下HttpServletRequest 或 HttpServletResponse需引用 ...

  4. 服务器响应的生成:HTTP响应报头——HttpServletResponse接口的应用

    一,响应报头 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息 常用的响应报头 Location Content-T ...

  5. 跟小博老师一起学Servlet ——Servlet之HttpServletResponse

    2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,我们知道请求到达容器后容器会创建HttpServletRequest实例,并将请求的信息保存到实例中.在创建请 ...

  6. javaWeb学习总结(4)- HttpServletResponse

    一.简介: Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和 ...

  7. Struts2教程6:在Action类中获得HttpServletResponse对象的四种方法

    在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request.而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得H ...

  8. HttpServletrequest 与HttpServletResponse总结

    转载 http://www.cnblogs.com/liuyandeng/p/5336649.html HttpServletrequest 与HttpServletResponse总结 如果说DOM ...

  9. Servlet--05--HttpServletRequest; HttpServletResponse

    HTTP Servlet Request方法详解: 我们创建一个Request Servlet类,并使其继承HTTP Servlet类,然后重写service方法. 通过下列的各方法,我们可以获取,浏 ...

  10. javaweb学习总结(八)——HttpServletResponse对象(二)

    一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: 1 package gacl ...

最新文章

  1. oracle 树 向上查询,Oracle中显示树结构查询语句【子查父和父查子】
  2. 手工将python程序发布为exe执行程序 [转]
  3. 勒索病毒“WannaCry”复现
  4. 服务器imm口加载硬盘,ibm x3250 M4如何进IMM(远程管理口)
  5. 验证采集[Python]代理抓取并验证-多线程
  6. 数据结构----排序
  7. 如何在Java的特定范围内生成随机整数? [英]How do I generate random integers within a specific range in Java?
  8. oid 值 内存使用_JVM:对Java内存模型的理解,你还停留在面试阶段吗?
  9. 2019牛客多校第四场 A meeting
  10. 拓端tecdat|重庆住房租赁市场现状分析:解读出租房市场的数据密码
  11. gbdt 算法比随机森林容易_数据挖掘面试准备(1)|常见算法(logistic回归,随机森林,GBDT和xgboost)...
  12. 【气动学】基于matlab GUI龙格库塔算法外弹道仿真【含Matlab源码 1053期】
  13. 华为NP课程笔记14-PIM-SM和SPT切换
  14. 非度量多维标度_16s分析作图之NMDS非度量多维尺度分析
  15. 利用局域网将电脑上的文件快速下载到手机上
  16. android 一直开机画面,解决:Android模拟器一直停留在开机画面
  17. map和multimap
  18. 数据通信网络基础,华为VRP系统(HCLA-Datacom v1.0华为认证数通笔记2)
  19. 计算机图形学三维建模及灯光作业(派大星)
  20. NOPI导出数据,图片形成对比

热门文章

  1. linux 发文件被过滤的内容,linux文件过滤以及内容编辑处理
  2. JavaScript自学笔记(1)---表单验证,let和const,JSON文件
  3. 【vue-element-admin 】侧栏原始图标颜色一键指定
  4. C#LeetCode刷题之#441-排列硬币(Arranging Coins)
  5. nodejs的一些玩法
  6. 为什么作为开发人员面试完全是胡说八道
  7. 这是可用于下一个项目的React Native工具列表
  8. c语言讲输入退回缓冲区_开始之前的结束-如何不退回输入错误的用户电子邮件...
  9. linux升级openssh8.2,openssh7更换升级位8.2版本过程
  10. lms自适应滤波器实现噪声干扰的语音恢复_使用VoiceFliter-Lite改进设备上的语音识别...