Это не тривиально с PrimeFaces 2.2.1.Обработка загрузки файла PF 2 - эпическая ошибка.Под обложками загружать файлы с помощью Ajax уже нетривиально.Объект XMLHttpRequest
просто не поддерживает multipart/form-data
запросы.Много «Ajaxified» (для ощущения асинхронного прогресса) решения по загрузке файлов основаны на скрытом iframe или - как в случае PF - с использованием Flash.PF 2 основан на Flash, и его нельзя комбинировать с обычным текстовым вводом для отправки всех данных за один раз.
В PF 3 компонент загрузки файлов был значительно переработан .Используя «простой» режим загрузки файлов, ваша проблема должна быть решена.Тем не менее, PF 3 в настоящее время все еще находится в стадии бета / альфа.Вам нужно будет выполнить множество модульных тестов в своем веб-приложении, чтобы убедиться, что оно не сломалось на PF 3.
Если PF 3 не вариант, то лучше всего использовать Tomahawk 2.0 или домашнее пивоКомпонент JSF.
Что касается фильтра, под обложками FacesServlet
использует HttpServletRequest#getParameter()
для извлечения отправленных значений.Если вы знакомы с базовыми JSP / Servlet , вы должны знать, как это обычно работает.Кодировка HTML-формы по умолчанию - application/x-www-form-urlencoded
.Метод getParameter()
полагается на это.Тем не менее, чтобы иметь возможность отправлять двоичные данные вместе, например, при загрузке файлов, эта кодировка формы по умолчанию - , неподходящая .Для этого следует использовать multipart/form-data
.
Однако, с этой кодировкой формы вызовы getParameter()
больше не будут работать.Они все вернутся null
.В простейшей форме вам нужно будет проанализировать тело запроса вручную для каждого запроса.См. Также Как загружать файлы на сервер с помощью JSP / Servlet? Однако это не работает в сочетании с JSF, так как он полагается на вызовы getParameter()
для установки свойств компонента (значений модели).) с введенными значениями и для вызова действия кнопки / ссылки.
Таким образом, вы хотели бы изменить HttpServletRequest
таким образом, чтобы вызовы getParameter()
возвращали правильные значения.Для этого Filter
является правильным выбором, поскольку он запускает перед любым сервлетом, таким как FacesServlet
.Затем фильтр должен проанализировать тело запроса multipart/form-data
, создать карту параметров, обернуть и заменить исходную HttpServletRequest
пользовательской реализацией, которая возвращает правильные параметры и передает этот объект запроса вместо этого по цепочке, чтобы JSF мог использовать его полностьюпрозрачно "обычным способом".