You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSP表单触发Servlet生成CSV下载,文件显示对象地址而非查询结果

问题原因及修复方案

核心问题

你遇到的问题根源有两个:

  1. 错误调用CSVWriter.toString():这个方法默认返回对象的内存地址(就是你看到的com.opencsv.CSVWriter@771aa22),根本不会返回生成的CSV内容。
  2. 错误的输出路径:你把CSV写到了本地服务器的文件里,却试图把对象字符串返回给客户端,完全没把实际的CSV内容输出到响应流里。

另外代码里还有好几处语法错误,比如变量赋值漏了=号,这些也得先修正。

修复后的代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String sql = QueryConstant.CFOUSERQUERY;
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {
        ConnectionManager connMan = GFOServer.GetGoldInt.ConnectionManager();
        conn = connMan.allocateConnection(); 
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);

        // 直接将CSVWriter绑定到响应输出流,跳过本地文件
        response.setContentType("text/csv");
        response.setHeader("Content-disposition", "attachment; filename=CFOUserQueryReport.csv");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Expires", "-1");

        CSVWriter writer = new CSVWriter(response.getWriter());
        writer.writeAll(rs, true); // 注意方法名是writeAll,不是writeall(大小写敏感)
        writer.flush();
        writer.close();

        connMan.closeStatement(stmt);
        connMan.closeResultSet(rs);
        connMan.deallocateConnection(conn);
    } catch (Exception e) {
        // 不要只拿getMessage,打印完整栈轨迹方便排查问题
        e.printStackTrace();
        throw new ServletException("生成CSV报告失败", e);
    }
}

关键修改点

  • 修正所有语法错误(补全=号、修正方法名大小写writeAll)
  • 直接把CSVWriter和响应的Writer绑定,生成的CSV内容直接输出给客户端,不用写本地文件
  • 移除了没用的csvResult变量和错误的toString()调用
  • 完善异常处理,打印栈轨迹并抛出异常,方便定位问题

内容的提问来源于stack exchange,提问作者Someone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:57:36