我有两个输入 - 一个在“普通”h:dataTable
内,一个在rich:dataTable
内部当我提交错误的值,即验证失败时,“正常”保持我提交的值第二个失去它。请参阅以下代码段(输入任意值并按下按钮):
@ManagedBean
@ViewScoped
public class TestController implements Serializable {
private static final long serialVersionUID = -484022507596298941L;
private String[] stringArray1 = {"Element 1", "Element 2"}; // + Getter
private String[] stringArray2 = {"Element A", "Element B"}; // + Getter
private Map<String, String> inputValues = new HashMap<String, String>(4); // + Getter
public TestController() {
inputValues.put(stringArray1[0], "");
inputValues.put(stringArray1[1], "");
inputValues.put(stringArray2[0], "");
inputValues.put(stringArray2[1], "");
}
public void doSomething() {
System.out.println("Did something");
}
public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) {
throw new ValidatorException(new FacesMessage("This can never be valid."));
}
}
<h:form>
<h1>h:dataTable</h1>
<h:dataTable id="table1" value="#{testController.stringArray1}" var="string" columnClasses="inactive">
<h:column>
<h:outputText value="#{string}:"/>
<h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
<h:message for="someInput" id="msg" style="color: red;"/>
</h:column>
</h:dataTable>
<h1>rich:dataTable</h1>
<rich:dataTable id="table2" value="#{testController.stringArray2}" var="string">
<rich:column>
<h:outputText value="#{string}:"/>
<h:inputText id="someInput" value="#{testController.inputValues[string]}" validator="#{testController.validate}"/>
<h:message for="someInput" id="msg" style="color: red;"/>
</rich:column>
</rich:dataTable>
<h:commandButton id="button" action="#{testController.doSomething}" value="do something"/>
</h:form>
这是已知的Richfaces行为还是某种错误?有没有办法让它的行为与普通的JSF-DataTable相同?使用h:dataTable
并不总是一个选项,失去你的“我只是即将纠正它”的输入是相当烦人的。
此外: 我只是检查了ui:repeat和a4j的行为:重复并且它是一样的:ui:repeat保持提交的值而a4j:repeat则没有。
更新:重新编写示例代码以排除注释中提到的一些可能的问题(输入字段现在指向不同的值;只有一个表单元素)。
在Mojarra 2.1.21上使用RichFaces 4.3.7和JBoss AS 7以及使用RichFaces 4.5.0 Alpha3和JBoss Wildlfy的Mojarra 2.2.7进行测试 - 结果相同。
答案 0 :(得分:2)
我刚刚使用Richefaces 4.3.7和Mojarra 2.2.6分别尝试了您网页的每个form
,并且它完美无缺!我没有注意到任何异常行为,当验证失败时我没有丢失任何值。这意味着Richfaces组件没有验证问题。
然而,当在单个页面中使用这两个表单时,我可以注意到,当我提交第一个表单时,第二个表单的inputText
会丢失它的值,而如果我们提交{{ 1}}第一种形式的form2
并没有丢失它的价值,我认为这是因为JSF在inputText
中存储了它的HTML组件的状态并且对Richfaces组件不做同样的事情,使用javax.faces.ViewState
您可以轻松验证这两个POST请求之间唯一的公共Firebug
是request parameter
。