Response响应对象

1、HttpServletResponse

HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息。HTTP相应分为响应行、响应头和响应体三部分。在HttpServletResponse中定义了向客户端发送相应状态码、响应头、响应体的方法。

2、发送状态码相关方法

常见的相应状态码:

200 OK,302 重定向,304 取本地缓存,404 找不到资源,500 服务器内部错误(内部java代码逻辑错误)

  1. setStatus(int status)方法:用于设置相应消息的状态码
  2. sendError(int sc):发送表示错误信息的状态码

3、发送响应头的相关方法

void addHeader(String name, String value):用于增加响应头

void setHeader(String name, String value):用于设置响应头

void addIntHeader(String name, int value):增加整数响应头

void setIntHeader(String name, int value):设置整数响应头

void setContentLength(int len):用于设置响应消息的实体大小,单位为字节

void setContentType(String type):用于设置输出文件的MIME类型

void setLocale(Locale loc):用于设置响应消息的本地化信息

void setCharacterEncoding(String charset):用于设置输出内容使用的字符集编码

4、发送响应体的相关方法

  1. getOutputStream():用于获取类型为ServletOutputStream类型的字节流输出对象
  2. getWriter():用于获取的字符输出流对象为PrintWriter类型

5、文件下载实例

文件下载要解决问题:文件名中文乱码问题,浏览器自动解析,读取服务器上文件,写到本地

复制代码
 1 package com.alphajuns.content;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.net.URLEncoder;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletOutputStream;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 import sun.misc.BASE64Encoder;
15 
16 public class DownloadServlet2 extends HttpServlet {
17 
18     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
19         /*
20          * 文件名是中文的下载乱码问题解决
21          */
22         // 获取要下载的文件的名称
23         String filename = request.getParameter("filename");
24         // 解决中文乱码问题
25         filename = new String(filename.getBytes("iso8859-1"), "UTF-8");
26         // 获得请求头中的User-Agent
27         String agent = request.getHeader("User-Agent");
28         // 根据不同的浏览器进行不同的解码
29         String filenameEncoder = "";
30         if (agent.contains("MSIE")) {
31             // IE浏览器
32             filenameEncoder = URLEncoder.encode(filename, "utf-8");
33             filenameEncoder = filenameEncoder.replace("+", " ");
34         } else if (agent.contains("Firefox")) {
35             // 火狐浏览器
36             BASE64Encoder base64Encoder = new BASE64Encoder();
37             filenameEncoder = "=?utf-8?B?"
38                     + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
39         } else {
40             // 其它浏览器
41             filenameEncoder = URLEncoder.encode(filename, "utf-8");                
42         }
43         // 告诉客户端不是直接解析,而是以附件形式下载
44         response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
45         // 获取文件的绝对路径
46         String realPath = this.getServletContext().getRealPath("download/" + filename);
47         // 获取的该文件的字节输入流
48         InputStream in = new FileInputStream(realPath);
49         // 获得文件的字节输出流
50         ServletOutputStream out = response.getOutputStream();
51         int len = 0;
52         // 定义读写数据的字节数组缓冲区
53         byte[] buffer = new byte[1024];
54         // 读取数据到字节数组中
55         while ((len = in.read(buffer)) != -1) {
56             out.write(buffer, 0, len);
57         }
58         // 关闭资源
59         out.close();
60         in.close();
61     }
62 
63     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64         doGet(request, response);
65     }
66 }
复制代码

 

posted @   AlphaJunS  阅读(661)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示