在将JSF 1.2迁移到JSF 2.2之后,<t:inputfileupload>不再工作

时间:2015-07-02 23:33:43

标签: jsf file-upload servlet-filters jsf-2.2 tomahawk

我正在将我的应用程序从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,那么有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

自JSF 2.2起,FacesServlet将在新Servlet 3.0 @MultiartConfig注释的帮助下自动解析multipart/form-data个请求。此外,由于JSF 2.2(最终!)是一个标准文件上传组件,<h:inputFile>

MyFaces扩展过滤器和Tomahawk文件上传组件基本上与JSF 2.2不兼容。过滤器将以自己的方式使用和解析请求,而FacesServlet最终将不会获得任何请求数据(因此无法像往常一样“继续”JSF生命周期“)。单独删除过滤器也不起作用,因为<t:inputFileUpload>在内部依赖于MyFaces扩展过滤器的语义/细节。

您最好的选择就是从web.xml中完全删除过滤器,然后将<t:inputFileUpload>替换为<h:inputFile>。它必须绑定到提供a.o的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的{​​{1}}条目的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。您可以在a.o Overview of all JSF-related web.xml context parameter names and values中找到它们。但是,您也不需要显式注册Tomahawk taglib。只是摆脱它。