我使用的是JSF 2.0,Primefaces 3.4.2,Spring 3.1.2。p:commandButton与p:fileDownload和没有ajax只能在第二次点击
我正面临类似的问题,这个链接的家伙:h:commandButton works from the second click。
像他一样,我没有在<p:commandButton>
中使用ajax,但我在按钮标签中使用了<p:fileDownload />
。
我有两个意见:“list.xhtml”和“downloadView.xhtml”。在myBean.java
我发送从视图“list.xhtml”一个的DataModel查看“downloadView.xhtml”作为请求属性作为显示在下面的代码:
FacesUtil.getServletContext().setAttribute("myDataModelFromRequest", this.myDataModel);
的bean被anotted与@Scope("view")
鉴于“downloadView.xhtml”我用请求发送的DataModel成功填充dataTable。但是当我点击按钮下载文件时,问题就发生了。它只能在第二次尝试。 我已经试图将我的方法从null更改为“downloadView”,但问题没有解决。
在调试模式下,我注意到只有在第二次点击时才进入“downloadMethod()”。
任何人有想法解决它?
myBean.java
public String viewListMethod() {
//some work here...
FacesUtil.getServletContext().setAttribute("myDataModelFromRequest", this.myDataModel);
return "downloadView";
}
downloadView.xhtml
<h:form id="formId" prependId="false">
<p:dataTable
id="dataTableId" var="myVar" value="#{myDataModelFromRequest}"
selection="#{cargaProcessoControlador.myArray}"
paginator="true" rows="10" paginatorPosition="bottom" paginatorAlwaysVisible="false">
<f:facet name="header">
bla bla bla
</f:facet>
<p:column selectionMode="multiple" style="width:18px" />
//collumns here...
</p:dataTable>
<p:commandButton id="btDownload" ajax="false" value="Download" icon="ui-icon-document" >
<p:fileDownload value="#{myBean.downloadMethod()}" />
</p:commandButton>
</h:form>
但问题症状表明您正在通过ajax进行导航。这是真的?要排除一个和其他,请尝试'返回“downloadView?faces-redirect = true”;'。顺便说一句,servlet上下文不代表请求范围,而是应用程序范围。因此,您可以有效地为** all **应用程序用户设置/覆盖数据!这不是你具体问题的原因,但我强烈建议修复并将其限制在最多会话范围内,否则在生产过程中会遇到重大问题。 – BalusC
它也可能是由于第一个请求(当页面被加载时)和第二个请求(当你点击按钮时)之间的'myDataModelFromRequest'变化引起的。不确定阶段的名称,但它不喜欢什么时候对象在某个时刻改变并停止。 我想@BalusC知道周围的细节。 (请记住阅读关于它的帖子) – grekier