<t:inputFileUpload> 将 JSF 1.2 迁移到 JSF 2.2 后不再工作

Posted

技术标签:

【中文标题】<t:inputFileUpload> 将 JSF 1.2 迁移到 JSF 2.2 后不再工作【英文标题】:<t:inputFileUpload> not working anymore after migration JSF 1.2 to JSF 2.2 【发布时间】:2015-09-20 16:11:01 【问题描述】:

我正在将我的应用程序从 JSF 1.2 升级到 JSF 2.2 并使用 Tomahawk 1.1.14 版本。

升级后,&lt;t:inputFileUpload&gt; 标签已停止工作,组件的值不再绑定到 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】:

从 JSF 2.2 开始,FacesServlet 将在新的 Servlet 3.0 @MultiartConfig 注释的帮助下自动解析 multipart/form-data 请求。此外,由于 JSF 2.2 (终于!)有了一个标准的文件上传组件,&lt;h:inputFile&gt;

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

您最好的选择是完全从web.xml 中删除过滤器,并将&lt;t:inputFileUpload&gt; 替换为&lt;h:inputFile&gt;。它必须绑定到提供 a.o. 的 javax.servlet.http.Part 属性。 getInputStream(),您可以像以前一样继续使用 &lt;t:inputFileUpload&gt;

<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();
    // ...

过滤器的上传最大值和阈值大小配置可以迁移到web.xmlFacesServlet&lt;servlet&gt;入口的&lt;multipart-config&gt;入口,如下所示:

<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>

另见:

How to upload file using JSF 2.2 <h:inputFile>? Where is the saved File?

与具体问题无关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 标记库。摆脱它。

【讨论】:

所以,我在我的 web.xml 中使用过滤器,在删除 ajaxanywhere 过滤器(在扩展过滤器之前过滤)之后,t:inputFileUpload 标记起作用了!但是,我确实需要该过滤器,并且必须深入了解 ajaxanywhere 为何使用它的详细信息。我也会尝试 JSF h:inputFile。另外,对于 facelets.LIBRARIES 参数,我将删除 tomahawk taglib。但是,我确实有自定义标记库和 j4j-facelets 标记库。所以,我应该迁移到 web.xml 中的 javax.faces.FACELETS_LIBRARIES。谢谢你的详细解释!! 自 JSF 2.0 起,JSF 通过&lt;f:ajax&gt; 标签提供标准的 ajax 支持。你可以完全放弃那个近十年前的 AjaxAnywhere 东西。我建议暂停一下并阅读 JSF 2.x 书籍/教程以进行一些刷新。与 JSF 1.x 相比,JSF 2.x 中确实有很多不同的事情(阅读:更好)。

以上是关于<t:inputFileUpload> 将 JSF 1.2 迁移到 JSF 2.2 后不再工作的主要内容,如果未能解决你的问题,请参考以下文章

标签 <q>、<abbr>、<defn>、<ins>、<del> 和 <s> 的正确用法是啥? [关闭]

<em> 中的 <strong> 或 <strong> 中的 <em> 重要吗?

将 Single<List<Maybe<Book>>> 转换为 Single<List<Book>>

根据键将 List<List<List<T>>> 转换为 List<List<T>>

LL文法

前端初步预习