HttpServletResponse 的使用

博客提到为避免简单的响应数据,需手动封装返回对象,并给出了使用 response.sendError 方法返回错误信息的示例,还标注了转载来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

场景:避免一些简单的响应数据,需要手动封装放回对象

 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "haha 系统崩了");

 

public class OrderController {

    private static final Logger LOGGER = getLogger(OrderController.class);

    @Autowired
    private CommandGateway commandGateway;

    @Autowired
    private HttpServletResponse response;

    @RequestMapping(method = RequestMethod.POST)
    public void create(@RequestBody(required = true) JSONObject input){
        LOGGER.info(input.toJSONString());

        int responseCode = HttpServletResponse.SC_BAD_REQUEST;

        if(input.containsKey("username") && input.containsKey("products")){
            String username = input.getString("username");
            JSONArray products = input.getJSONArray("products");
            if(!StringUtils.isEmpty(username) && products.size()>0){
                Map<String, Integer> map = new HashMap<>();
                CreateOrderCommand command = new CreateOrderCommand(username, map);
                for(Object each:products){
                    JSONObject o = (JSONObject)each;
                    if(!o.containsKey("id") || !o.containsKey("number"))
                        return;
                    map.put(o.getString("id"), o.getInteger("number"));
                }
                commandGateway.sendAndWait(command);
                responseCode = HttpServletResponse.SC_CREATED;
            }
        }

        response.setStatus(responseCode);
    }

 

转载于:https://www.cnblogs.com/lshan/p/10893441.html

<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 | |---------------------|----------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值