我在h:commandLink
内有一个rich:dataTable
。当我单击命令链接时,我将FacesMessage添加到上下文并重定向到相同的消息。我在页面上有一个h:messages
标签,用于显示任何面孔消息。我能够显示该消息,但是我收到了警告,并且消息没有被清除。
警告:JSF1095:当我们尝试为闪存设置传出cookie时,响应已经提交。存储在闪存中的任何值都不会在下一个请求中提供。
我使用的是JSF2.0,RF4.0.0.Final。以下是代码
的index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:rich="http://richfaces.org/rich">
<h:head>
<title>DataTable Test</title>
</h:head>
<h:body>
<h:form prependId="false">
<rich:panel header="Data table test">
<br/><br/>
<rich:dataTable id="dTable" value="#{myBean.allInventory}" var="inv" style="margin: auto; width: 100%; min-width: 750px;"
rows="10" onrowmouseover="this.style.backgroundColor='#A0A0A0'"
onrowmouseout="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
<rich:column>
<f:facet name="header">
<h:outputText value="Sl No" />
</f:facet>
<h:outputText value="#{inv.slno}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Item 1" />
</f:facet>
<h:commandLink id="docMessage" title="Click for details" action="#{myBean.cLink(inv)}" value="#{inv.item1}"/>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Item 2" />
</f:facet>
<h:outputText value="#{inv.item2}" />
</rich:column>
<f:facet name="footer">
<rich:dataScroller id="dataScroll" for="dTable"/>
</f:facet>
</rich:dataTable>
<h:messages id="messages" globalOnly="true" layout="table" ></h:messages>
</rich:panel>
</h:form>
</h:body>
MyBean.java
package com.mypkg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
@Named
@SessionScoped
public class MyBean implements Serializable {
private List<Inventory> allInventory = null;
/**
* @return the allInventory
*/
public List<Inventory> getAllInventory() {
if (allInventory == null) {
allInventory = new ArrayList<Inventory>();
for (int i = 0; i < 100; i++) {
Inventory e = new Inventory();
e.setSlno(i + 1);
e.setItem1("Item1" + Math.random());
e.setItem2("Item2" + Math.random());
allInventory.add(e);
}
}
return allInventory;
}
public String cLink(Inventory inv) {
FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Sample Error Message", "Sample Error Message"));
return "index?faces-redirect=true";
}
/**
* @param allInventory the allInventory to set
*/
public void setAllInventory(List<Inventory> allInventory) {
this.allInventory = allInventory;
}
}
Inventory.java
/ * *要更改此模板,请选择“工具”|模板 *并在编辑器中打开模板。 * /
package com.mypkg;
public class Inventory {
private int slno;
private String item1;
private String item2;
/**
* @return the slno
*/
public int getSlno() {
return slno;
}
/**
* @param slno the slno to set
*/
public void setSlno(int slno) {
this.slno = slno;
}
/**
* @return the item1
*/
public String getItem1() {
return item1;
}
/**
* @param item1 the item1 to set
*/
public void setItem1(String item1) {
this.item1 = item1;
}
/**
* @return the item2
*/
public String getItem2() {
return item2;
}
/**
* @param item2 the item2 to set
*/
public void setItem2(String item2) {
this.item2 = item2;
}
}
答案 0 :(得分:1)
此问题与您在表格页脚中的<rich:dataScroller>
有关。当我删除它时,一切都按预期工作。
如果知道这个错误,我在RichFaces issue tracker检查过,但显然不是。您可能需要考虑在问题中重新发布代码的最小示例(多个列,标题和属性是不必要的,并且使代码不必要地大,因此将其修剪掉)在新的问题报告中。
答案 1 :(得分:1)
经过长时间的调试,我找到了100%可行的解决方案。 Glassfish对输出流进行分块,每个块都单独提交。但是在提交第一个块之后,ELFlash实现认为,整个响应都被提交并决定失败......
在glassfish中禁用分块后,所有问题都消失了。 http://www.dirkreske.de/jsf1095-with-glassfish-3-1/
电贺 德克