HttpServletResponse
在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应头、响应体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应头、响应体的方法。
响应行: 协议版本 状态码 状态描述
常用的状态码:
- 200:成功
- 302:重定向,需要和一个响应头
- 304:访问缓存
- 404:客户端错误
- 500:服务器错误
响应头: key:value; 这个value可以有多个
一个key对应一个value
一个key对应多个value
常用的响应头
- Refresh:定时跳转
- Location:重定向(地址)
- Content-Disposition:设置文件下载时候的头
- Content-Type:设置响应内容的MIME类型
响应体
API简介之设置响应码
// response.setStatus(404);
// response.sendError();
// response.setStatus(302);
// // 指定重定向的地址
// response.setHeader("Location", "http://www.baidu.com");
// 一行代码实现上面两行代码的功能
response.sendRedirect("http://www.baidu.com");
API简介之设置响应头
// 生成的头信息 : refresh: 3;url=http://www.baidu.com
// 3:代表3秒后跳转到一个新的页面
// url : 中的值代表的就是要跳转的页面
response.setHeader("refresh", "3;url=http://www.baidu.com");
// 设置响应内容的类型.客户端就知道发送过来的内容是什么类型的数据,使用对应的方式去解析数据
response.setContentType("");
API简介之设置响应体
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 编码格式不一致导致的
// ISO-8859-1 Tomcat默认的码表
// 指定了输出的内容使用什么码表进行编码.但是客户端不知道用什么码表进行解析
// 如果客户端使用的码表正好和指定的码表是一致的,那就可以解析
// 如果客户端使用的码表和指定的码表不一致,就还是不能解析
// response.setCharacterEncoding("utf-8");
// 指定输出的内容是什么类型的text/html
// 指定了写回客户端的数据使用的是什么码表进行编码的UTF-8
// 指定了客户端使用什么码表解析数据UTF-8
// 如果要指定编码格式,一定要先指定,后输出内容
response.setContentType("text/html;charset=UTF-8");
// 这两个对象是互斥的,只能调用一个
response.getWriter().write("你好");
// response.getOutputStream().write("你好".getBytes());
}
案例1:下载
文件下载:将服务器上已经存在的文件,输出到客户端浏览器.
文件下载的方式:
第一种:超链接方式(不推荐)
链接的方式:直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式的文件,那么直接打开
第二种:手动编码方式(推荐)
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会提示下载.
设置两个头和一个流
设置的两个头:
1.Content-Dispostion:浏览器识别该格式文件,提示下载.
//告诉浏览器去下载
response.setHeader("Content-Disposition", "attachment;filename="+filename);
2.Content-Type:文件类型.(MIME的类型)
//response.setHeader("Content-Type", mimeType);
response.setContentType(mimeType);
设置一个流:
获得要下载的文件的输出流(字节流).
//得到输出流
OutputStream os = response.getOutputStream( );
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 0.获取ServletContext
ServletContext servletContext = getServletContext();
// 1.获取用户需要下载的文件名
String fileName = request.getParameter("file");
// 2.要指定文件的Mime类型
String mimeType = servletContext.getMimeType(fileName);
response.setContentType(mimeType);
// 3.指定如何处置这个文件
// attachment: 代表要下载这个文件
// filename: 代表下载这个文件的时候使用的默认文件名
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 4.以流的形式把文件写到客户端
InputStream is = servletContext.getResourceAsStream("/" + fileName);
ServletOutputStream os = response.getOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
}
解决中文名
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 0.获取ServletContext
ServletContext servletContext = getServletContext();
// 1.获取用户需要下载的文件名
String fileName = request.getParameter("file");
// 2.要指定文件的Mime类型
String mimeType = servletContext.getMimeType(fileName);
response.setContentType(mimeType);
// 3.指定如何处置这个文件
// attachment: 代表要下载这个文件
// filename: 代表下载这个文件的时候使用的默认文件名
// 参数1:要进行编码的对象
// 参数2:码表
// String encode = URLEncoder.encode("附件", "utf-8");
// 火狐浏览器编码方式是Base64,其他的浏览器编码方式使用的是utf-8
// 获取客户端类型
String agent = request.getHeader("User-Agent");
String encode = DownLoadUtils.getName(agent, "附件");
response.setHeader("Content-Disposition", "attachment; filename=" + encode + ".rar");
// 4.以流的形式把文件写到客户端
InputStream is = servletContext.getResourceAsStream("/" + fileName);
ServletOutputStream os = response.getOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
}
案例2:验证码
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 指定生成的验证码图片的宽度,单位像素
int width = 120;
// 指定生成的验证码图片的高度,单位像素
int height = 40;
// 指定生成的验证码图片中验证码的个数
int codeCount = 4;
// 指定生成的验证码图片中干扰线的个数
int lineCount = 20;
ValidateCode validateCode = new ValidateCode(width, height, codeCount, lineCount);
validateCode.write(response.getOutputStream());
}