h: commandButton множественные действия: загрузить файл и отобразить таблицу ajax - PullRequest
3 голосов
/ 29 ноября 2010

В настоящее время у меня есть 2 командные кнопки и один список.Основываясь на выборе списка, сгенерированный результат может быть показан в загружаемом файле или представлен в виде таблицы HTML.Код getFile() основан на руководстве по обработке PDF от BalusC , в то время как getTable() устанавливает resultTable.

<h:form>
<fieldset>
    <h:selectManyListbox id="listbox" value="#{form.items}">
        <f:selectItems value="#{form.allItems}">
    </h:selectManyListbox>
</fieldset>
<h:commandButton value="Get File" action="#{form.getFile}">
<h:commandButton value="Get Table" action="#{form.getTable}">
    <f:ajax render="result_table" execute="listbox" />
</h:commandButton>
<h:panelGrid id="result_table">
    <table>
        <thead></thead>
        <tbody>
            <ui:repeat var="table" value="#{form.resultTable}">
            </ui:repeat>
        </tbody>
    </table>
</h:panelGrid>

Пока обе кнопки работают нормально.Однако я хочу объединить оба действия в одну кнопку.Когда я проверяю это с помощью кнопки, которая запускает оба действия, ничего не происходит (файл не сохраняется в виде диалога или таблицы).Это потому, что одно действие является ajax или другое действие заканчивается на facesContext.responseComplete();?

<h:commandButton value="Get Both" action="#{form.getBoth}">
    <f:ajax render="result_table" execute="listbox" />
</h:commandButton>

getBoth() {
    getTable();
    getFile();
}

Кроме того, я хотел бы установить флажок, если, если он установлен, всплывающее окно «сохранить как» и таблица отображается.Если этот флажок не установлен, отображается только таблица.

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

К сожалению, это невозможно с HTTP.Вы можете отправить только один ответ обратно на запрос.Вы не можете объединить ответ, содержащий файл PDF, и ответ ajax в один ответ.Поскольку это ограничение HTTP, JSF ничего не может для вас сделать.Кроме того, загрузка файла с использованием Ajax вообще невозможна, поскольку JavaScript не может заставить браузер выводить диалог Сохранить как и не иметь доступа к файловой системе локального диска из-за ограничений безопасности.

В качестве обходного пути можно было бы запустить два HTTP-запроса одним нажатием кнопки, когда второй запрос возвращает Content-Disposition: attachment, так что ответ другого запроса остается без изменений.Вы можете добиться этого, добавив onclick к командной кнопке.

<h:commandButton onclick="window.location='/context/pdfservlet/filename.pdf'">

и создайте сервлет PDF, который будет выглядеть примерно как этот пример FileServlet .Как видите, этим невозможно вызвать действие JSF.Вы должны изменить метод загрузки PDF в класс HttpServlet, который выполняет работу в методе doGet().Для любой необходимой связи между управляемым JSF-компонентом и сервлетом вы можете использовать область сеанса или передать нужную информацию (только идентификатор файла PDF?) По пути или параметру запроса.

0 голосов
/ 29 сентября 2014

Я схожу по аналогичному случаю, в моем случае я получаю разрешение с помощью тэга lib ajax richfaces и кнопки окружения с тэгом формы ajax.

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j">

<a4j:form id="formDownloads">
<rich:panel>
            <h:commandButton value="Exportar para PDF" status= "block" ... />
</rich:panel>
</a4j:form> 
...