Загрузка файла PrimeFaces 3.0M4 не происходит после входа в систему - PullRequest
0 голосов
/ 20 ноября 2011

После долгих усилий я получил PrimeFaces 3.0M4, работающий над Tomcat 7.0.2 с Mojarra 2.1.3.Компонент загрузки запускается, если я представляю функцию загрузки перед входом в систему, но не запускается, если я вхожу в систему, а затем прихожу для загрузки файла.Мой фильтр определен следующим образом:

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

Я почти уверен, что это как-то связано с фильтром.Есть идеи?Буду очень признателен.

1 Ответ

0 голосов
/ 20 ноября 2011
<h:panelGrid columns="1" rendered="#{loginBean.uploadSectionVisible}">
  <h:form enctype="multipart/form-data" prependId="false">

Будет ли обрабатываться форма загрузки, зависит от результата #{loginBean.uploadSectionVisible}, который у вас есть в атрибуте rendered родительского компонента.Вы, кажется, требуете, чтобы пользователь вошел в систему для отображения формы загрузки.Это будет работать, если #{loginBean} находится в области сеанса, и вы не выполняете бизнес-логику в методе getter.Но произойдет сбой, если #{loginBean} находится в области запроса и / или вы выполняете бизнес-логику на основе параметров запроса.

Вы должны представлять вошедшего в систему пользователя отдельным управляемым компонентом, который помещаетсяв области видимости сеанса и зафиксируйте отображаемые атрибуты следующим образом: #{user} - это компонент области сеанса, представляющий зарегистрированного пользователя:

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

См. также:

...