2013-10-04 55 views
6

我无法在PrimeFaces 3.5上使fileUpload组件启动事件。我已经阅读了许多关于该主题的文章,并在那里提出建议,但仍然无效。我尝试了所有模式(简单,自动,高级),但没有成功。fileUpload不会在PrimeFaces 3.5中使用JSF 2.2触发事件

如果我使用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> 

这是与文件上传标签我认为网页的一部分:

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

从与被调用的方法管理豆提取物从标签:

@Named(value = "galleryManagedBean") 
@RequestScoped 
public class GalleryManagedBean { 
    public void addPicturesToGallery(FileUploadEvent event) 
    { 
     System.out.println("Triggered upload"); 
    } 
} 

另外我想补充说,HTTP POST请求被正确解雇后,我使用Chrome中的调试工具对其进行检查。

我已经加入所需的库到类路径,即:

commons-fileupload-1.3.jar 
commons-io-2.4.jar 
+1

PF 3.5专为JSF 2.0/2.1开发,不一定能保证与JSF 2.2一起工作。 PF 4.0是专门为JSF 2.2开发的,恰巧在2天前发布。我建议试试看。 – BalusC

+0

宾果!它适用于PF 4.0。谢谢@BalusC! – bajer83

+0

太好了。我做了更多的研究并发布了一个答案。 – BalusC

回答

6

这是通过在JSF 2.2 FacesServlet的变化引起的。自该版本以来,FacesServlet本身支持文件上载(具体为:multipart/form-data HTTP请求),这要归功于新Servlet 3.0特定@MultipartConfig注释的存在。此外,还引入了一个新的<h:inputFile>组件,以在标准JSF组件集中提供文件上载组件。

这一切都与PrimeFaces文件上传工具在较旧的PrimeFaces 3.x版本中存在冲突,因为它们根本没有考虑到这个新的JSF 2.2功能。 PrimeFaces 3.x文件上传过滤器解析并使用整个请求,而它应该将此作业保留至FacesServlet。这导致FacesServlet无法正确解码HTTP请求(确定提交的值和操作)。

专为JSF 2.2设计的PrimeFaces 4.0将这一切考虑在内。在PrimeFaces文件上传过滤器的this changeset中,您可以看到所做的更改以识别JSF 2.2并绕过过滤器中的解析。从理论上说,完全删除web.xml中的文件上传过滤器注册也已足够,因此不再使用。

如果升级到PrimeFaces 4.0,它应该可以正常工作。它恰巧在2天前正式发布,所以你准时为此付出。

相关问题