HttpServletResponse说明
HttpServletResponse说明
基本概述
HttpServletResponse是用于将Servlet处理好的内容发送给浏览器的类,服务器通过对HttpServletResponse对象中的内容进行截取、拼接就能获得一个完整的HTTP响应信息。
参考文档:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html
依据http协议里面讲过的响应协议格式,response对象的功能分为以下四种:
- 响应首行:发送状态码;
- 响应头:设置响应头信息;
- 响应体:设置响应正文;
- 重定向;
负责向客户端(浏览器)发送响应状态码的相关方法
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说明相关推荐
- HttpServletResponse对象(一)
web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象. request和response对象既然代表请求和响应,那么我 ...
- HttpServletResponse,HttpServletRequest详解
HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求 ...
- Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包
转载: http://xyly624.blog.51cto.com/842520/865630/ Maven项目下HttpServletRequest 或 HttpServletResponse需引用 ...
- 服务器响应的生成:HTTP响应报头——HttpServletResponse接口的应用
一,响应报头 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息 常用的响应报头 Location Content-T ...
- 跟小博老师一起学Servlet ——Servlet之HttpServletResponse
2019独角兽企业重金招聘Python工程师标准>>> 通过前面的学习,我们知道请求到达容器后容器会创建HttpServletRequest实例,并将请求的信息保存到实例中.在创建请 ...
- javaWeb学习总结(4)- HttpServletResponse
一.简介: Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和 ...
- Struts2教程6:在Action类中获得HttpServletResponse对象的四种方法
在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request.而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得H ...
- HttpServletrequest 与HttpServletResponse总结
转载 http://www.cnblogs.com/liuyandeng/p/5336649.html HttpServletrequest 与HttpServletResponse总结 如果说DOM ...
- Servlet--05--HttpServletRequest; HttpServletResponse
HTTP Servlet Request方法详解: 我们创建一个Request Servlet类,并使其继承HTTP Servlet类,然后重写service方法. 通过下列的各方法,我们可以获取,浏 ...
- javaweb学习总结(八)——HttpServletResponse对象(二)
一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: 1 package gacl ...
最新文章
- oracle 树 向上查询,Oracle中显示树结构查询语句【子查父和父查子】
- 手工将python程序发布为exe执行程序 [转]
- 勒索病毒“WannaCry”复现
- 服务器imm口加载硬盘,ibm x3250 M4如何进IMM(远程管理口)
- 验证采集[Python]代理抓取并验证-多线程
- 数据结构----排序
- 如何在Java的特定范围内生成随机整数? [英]How do I generate random integers within a specific range in Java?
- oid 值 内存使用_JVM:对Java内存模型的理解,你还停留在面试阶段吗?
- 2019牛客多校第四场 A meeting
- 拓端tecdat|重庆住房租赁市场现状分析:解读出租房市场的数据密码
- gbdt 算法比随机森林容易_数据挖掘面试准备(1)|常见算法(logistic回归,随机森林,GBDT和xgboost)...
- 【气动学】基于matlab GUI龙格库塔算法外弹道仿真【含Matlab源码 1053期】
- 华为NP课程笔记14-PIM-SM和SPT切换
- 非度量多维标度_16s分析作图之NMDS非度量多维尺度分析
- 利用局域网将电脑上的文件快速下载到手机上
- android 一直开机画面,解决:Android模拟器一直停留在开机画面
- map和multimap
- 数据通信网络基础,华为VRP系统(HCLA-Datacom v1.0华为认证数通笔记2)
- 计算机图形学三维建模及灯光作业(派大星)
- NOPI导出数据,图片形成对比
热门文章
- linux 发文件被过滤的内容,linux文件过滤以及内容编辑处理
- JavaScript自学笔记(1)---表单验证,let和const,JSON文件
- 【vue-element-admin 】侧栏原始图标颜色一键指定
- C#LeetCode刷题之#441-排列硬币(Arranging Coins)
- nodejs的一些玩法
- 为什么作为开发人员面试完全是胡说八道
- 这是可用于下一个项目的React Native工具列表
- c语言讲输入退回缓冲区_开始之前的结束-如何不退回输入错误的用户电子邮件...
- linux升级openssh8.2,openssh7更换升级位8.2版本过程
- lms自适应滤波器实现噪声干扰的语音恢复_使用VoiceFliter-Lite改进设备上的语音识别...