p:不调用fileUploadListener

时间:2013-09-15 20:15:29

标签: jsf file-upload jsf-2 primefaces

我正在使用,

  • GlassFish 4.0
  • JSF 2.2
  • Mojarra 2.2.0
  • Primefaces 3.5

我在XHTML页面上有这个fileUpload组件。

<h:form enctype="multipart/form-data">

    <p:fileUpload id="txtCatImage" 
                  value="#{testManagedBean.uploadedFile}"
                  mode="advanced"
                  sizeLimit="100000"
                  multiple="false"
                  showButtons="true" 
                  allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                  fileUploadListener="#{testManagedBean.fileUploadListener}"/>

    <p:message for="txtCatImage" showSummary="false"/>

    <p:commandButton id="btnSubmit" 
                     actionListener="#{testManagedBean.insert}" 
                     icon="ui-icon-check" value="Save"/>
</h:form>

这是相应的托管bean。

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable {

    private UploadedFile uploadedFile;
    private static final long serialVersionUID = 1L;

    public TestManagedBean() {}

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

    public void fileUploadListener(FileUploadEvent event) {
        uploadedFile = event.getFile();
        System.out.println("fileUploadListener invoked.");
    }

    public void insert() {
        if (uploadedFile != null) {
            System.out.println(uploadedFile.getFileName());
        } else {
            System.out.println("The file object is null.");
        }
    }
}

如上所述的文件上传监听器 - 永远不会调用fileUploadListener()

文件上传过滤器在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>
</filter-mapping>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

我已将Apache-commons-fileuploadApache-commons-io添加到类路径中。同样的事情在我早期的Spring / JSF项目中有效。

我看不到我在这里失踪的东西。是否必须对服务器版本执行某些操作?

2 个答案:

答案 0 :(得分:3)

这很可能是因为Primefaces 4是唯一一个与Glassfish 4(Java EE 7)中提供的最新JSF标准兼容的版本。 Primefaces 3.5适用于Glassfish 3.1.2.2(Java EE 6)
有更多人遇到这个问题 9月16日星期一将推出Primefaces 4.0 RC1,所以你应该尝试使用它,如果你真的想要GF 4.

编辑:
参考:Glassfish 4, JSF 2.2 and PrimeFaces FileUploadEvent not working together
用户可以自己决定RC是否足够好。我刚刚向他建议,因为这是目前唯一的方式。

答案 1 :(得分:-1)

如果您使用Primefaces上传,则必须注意以下情况。

  1. 请勿使用ajax请求,也就是说,您必须在ajax="false"中添加<p:commandButton...>属性。否则,请使用<h:commandButton>
  2. 如果要显示动态图像,则支持bean的范围必须为Session Scope。否则,您必须将文件写入临时存储,并使用此文件路径显示动态图像。
  3. 参考是here