JSF 2.2 h:inputFile 不适用于漂亮的面孔[重复]

Posted

技术标签:

【中文标题】JSF 2.2 h:inputFile 不适用于漂亮的面孔[重复]【英文标题】:JSF 2.2 h:inputFile not working with pretty faces [duplicate] 【发布时间】:2014-04-10 08:10:32 【问题描述】:

我们正在使用带有 JSF 2.2 (Mojarra 2.2.0) 和 PrettyFaces 2.0 的 Glassfish 4.0。 当尝试使用h:inputFile 和相应的表单enctype="multipart/form-data" 上传文件时,仅当直接调用页面时才会触发表单操作,但如果调用漂亮的 url,则不会发生任何事情。许多其他问题有一些类似的问题(例如How to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile is null),但他们中的大多数似乎使用PrimeFaces并且在过滤器的顺序等方面存在困难。由于我们想保留上传文件的JSF方法,我想知道是否有一些我可能错过的 Mojarra 过滤器的配置。

web.xml 目前不包含任何过滤器规格。

jsf 文件只包含这个表单

<h:form enctype="multipart/form-data">
   <h:inputFile value="#fileModel.testFile"/>
   <h:commandButton value="Upload" action="#fileModel.upload"/>
</h:form>

backing bean 看起来像这样

@ApplicationScoped
@Named
public class FileModel 

    private Part testFile;

    public Part getTestFile() 
        return testFile;
    

    public void setTestFile(Part testFile) 
        this.testFile = testFile;
    

    public void upload() 
        System.out.println("File Data: " + testFile);
    

那么,在pretty-config.xml 中取消注释这些行会产生错误,而注释它们不会。

<url-mapping id="fileTest">
    <pattern value="/file" />
    <view-id value="/view/fileTest.xhtml" />
</url-mapping>

我认为 OCPSoft 可能已将问题描述为in this post,但似乎还没有解决方案。

【问题讨论】:

FAQ 似乎涵盖了您的问题。 AFAIK JSF 2.2 h:inputFile 组件使用 Servlet 3.0 功能来执行文件上传。您需要检查应用程序服务器中的服务器类型,以便在 web.xml 中对其进行配置(基本上是您的链接答案的作用,但将 PF 自定义过滤器更改为您使用的过滤器)。 但常见问题解答指出第 3 方组件,我尝试使用的是默认实现的文件输入。我必须配置哪个过滤器? 正如常见问题解答中所说的it is necessary to enable any additional filters between PrettyFaces and JSF to listen to Servlet Forwards。你需要做一些调试工作。只需检查上传文件时会点击哪种过滤器(Servlet 3.0 规范必须涵盖它)。无论如何,您最好提供代码的最小版本,以便我们重播错误。检查SSCCE format。还要指定您的 JSF 2.2 impl 版本(我想它是 Mojarra 2.2.0)。 你能告诉我如何调试实际命中的过滤器吗?由于我文件中的方法都被忽略了,我真的不知道从哪里开始...... 您可以从FacesServlet 开始。无论如何,你还没有在这里发布你的 web.xml。 【参考方案1】:

我的建议是:可以通过漂亮的面孔添加书签的页面,不应包含任何提交表单!这种页面应该仅供查看,将您的文件上传表单移动到另一个没有漂亮面孔过滤器的常规 jsf 页面

【讨论】:

【参考方案2】:

以防万一你想用 primefaces 实现,我已经使用了这样的实现

1.- 在 Web.xml 中配置过滤器

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

2.- 页面实现

<h:form id="form-file-upload" enctype="multipart/form-data">
                <p:fileUpload
                        auto="false"
                        mode="advanced"
                        value="#yourBean.file"
                        fileUploadListener="#yourBean.fileListener"
                        invalidSizeMessage="max size 10MB"
                        sizeLimit="10485760"/>


</h:form>

3.- Bean 实现

@ManagedBean
@ViewScoped
public class YourBean 

    private UploadedFile file;

    public UploadedFile getFile() 
        return file;
    

    public void setFile(UploadedFile file) 
        this.file = file;
    

    public void fileListener(FileUploadEvent e)
        this.file = e.getFile();
    

ShowCase Primefaces

【讨论】:

这不能回答当前的问题。如果要共享代码sn-ps,使用Github左右。未来用户在使用&lt;p:fileUpload&gt; 时遇到问题,可以阅读***.com/q/8875818,因为问题顶部已经链接。

以上是关于JSF 2.2 h:inputFile 不适用于漂亮的面孔[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.2 - 文件上传不适用于 Ajax。表单的编码类型似乎不正确(仅通过 AJAX)

jsf 2.2(最终版)不适用于 Jboss 7.1.1

JSF 2.2 h:命令按钮触发后的输入文件更新页面

JSF 2.2 webapp适用于本地计算机,但不适用于服务器

Spring Security 3.1.4 taglib 授权/身份验证不适用于 Tomcat 7 上 JSF 2.2 中的角色层次结构

哪种方法用于将动作回调绑定到 JSF/ICEFaces InputFile?