1

我的 bean 类中有以下代码块 -

HttpServletResponse response = (HttpServletResponse) getFacesContext().getExternalContext().getResponse();
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

我从我的 bean 调用我的服务层,后者又调用数据库层,检索数据并将生成的文件写入服务层的 ZIP 文件中。我有一个问题,如果没有生成文件,我不知道该怎么做。

当我在我的 bean 中实例化 ZipOutputStream 对象时,它会创建一个 ZIP 文件并打开一个“Opening Extracts.zip”窗口,当我单击“确定”时,我收到一个错误,因为 ZIP 文件夹中没有文件。

somoone 可以告诉我是否有任何方法可以将 zos 实例化移动到服务层而无需传递响应对象?

谢谢,拉兹

4

1 回答 1

1

我发现我可以执行以下操作来解决我的问题 -

在我的 bean 类中,我编写了以下代码 -

HttpServletResponse response = (HttpServletResponse) getFacesContext().getExternalContext().getResponse();
ByteArrayOutputStream outputStream = null;

try {
    outputStream = //Call service to generate the extract, return outputStream ; 
    if(outputStream != null){
    response.setContentType(T3Constants.MIME_ZIP);
    response.setHeader(T3Constants.CONTENT_DISPOSITION, ATTACH_FILE_NAME);
    response.getOutputStream().write(outputStream.toByteArray());
    response.flushBuffer();
    FacesContext.getCurrentInstance().responseComplete();
    outputStream.close();
    } else {
    formatFacesMessage(FacesMessage.SEVERITY_WARN, "No data for selected filter", "No data for selected filter");
    }
}

在我的服务中,我编写了以下代码 -

ByteArrayOutputStream outputStream = null;
if(CollectionUtils.isNotEmpty(list returned from DB)) {
    outputStream = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(outputStream);
    //Add files to ZIP
    outputStream = new ByteArrayOutputStream();
    workbook.write(outputStream);
    zos.putNextEntry(new ZipEntry(xlsName.toString()));
    zos.write(outputStream.toByteArray());
    zos.flush();
    zos.close();
return outputStream;
}

谢谢,拉兹

于 2012-06-22T05:02:52.750 回答