Есть две проблемы.
Первая проблема заключается в том, что <p:commandButton>
отправляет по умолчанию Ajax-запрос.Этот запрос запускается кодом JavaScript.Однако JavaScript не может ничего сделать с ответом, который содержит загрузку файла.Из-за ограничений безопасности JavaScript не может вызвать диалог Сохранить как или что-то еще.Ответ в основном полностью игнорируется.
Вам необходимо добавить ajax="false"
к <p:commandButton>
, чтобы отключить AJAX, чтобы кнопка запускала обычный синхронный HTTP-запрос, или вам нужно заменить его на стандартный <h:commandButton>
.
<p:commandButton ajax="false" ... />
.
или
<h:commandButton ... />
Вторая проблема заключается в том, что ваш сервлет вообще не записывает файл Excel в ответ, а вместо этого в локальный файл, который хранится в рабочем каталоге сервера.По сути, HTTP-ответ не содержит ничего .Вам нужно передать HttpServletResponse#getOutputStream()
методу WorkBook#write()
.
workbook.write(response.getOutputStream());
На несвязанной ноте мне интересно, как здесь пригодится сервлет.Вы хотите использовать его за пределами JSF?Если нет, вам вовсе не обязательно отправлять сервлету, а просто выполнять тот же код в методе действия bean-компонента.Этот пустой блок catch
тоже нехорошо.Я бы просто объявил это как throws
в методе или, по крайней мере, отбросил бы его как new FacesException(e)
.
Обновите согласно комментариям, которые вас не интересуют в сервлете.совсем.Вот небольшая переписка того, как можно отправить файл Excel программным способом с помощью метода действия JSF.
public void getReportData() throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue(0.0);
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.setResponseContentType("application/vnd.ms-excel");
externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"my.xls\"");
workbook.write(externalContext.getResponseOutputStream());
facesContext.responseComplete();
}