java - 无法让 getOutputStream() 在 servlet 中工作

标签 java json spring jsp servlets

我正在向 servlet 发送一个 json 对象并通过函数调用 servlet。这是我的jsp页面和函数:

    <script type="text/javascript">
function retrieveTicketsExcel(){
    var jsonData = {};
    jsonData["tower"]=$('#appTower').val();
    jsonData["sDate"]=$('#startDate').val();
    jsonData["eDate"]=$('#endDate').val();
    jsonData["apps"]=$('#appfilter').html();
    jsonData["duration"]=$('#duration').val();
    jsonData["severity"]=$('#severity').val();
    jsonData["releasetype"]=$('#releasetype').val();
    jsonData["query"]=$('#query').val();

         $.ajax
            ({
                type: "GET",
                url:"retrieveTicketsToExcel.htm",
                data:'requestData='+JSON.stringify(jsonData),
                dataType: "json",

            });
         }
</script>
    <div class="modal-footer">
              <input type="button" class="btn btn-default" value="Export" onclick="javascript:retrieveTicketsExcel();">
              <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            </div>

现在我正在调用Servlet方法,它是:

@RequestMapping(value = "/retrieveTicketsToExcel.htm", method = RequestMethod.GET)
public void retrieveTickets(@RequestParam("requestData") String requestData, HttpServletRequest request, HttpServletResponse response) throws IOException {
    // UserDAO userDAO = new UserDAO();
    // userDAO.setDataSource(dataSource);
    System.out.println("*****************/GRTBDashboard/retrieveTicketsToExcel****************");
    Map<String, String> requestMap = new Gson().fromJson(requestData, Map.class);

    response.reset();
    response.resetBuffer();

    response.setContentType("application/vnd.ms-excel");
    response.addHeader("Cache-control", "no-cache");
    response.setHeader("Content-disposition", "Attachment;filename=\"Ticket_Details.xls\"");
    ServletOutputStream fileOut = response.getOutputStream();

    System.out.println("retrieveTickets - > " + requestData);
    List<DashboardData> dashboardDataList = null;
    String tower = requestMap.get("tower");
    System.out.println(tower);
    try {
        dashboardDataList = userDAO.retrieveTickets(requestMap);
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }

    final double noOfRecords = dashboardDataList.size();
    double count = Math.ceil(noOfRecords / 30000);
    try {

        HSSFWorkbook workbook = new HSSFWorkbook();
        short dateFormat = workbook.createDataFormat().getFormat("YYYY-MM-DD HH:mm");

        Iterator<DashboardData> iterator = dashboardDataList.iterator();

        for (int i = 1; i <= count; i++) {
            int c1 = 1;
            HSSFSheet sheet = workbook.createSheet(tower);

            HSSFCellStyle style = workbook.createCellStyle();
            HSSFFont font = workbook.createFont();
            font.setFontName("Verdana");
            style.setFillForegroundColor(HSSFColor.GREY_40_PERCENT.index);
            style.setFillPattern(style.SOLID_FOREGROUND);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            font.setColor(HSSFColor.BLACK.index);
            style.setFont(font);
            HSSFRow header = sheet.createRow(0);
            ;

            header.createCell((short) 0).setCellValue(new HSSFRichTextString("Type"));
            header.getCell((short) 0).setCellStyle(style);

            header.createCell((short) 1).setCellValue(new HSSFRichTextString("Ticket Number"));
            header.getCell((short) 1).setCellStyle(style);

            header.createCell((short) 2).setCellValue(new HSSFRichTextString("Open Date"));
            header.getCell((short) 2).setCellStyle(style);

            header.createCell((short) 3).setCellValue(new HSSFRichTextString("Closed Date"));
            header.getCell((short) 3).setCellStyle(style);

            header.createCell((short) 4).setCellValue(new HSSFRichTextString("Reported By"));
            header.getCell((short) 4).setCellStyle(style);

            header.createCell((short) 5).setCellValue(new HSSFRichTextString("Severity"));
            header.getCell((short) 5).setCellStyle(style);

            header.createCell((short) 6).setCellValue(new HSSFRichTextString("Assigned App"));
            header.getCell((short) 6).setCellStyle(style);

            header.createCell((short) 7).setCellValue(new HSSFRichTextString("Status"));
            header.getCell((short) 7).setCellStyle(style);

            int rowIndex = 1;

            while (iterator.hasNext() && c1 <= 30000) {
                DashboardData dashboardData = iterator.next();
                System.out.println("Data : "+dashboardData.getTicketNumber());
                HSSFRow row = sheet.createRow(rowIndex++);

                HSSFCell cell0 = row.createCell((short) 0);
                cell0.setCellValue(new HSSFRichTextString(dashboardData.getType()));

                HSSFCell cell1 = row.createCell((short) 1);
                cell1.setCellValue(new HSSFRichTextString(dashboardData.getTicketNumber()));

                HSSFCell cell2 = row.createCell((short) 2);
                cell2.setCellValue(new HSSFRichTextString(dashboardData.getOpenDate().toString()));

                HSSFCell cell3 = row.createCell((short) 3);
                cell3.setCellValue(new HSSFRichTextString(dashboardData.getClosedate().toString()));

                HSSFCell cell4 = row.createCell((short) 4);
                cell4.setCellValue(new HSSFRichTextString(dashboardData.getReportedBy()));

                HSSFCell cell5 = row.createCell((short) 5);
                cell5.setCellValue(new HSSFRichTextString(dashboardData.getPriority()));

                HSSFCell cell6 = row.createCell((short) 6);
                cell6.setCellValue(new HSSFRichTextString(dashboardData.getAssignedGroup()));

                HSSFCell cell7 = row.createCell((short) 7);
                cell7.setCellValue(new HSSFRichTextString(dashboardData.getStatus()));
                c1++;

            }
            for (int autosize = 0; autosize <= 10; autosize++) {

                sheet.autoSizeColumn((short) autosize);
            }

        }

        workbook.write(fileOut);
    } catch (FileNotFoundException e2) {
        e2.printStackTrace();
    } finally {
        if (null != fileOut)
            fileOut.close();
    }
    fileOut.close();
    fileOut.flush();
}

我正在尝试将我正在编写的数据刷新为 Excel,但是单击“导出”按钮除了在 jsp 页面上提供下载之外,其他所有操作都会完成。 如果我尝试使用 FileOutputStream() 进行写入,它会完美地写入我的光盘上。但我想使用 response.getOutputStream() 在jsp页面中下载。

最佳答案

也许问题出在 JQuery 端?

您可以通过在浏览器中手动打开 retrieveTicketsToExcel.htm 来进行下载吗?如果是这样,请尝试使用 window.location.href="retrieveTicketsToExcel.htm" 而不是 JQuery 的 ajax();

编辑: 我现在很确定问题出在查询方面。首先,ajax请求无法发起文件下载对话框。您可以在此处选择 window.location.href 或提交表单。

此外,您在 ajax 调用中提供 json 作为数据类型。这是错误的,因为 dataType 指定您期望从服务器返回的数据类型,而不是您发送的请求的格式 ( http://api.jquery.com/jquery.ajax/ )

编辑2:

您对 data:'requestData='+JSON.stringify(jsonData) 的使用也存在问题。您不能简单地将 JSON 字符串附加到 url。您需要先对其进行编码。尝试使用 数据:'requestData='+encodeURI(JSON.stringify(jsonData))

或者更好的是,使用 POST 请求,因为这在语义上似乎更正确。这样您就不需要 requestData= 部分,但还必须稍微更改 servlet 代码。您需要直接从 Servlet inputStream 或 reader 读取 json。

类似这样的事情: new Gson().fromJson(request.getReader(), Map.class);;

关于java - 无法让 getOutputStream() 在 servlet 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32948069/

相关文章:

json - 如何跳过 jq 输入中的前 n 个对象

java - 如何在 Spring 应用程序中从 Web 服务下载图像/pdf 文件

java - 如何修复错误 "The type ApplicationListener is not generic; it cannot be parameterized with the arguments <ContextRefresedEvents>"?

json - 将 autodesk .dwg 和 .dwf 文件转换为 Three.js json 格式

android - 如何从 Android 中的 WCF 服务反序列化复杂的 JSON 对象?

java - 无法在 Spring Boot 中自动注册类型(JPA/Joda/Jadira)

java - RetryTemplate 只执行一次

java - HTTP 状态 415 - 不支持的媒体类型

java - Struts 2 拦截器响应 header 未设置

java - sql server glassfish eclipselink jpa 问题