Поэтому, когда я пытаюсь напечатать тип содержимого выше, он показывает application / x-www-form-urlencoded.
<p:commandButton>
отправляет по умолчанию запрос ajax уровня 1 XMLHttpRequest
. Это не поддерживает multipart/form-data
. Его поддерживает только уровень 2 XMLHttpRequest
, но он поддерживается только в новейших браузерах (также поддерживающих HTML5) и не реализован ни в JSF JS API, ни в PrimeFaces JS API.
Если я добавлю ajax = "false" к моему p: commandButton, то метод submit () даже не будет вызван
Таким образом, однако, будет отправлено multipart/form-data
. То, что метод submit не вызывается, это просто потому, что JSF до версии 2.2 не поддерживает multipart/form-data
запросов из коробки. JSF собирает отправленные данные по умолчанию, используя request.getParameter()
и getParameterMap()
в базовом HTTP-запросе сервлета. Однако это вернет null
, если используется кодировка, отличная от application/x-www-form-urlencoded
. Поскольку JSF определяет метод действия, который должен быть вызван, на основе отправленных данных, он не сможет найти и вызвать его, когда данные null
.
Теоретически, если вы создаете Filter
, который использует Apache Commons FileUpload или новый Servlet 3.0 request.getPart()
/ getParts()
для извлечения данных из multipart/form-data
запрашивает и упаковывает текущий HTTP-запрос сервлета с пользовательской реализацией, которая переопределяет вызовы getParameter()
, в которые предоставляется сопоставление извлеченных данных, тогда JSF сможет выполнить необходимую работу на основе результатов вызовов getParameter()
, Вы можете найти конкретный пример использования API Servlet 3.0 в этой статье и тот же пример, который немного изменен для использования Apache Commons FileUpload в этом ответе .
Предстоящий JSF 2.2 будет иметь новый компонент <h:inputFile>
, который можно привязать к свойству Servlet 3.0 Part
.
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}" />
<h:commandButton value="submit" action="#{bean.submit}" />
</h:form>
с
private Part file;
Окончательный выпуск JSF 2.2 запланирован на поздний конец первого квартала, но в настоящее время доступен как выпуск моментального снимка.