登录后,PrimeFaces 3.0M4 fileUpload不会触发

时间:2011-11-20 14:24:08

标签: jsf file-upload primefaces

经过大量的努力,我使用Mojarra 2.1.3将PrimeFaces 3.0M4用于Tomcat 7.0.2。如果我在登录前显示上传功能,则会触发上传bean,但如果我登录则不会触发,然后进行文件上传。 我的过滤器定义如下:

    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        <init-param>
            <param-name>thresholdSize</param-name>
            <param-value>2097152</param-value>
        </init-param>
        <init-param>
            <param-name>uploadDirectory</param-name>
            <param-value>c:\temp\</param-value>
        </init-param>     
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
   <!-- Faces Servlet -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

登录返回到包含上传组件的同一页面。事实上,我在同一个Facelet中有两种形式,定义如下:

<h:form id = "loginForm">
  <h:panelGrid columns="6" rendered="#{loginBean.loginSectionVisible}">

    <h:messages errorClass="errorMessage" infoClass="infoMessage"
                            warnClass="warnMessage"></h:messages>

    <h:outputText value="Username : "></h:outputText>
    <h:inputText id="username" value="#{loginBean.username}"></h:inputText>

    <h:outputText value="Password : "></h:outputText>
    <h:inputSecret id="password" value="#{loginBean.password}"></h:inputSecret>
    <h:commandButton value="Submit" action="#{loginBean.login}" type="submit"></h:commandButton>
  </h:panelGrid>    
</h:form>
<h:panelGrid columns="1" rendered="#{loginBean.uploadSectionVisible}">
  <h:form enctype="multipart/form-data" prependId="false">
    <p:fileUpload fileUploadListener="#{fileUploadBean.handleFileUpload}"
                                    mode="advanced" 
                                    update="messages"
                                    sizeLimit="100000" 
                                    allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>
    <p:growl id="messages" showDetail="true"/>
  </h:form>

我几乎可以肯定它与Filter有关。有任何想法吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

<h:panelGrid columns="1" rendered="#{loginBean.uploadSectionVisible}">
  <h:form enctype="multipart/form-data" prependId="false">

是否处理上传表单取决于您在父组件的#{loginBean.uploadSectionVisible}属性中具有的rendered的结果。您似乎要求用户登录才能显示上传表单。如果#{loginBean}在会话范围内并且您没有在getter方法中执行任何业务逻辑,那么它将起作用。但是如果#{loginBean}在请求范围内和/或您正在根据请求参数执行业务逻辑,它将失败。

您需要通过一个单独的托管bean来表示登录用户,该托管bean放在会话范围内并修复所呈现的属性,如下所示#{user}是表示登录用户的会话范围bean:

<h:form ... rendered="#{not user.loggedIn}">
    ...
    <h:commandButton action="#{login.submit}" ... />
</h:form>
<h:form ... rendered="#{user.loggedIn}">
    <p:fileUpload fileUploadListener="#{upload.handle}" ... />
</h:form>

另见: