JSP表单触发Servlet生成CSV下载,文件显示对象地址而非查询结果
问题原因及修复方案
核心问题
你遇到的问题根源有两个:
- 错误调用
CSVWriter.toString():这个方法默认返回对象的内存地址(就是你看到的com.opencsv.CSVWriter@771aa22),根本不会返回生成的CSV内容。 - 错误的输出路径:你把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
相关产品推荐
相关产品推荐

