JSF 1.2空<h:selectmanylistbox>验证问题

时间:2016-08-08 08:07:24

标签: validation jsf-1.2

我是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;
    }
}
  1. 我在<h:inputText />填写了一些文字。
  2. 我从<h:selectManyListbox />
  3. 中选择了两个选项
  4. 我按下“保存”按钮
  5. 使用我为<h:inputText />输入的值以及我在<h:selectManyListbox />上选择的选项(未按预期显示验证消息)呈现表单。
  6. 现在......
  7. 我清空<h:inputText />
  8. 我取消选择<h:selectManyListbox />
  9. 中的两个选项
  10. 我按下“保存”按钮
  11. 表单呈现<h:inputText />为空,<h:selectManyListbox />表示我选择的先前选项(两条验证消息都按预期显示)
  12. 如您所见,呈现<h:inputText /><h:selectManyListbox />时的行为不同:

    • <h:inputText />呈现组件的提交值
    • <h:selectManyListbox />呈现bean的值

    我一直在尝试渲染<h:selectManyListbox />而没有选择任何选项,没有黑客攻击或弄乱我的代码,但没有运气。

    ¿这是一些错误吗?我错过了什么吗?

1 个答案:

答案 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();
        }
        (...)
    }
}

我创建了CustomListboxRendererListboxRenderer扩展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>