【问题标题】:JSF 1.2 empty <h:selectManyListbox /> validation issueJSF 1.2 空 <h:selectManyListbox /> 验证问题
【发布时间】:2016-08-08 08:07:23
【问题描述】:

我是 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>

我的支持豆是这样的:

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. 我用一些文字填写了&lt;h:inputText /&gt;
  2. 我从&lt;h:selectManyListbox /&gt; 中选择了两个选项
  3. 我按下“保存”按钮
  4. 使用我为&lt;h:inputText /&gt; 输入的值和我在&lt;h:selectManyListbox /&gt; 上选择的选项呈现表单(没有显示验证消息,如预期的那样)
  5. 现在...
  6. 我清空了&lt;h:inputText /&gt;
  7. 我从&lt;h:selectManyListbox /&gt; 中取消选择这两个选项
  8. 我按下“保存”按钮
  9. 表单将 &lt;h:inputText /&gt;&lt;h:selectManyListbox /&gt; 呈现为空,并使用我之前选择的选项(如预期的那样显示两个验证消息)

如您所见,渲染&lt;h:inputText /&gt;&lt;h:selectManyListbox /&gt; 时的行为是不同的:

  • &lt;h:inputText /&gt; 渲染组件的提交值
  • &lt;h:selectManyListbox /&gt; 渲染 bean 的值

我一直在尝试渲染&lt;h:selectManyListbox /&gt;,但没有选择任何选项,但没有破解或弄乱我的代码,但没有运气。

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

【问题讨论】:

  • 对此的更多输入:在构建其他表单时,我注意到文本输入具有相同的行为,然后将其转换为日期。我通过在我的 web.xml 中将 javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 设置为 true 来解决此问题。但是这样做我只能解决日期文本输入问题,h:selectManyListbox 仍然以相同的方式运行。
  • 检测到h:selectOneMenu的相同行为

标签: validation jsf-1.2


【解决方案1】:

我发现的不太老套的解决方案是复制并重新实现方法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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多