我遇到了<p:fileUpload>
PrimeFaces的问题。我创建了一个Facelet页面来上传Excel文件,如下所示:
<p:fileUpload fileUploadListener="#{blackListImportBean.xlsFileUpload}"
multiple="true" allowTypes="*.xls;*.xlsx" description="*.xls;*.xlsx"
sizeLimit="100000"/>
<h:commandButton actionListener="#{blackListImportBean.test}"
value="#{msg.SAVE}" action="test-page.xhtml" />
和bean的java代码如下:
public void xlsFileUpload(FileUploadEvent event){
// ...
}
public void test() {
// ...
}
当我单击按钮时,调用方法test()
并且不调用方法xlsFileUpload()
并且错误提示它找不到方法xlsFileUpload()
,因为该方法需要参数。当我删除参数时,页面找不到该方法。困扰我的另一个问题是我无法获取上传文件。我按照文档做了,我不知道该怎么做。
答案 0 :(得分:0)
不要忘记在web.xml中添加:
<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>
答案 1 :(得分:0)
两个问题:
1)您使用的是Primefaces 2.X还是3.X? 2)堆栈跟踪上有什么?它可能包含有关原因的信息。
文件上传组件在其自己的事件序列上传文件,以便在用户触发文件上载时触发。这可以通过属性auto =“true”自动进行。或者,它会显示一个“上传”按钮,导致上传。因此,它与第二个动作分开,这是你的测试方法。
从它无法找到你的方法的事实来看,我猜不管bean是不受管理的还是你的环境不同步(干净的构建)。
另外,尝试一个简单的测试:
@ViewScope
public class TestBean
{
public void handleFileUpload(FileUploadEvent evt)
{
System.out.println("Handling Upload: " + evt.getFile());
UploadedFile upload = evt.getFile();
FacesContext.getCurrentInstance()
.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "File Uploaded", "This file is " + upload));
. . . //do whatever here....
}
}
// JSF Page
. . .
<h:form>
<p:messages id="messages" />
<p:fileUpload
fileUploadListener="#{testBean.handleFileUpload}"
multiple="true"
allowTypes="*.*;"
update="messages"
/>
</h:form>
. . .
如果设置了过滤器,您应该会看到为每个上传的文件显示的一系列消息。如果没有,您应该收到有用的错误消息。此外,请注意您在路径上需要相当数量的基本Apache库(CommonsFileUpload),并且可能导致您的问题。