我是JSF的新手,我很难理解JSF在验证失败后在表单中呈现的值。我正在使用WebSphere 7及其默认的JSF实现,MyFaces(我认为2.0)。
我的xhtml看起来像这样:
<h:form id="form">
<h:inputText id="text" value="#{backing.text}" required="true"/>
<h:message for="text" />
<h:selectManyListbox id="options" value="#{backing.options}" required="true">
<f:selectItem itemLabel="1" itemValue="1" />
<f:selectItem itemLabel="2" itemValue="2" />
<f:selectItem itemLabel="3" itemValue="3" />
</h:selectManyListbox>
<h:message for="options" />
<h:commandButton value="Save" />
</h:form>
我的支持bean就像这样:
public class Backing {
private String text;
private String[] options;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String[] getOptions() {
return options;
}
public void setOptions(String[] options) {
this.options = options;
}
}
<h:inputText />
填写了一些文字。<h:selectManyListbox />
<h:inputText />
输入的值以及我在<h:selectManyListbox />
上选择的选项(未按预期显示验证消息)呈现表单。<h:inputText />
<h:selectManyListbox />
<h:inputText />
为空,<h:selectManyListbox />
表示我选择的先前选项(两条验证消息都按预期显示)如您所见,呈现<h:inputText />
和<h:selectManyListbox />
时的行为不同:
<h:inputText />
呈现组件的提交值<h:selectManyListbox />
呈现bean的值我一直在尝试渲染<h:selectManyListbox />
而没有选择任何选项,没有黑客攻击或弄乱我的代码,但没有运气。
¿这是一些错误吗?我错过了什么吗?
答案 0 :(得分:0)
我找到的解决方案越少,就是复制并重新实现方法renderOption
,覆盖默认的MenuRenderer
。
原始源是这样的,因为我必须反编译(版本1.2_13)。 请注意,我只粘贴了实际需要更改的行。如果您需要使用此解决方案,则必须复制方法的全部内容:
public class MenuRenderer extends HtmlBasicInputRenderer {
protected void renderOption(FacesContext context, UIComponent component, Converter converter, SelectItem curItem, Object currentSelections, Object[] submittedValues, HtmlBasicRenderer.OptionComponentInfo optionInfo) throws IOException {
(...)
Object valuesArray;
Object itemValue;
if (submittedValues != null) {
boolean containsValue = containsaValue(submittedValues);
if (containsValue) {
valuesArray = submittedValues;
itemValue = valueString;
} else {
valuesArray = currentSelections;
itemValue = curItem.getValue();
}
} else {
valuesArray = currentSelections;
itemValue = curItem.getValue();
}
(...)
}
}
我创建了CustomListboxRenderer
(ListboxRenderer
扩展MenuRenderer
),如下所示:
public class CustomListboxRenderer extends ListboxRenderer {
@Override
protected void renderOption(FacesContext context, UIComponent component, Converter converter, SelectItem curItem, Object currentSelections, Object[] submittedValues, HtmlBasicRenderer.OptionComponentInfo optionInfo) throws IOException {
(...)
Object valuesArray;
Object itemValue;
if (submittedValues != null) {
valuesArray = submittedValues;
itemValue = valueString;
} else {
valuesArray = currentSelections;
itemValue = curItem.getValue();
}
(...)
}
}
然后在faces-config中添加下一行:
<render-kit>
<renderer>
<component-family>javax.faces.SelectMany</component-family>
<renderer-type>javax.faces.Listbox</renderer-type>
<renderer-class>CustomListboxRenderer</renderer-class>
</renderer>
</render-kit>