‹t:inputFileUpload› больше не работает после миграции JSF 1.2 на JSF 2.2

Я обновляю свое приложение с JSF 1.2 до JSF 2.2 и использую версию Tomahawk 1.1.14.

После обновления тег <t:inputFileUpload> перестал работать, и значение компонента больше не привязано к свойству backingbean.

web.xml

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/WEB-INF/facelets/tags/tomahawk.taglib.xml</param-value>
</context-param>

Однако я увидел на сайте myfaces, что указанный выше параметр устарел. Есть ли другой способ включить библиотеки тегов или это даже не требуется для JSF 2.2?

<filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    <init-param>
        <param-name>uploadMaxFileSize</param-name>
        <param-value>50m</param-value>
    </init-param>
    <init-param>
        <param-name>uploadThresholdSize</param-name>
        <param-value>1024k</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>*.faces</url-pattern>
</filter-mapping>

Перед этим фильтром у меня есть еще один фильтр в моем файле web.xml, и он

<filter>
    <filter-name>AjaxAnywhere</filter-name>
    <filter-class>org.ajaxanywhere.AAFilter</filter-class>
    <init-param>
        <param-name>preSendHandlerClass</param-name>
        <param-value>org.ajaxanywhere.jsf.MyFacesClientStateSavingPreSendHandler</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>AjaxAnywhere</filter-name>
    <url-pattern>*.faces</url-pattern>
</filter-mapping>

Может ли кто-нибудь помочь мне, если мне нужно внести какие-либо изменения в конфигурацию, чтобы Tomahawk работал с JSF 2.2?

Спасибо!


person user1661892    schedule 02.07.2015    source источник


Ответы (1)


Начиная с JSF 2.2, FacesServlet будет автоматически анализировать multipart/form-data запросы самостоятельно с помощью нового сервлета 3.0 @MultiartConfig аннотация. Кроме того, начиная с JSF 2.2 (наконец-то!) появился стандартный компонент загрузки файлов, <h:inputFile>.

Фильтр расширений MyFaces и компонент загрузки файлов Tomahawk в основном несовместимы с JSF 2.2. Фильтр будет потреблять и анализировать запрос по-своему, и FacesServlet в конечном итоге вообще не получит данных запроса (и, следовательно, не сможет продолжить жизненный цикл JSF «как обычно»). Удаление фильтра само по себе также не сработает, поскольку <t:inputFileUpload> внутренне полагается на семантику/специфику фильтра расширений MyFaces.

Лучше всего просто удалить фильтр из web.xml и заменить <t:inputFileUpload> на <h:inputFile>. Он должен быть привязан к свойству javax.servlet.http.Part. который предлагает ао getInputStream(), который вы можете продолжать использовать так же, как и раньше, с <t:inputFileUpload>.

<h:inputFile value="#{bean.uploadedFile}" />
private Part uploadedFile;

public void save() {
    String name = uploadedFile.getSubmittedFileName();
    String type = uploadedFile.getContentType();
    long size = uploadedFile.getSize();
    InputStream content = uploadedFile.getInputStream();
    // ...
}

Конфигурация максимального и порогового размера загрузки фильтра может быть перенесена в <multipart-config> запись <servlet> записи FacesServlet в web.xml, как показано ниже:

<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <multipart-config>
        <max-file-size>52428800</max-file-size>
        <file-size-threshold>1048576</file-size-threshold>
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Смотрите также:


Не связанный с конкретной проблемой, facelets.LIBRARIES специфичен для Facelets 1.x. В эпоху JSF 1.x Facelets была отдельной технологией просмотра. Начиная с JSF 2.0, Facelets встроен в сам JSF, и все его параметры контекста перенесены из facelets.XXX в javax.faces.FACELETS_XXX. Вы можете найти их все в Обзор всех имен и значений параметров контекста web.xml, связанных с JSF. Однако вам также не нужно явно регистрировать эту taglib Tomahawk. Просто избавься от этого.

person BalusC    schedule 03.07.2015
comment
Итак, я играл с фильтрами в своем web.xml, и после удаления фильтра ajaxanywhere (фильтр непосредственно перед фильтром расширения) тег t: inputFileUpload сработал! Однако мне нужен этот фильтр, и мне придется вникать в детали того, почему ajaxanywhere его потребляет. Я бы также попробовал JSF h: inputFile. Кроме того, для параметра facelets.LIBRARIES я удалю taglib томагавка. Но у меня есть собственные библиотеки тегов, а также библиотека тегов j4j-facelets. Итак, я должен перейти на javax.faces.FACELETS_LIBRARIES в web.xml. Спасибо за подробное объяснение!! - person user1661892; 03.07.2015
comment
Начиная с JSF 2.0, JSF имеет стандартную поддержку ajax через тег <f:ajax>. Вы можете просто отказаться от этой почти десятилетней давности AjaxAnywhere. Я предлагаю сделать паузу и просмотреть книгу/учебник по JSF 2.x, чтобы немного освежиться. На самом деле многое сделано по-другому (читай: лучше) в JSF 2.x по сравнению с JSF 1.x. - person BalusC; 03.07.2015