我在JSF验证后遇到问题
场景 - 我在表单上有2个下拉列表和2个输入字段。在选择第一个下拉列表时,将填充第二个,并且2个文本字段的值也取决于第一个下拉选择。
1)因此,当我从第一个下拉列表中选择一些值时,第二个下拉列表中的文本字段将填充适当的值。 2)当我点击提交按钮而不选择第二个下拉列表中的值时,它会按预期显示验证消息。 3)现在我在验证错误/失败后更改了第一次下拉的值。文本字段中的值未按要求更改(表示文本字段值仍显示旧值),但第二个下拉值正在按预期更改。
注意: - 问题仅在验证失败后才会出现。
<span class="col1 smallRightPadding marginBtmAdDiag">
<rich:select defaultLabel="Select bldng" enableManualInput="true"
id="search_bldng"
value="#{testManagedBean.bldng.bldngID}"
required="true" requiredMessage="#{testHome.selectBldng}">
<f:selectItemsvalue="#{testManagedBean.lstBldng}" var="bldngVar"
itemValue="#{bldngVar.bldngID}" itemLabel="#{bldngVar.bldngCode}">
</f:selectItems>
<a4j:ajax execute="@this" event="selectitem"
listener="#{testManagedBean.populateFloor}"
render="search_floor,hidSelBldng,hidSelFloor,hidSelbldngID" />
</rich:select>
<h:inputHidden id="hidSelBldng" value="#{testManagedBean.bldng.bldngCode}" />
<h:inputHidden id="hidSelbldngID" value="#{testManagedBean.bldng.bldngID}" />
</span>
<rich:select defaultLabel="Select Floor" enableManualInput="true"
id="search_floor"
value="#{testManagedBean.floor.floorID}"
required="true"
requiredMessage="#{testHome.selectFloor}">
<f:selectItems value="#{testManagedBean.floorLst}"
var="flr" itemValue="#{flr.floorID}"
itemLabel="#{flr.floorName}">
</f:selectItems>
</rich:select>
<h:commandButton id="goButtonId" value="#{testHome.goButton}" styleClass="saveButton">
<a4j:ajax event="click" execute="@form" oncomplete="drawLayerFromBtn();"
listener="#{testManagedBean.viewReport}"
render="tableId,hidSelFloor"/>
</h:commandButton>
答案 0 :(得分:0)
问题
在验证错误后重置输入字段上的本地值是经典的jsf-2问题。验证失败后,JSF不会重置先前验证错误中捕获的字段的值,因此您仍然看到旧值的原因
解决
您基本上需要自己重置这些(缺失的)文本字段的值。在方便的地方,也许在populateFloor
if(ctxt.isValidationFailed()){
UIInput textField1 = (UIInput) FacesContext.getCurrentInstance().getViewRoot().findComponent("theTextFieldId")
textField1.resetValue();
}
只有当前请求周期被标记为失败时,才会执行上面的代码段,然后使用id="textField1"