经过大量的努力,我使用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有关。有任何想法吗?非常感谢。
答案 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>