我有一个 JSF 2.2 表单,其中包含一个输入文本字段和一对内嵌显示的单选按钮。鉴于 JSF 2.2 中单选按钮组的已知限制,我正在使用 BalusC 在此博客文章中概述的技术。我们无法升级到 JSF 2.3,因为这是一个 Weblogic 应用程序,我们目前锁定在 Weblogic 12.2 (JavaEE 7)。
虽然这种技术在提交有效表单时可以正常工作,但问题是如果提交了无效表单,则用户的单选按钮选择会丢失,并且会重置为最后一个有效值(或初始值)。
这是我如何定义单选按钮对的示例,使用一个h:inputHidden
元素并将其binding
属性与name
各个单选按钮的属性链接(对于它们的组 ID)。
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
<div class="form-group">
<h:outputLabel for="heightInput"
value="Height"
styleClass="col-xs-6" />
<div class="col-xs-6">
<h:inputText id="heightInput"
value="#{modelBean.height}"
required="true" />
</div>
<div class="col-xs-12">
<div class="radio-inline">
<h:outputLabel for="heightCentimeters">
<input type="radio"
jsf:id="heightCentimeters"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="CENTIMETERS"
pt:checked="#{modelBean.heightUnit eq 'CENTIMETERS' ? 'checked' : null}" />
Centimeters
</h:outputLabel>
</div>
<div class="radio-inline">
<h:outputLabel for="heightInches">
<input type="radio"
jsf:id="heightInches"
pt:name="#{hiddenHeightUnitSelection.clientId}"
value="INCHES"
pt:checked="#{modelBean.heightUnit eq 'INCHES' ? 'checked' : null}" />
Inches
</h:outputLabel>
</div>
<h:inputHidden id="heightUnitSelection"
binding="#{hiddenHeightUnitSelection}"
value="#{modelBean.heightUnit}"
rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
</div>
</div>
</ui:composition>
如果提交无效表单,如何保留用户的单选按钮选择?该模型永远不会随着他们的选择而更新。即使存在验证错误,其他表单元素也会在表单提交中保留其值。如何让我的单选按钮组表现相似?