HttpServletResponse的使用

本文详细介绍了如何使用Java Servlet API中的HttpResponse对象进行各种响应操作,包括发送状态码、重定向、定时跳转、设置响应头及使用不同的输出流发送数据。

response发送状态码

response.sendError(int sc,String msg):发送错误状态码与说明
response.sendError(int sc):发送错误状态码
response.SetStatus(int sc):发送正常状态码
//发送404
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(404,"您访问的资源存在,不想显示");
    }

response响应头:Content-Type、Refresh、Location等等

setHeader(String name,String value):适用于单值的响应头
addHeader(String name,String value):适用于多值的响应头
setIntHeader(String name,int value):适用于单值的int类型的响应头,如"Content-Length"
addIntHeader(String name,int value)):适用于多值的int类型的响应头
setDateHeader(String name,long value):适用于单值的毫秒类型的响应头,如"expires"(过期)
addDateHeader(String name,long value):适用于多值的毫秒类型的响应头

会出现一个头(一个名字,一个值),也会出现一个头(一个名称,多个值)

response重定向
设置302代码并设置Location

    //方法一
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //给出请求uri
        response.setHeader("Location","/send404");
        response.setStatus(302);
        System.out.println("RedirectionServlet");
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //快捷的重定向方法(requestURI
        response.sendRedirect("/TextServlet");
    }

定时跳转并刷新

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送响应体
        PrintWriter writer = response.getWriter();
        writer.print("欢迎XXX登陆,5秒钟后自动跳转到主页!");
        //设置名为refresh的响应头
        response.setHeader("Refresh","5;URL=/TextServlet");
    }

response两个流

1、ServletOutPutStream:用来向客户端发送字节数据(图片)
ServletOutPutStream out = response.getOutPutStream();
    //演示响应字节数据
    String path = "G:/22.jpg";
    FileInputStream in = new FileInputStream(path);
    //读取输入流内容的字节到字节数组中
    byte[] bytes1 = IOUtils.toByteArray(in);
    response.getOutputStream().write(bytes1);
2、PrintWriter:用来向客户端发送字符数据,需要设置编码
PrintWriter writer = response.getWriter();
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("Hello");
    }
两个流不能同时使用
<think>嗯,用户之前问过如何用Spring Boot导出字符串文本,现在又提到使用HttpServletResponse。可能他们想了解更底层的方法,或者遇到了之前方案的问题。 首先,我需要比较两种方法的优缺点。之前用的是ResponseEntity,更现代,更符合Spring的习惯。而HttpServletResponse更接近Servlet原生API,可能在旧项目中使用较多。 用户可能的需求是更灵活地控制响应,比如设置特定的头信息,处理文件下载时的特殊情况,或者在非Spring Boot环境中使用。或者他们可能在维护遗留代码,需要了解HttpServletResponse的用法。 要确保覆盖到HttpServletResponse的基本使用步骤,比如直接写入响应流,设置内容类型和头信息。同时,注意中文文件名乱码的问题,之前提到过URLEncoder.encode,这里可能需要同样的处理。 另外,用户可能想知道两种方法的区别,什么时候该用哪一种。比如HttpServletResponse更底层,适合需要细粒度控制的场景,而ResponseEntity更简洁,适合RESTful风格的API。 还要考虑异常处理,比如在try-with-resources中使用OutputStream,避免资源泄漏。同时,提醒大文件导出时的流式处理,而不是一次性加载到内存。 可能还需要给出示例代码,展示如何通过HttpServletResponse实现导出,并对比之前的ResponseEntity方法,说明各自的适用场景。 最后,检查是否有常见问题,比如忘记设置Content-Disposition导致浏览器直接显示内容而不是下载,或者字符编码不一致导致的乱码问题。确保回答结构清晰,步骤明确,帮助用户顺利实现功能。</think>在 Spring Boot 中使用 `HttpServletResponse` 实现文件导出的底层控制方法如下: --- ### **1. 基础实现方案** ```java @RestController public class ExportController { @GetMapping("/export/text") public void exportText(HttpServletResponse response) throws IOException { String content = "导出的文本内容"; // 要导出的字符串 String fileName = "我的文件.txt"; // 文件名 // 设置响应头 response.setContentType("text/plain; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8")); // 写入响应流 try (OutputStream out = response.getOutputStream()) { out.write(content.getBytes(StandardCharsets.UTF_8)); out.flush(); } } } ``` --- ### **2. 核心要素解析** #### **① 响应头配置** ```java response.setContentType("text/plain; charset=UTF-8"); // 内容类型 + 编码 response.setCharacterEncoding("UTF-8"); // 响应体编码 response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode(fileName, "UTF-8")); ``` - `attachment`:强制下载而非浏览器直接展示 - `filename*`:RFC 5987 标准解决中文文件名乱码 - 必须同时设置内容类型和字符编码 #### **② 流操作规范** ```java try (OutputStream out = response.getOutputStream()) { // 自动关闭资源 out.write(content.getBytes(StandardCharsets.UTF_8)); out.flush(); // 确保数据完全写入 } ``` - 使用 try-with-resources 自动关闭流 - 必须调用 `flush()` 保证数据完整性 --- ### **3. 高级应用场景** #### **动态生成 CSV** ```java @GetMapping("/export/csv") public void exportCsv(HttpServletResponse response) throws IOException { response.setContentType("text/csv; charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=data.csv"); try (PrintWriter writer = response.getWriter()) { writer.write("ID,产品名称,价格\n"); writer.write("1,手机,2999\n"); writer.write("2,电脑,6999\n"); } } ``` #### **大文件流式导出** ```java @GetMapping("/export/large-file") public void exportLargeFile(HttpServletResponse response) throws IOException { response.setContentType("text/plain"); response.setHeader("Content-Disposition", "attachment; filename=bigfile.txt"); try (OutputStream out = response.getOutputStream()) { for (int i = 0; i < 100000; i++) { String line = "这是第 " + i + " 行数据\n"; out.write(line.getBytes(StandardCharsets.UTF_8)); } out.flush(); } } ``` --- ### **4.ResponseEntity 方案对比** | 特性 | HttpServletResponse | ResponseEntity | |---------------------|----------------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值