我无法在 PrimeFaces 3.5 上使用 fileUpload 组件来触发该事件。我读过很多关于该主题的帖子并遵循了那里的建议,但仍然不起作用。我尝试了所有模式(简单、自动、高级),但没有成功。
如果我使用 JSF 规范中的标准 inputFile 标记,它可以正常工作。
这是我的 web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>redmond</param-value>
</context-param>
<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>/faces/*</url-pattern>
</servlet-mapping>
<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>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/home.xhtml</welcome-file>
</welcome-file-list>
</web-app>
这是我的视图页面的一部分,带有 fileUpload 标签:
<h:form enctype="multipart/form-data">
<p:dialog id="basicDialog" header="Add pictures" widgetVar="dlg1" >
<p:fileUpload fileUploadListener="#{galleryManagedBean.addPicturesToGallery}" multiple="true"/>
</p:dialog>
</h:form>
使用从标记调用的方法从托管 bean 中提取:
@Named(value = "galleryManagedBean")
@RequestScoped
public class GalleryManagedBean {
public void addPicturesToGallery(FileUploadEvent event)
{
System.out.println("Triggered upload");
}
}
另外我想补充一点,在我使用 Chrome 中的调试器工具检查后,Http POST 请求已正确触发。
我已将必要的库添加到类路径中,即:
commons-fileupload-1.3.jar
commons-io-2.4.jar
这是由以下变化引起的FacesServlet
JSF 2.2 的。从那个版本开始,FacesServlet
原生支持文件上传(具体来说:multipart/form-data
HTTP 请求)得益于新的 Servlet 3.0 特定的存在@MultipartConfig
注解。另外,还有一个新的<h:inputFile>
引入组件是为了在标准 JSF 组件集中提供文件上传组件。
这一切都与旧版 PrimeFaces 3.x 版本中的 PrimeFaces 文件上传功能相冲突,后者根本没有考虑到这个新的 JSF 2.2 功能。 PrimeFaces 3.x 文件上传过滤器解析并消耗了整个请求,而它应该将此工作留给FacesServlet
。这导致了FacesServlet
无法正确解码 HTTP 请求(确定提交的值和操作)。
PrimeFaces 4.0 是专门为 JSF 2.2 设计的,已经考虑到了这一切。在在 PrimeFaces 文件上传过滤器中,您可以看到为识别 JSF 2.2 并绕过过滤器中的解析所做的更改。理论上,完全删除文件上传过滤器注册也应该足够了web.xml
这样就不再使用它了。
如果您升级到 PrimeFaces 4.0,它应该可以正常工作。巧合的是,它刚刚在两天前正式发布,所以你来得正是时候。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)