2

根据 JSF 规范,ah:selectOneMenu被呈现为 HTML<select>元素,其中“size”属性设置为项目数:

使用项目数作为“大小”属性的值。

(来自selectOneMenu 的标签文档

但是,当我h:selectOneMenu在页面中使用时(使用 Mojarra 或 MyFaces),渲染的 size 属性<select>始终设置为 1。

谷歌搜索还发现许多页面只是声称h:selectOneMenu应该呈现“下拉菜单”(这是大多数浏览器呈现的<select size="1">[...].

那么这是 JSF 规范中的错误,还是我忽略了一些细节?为什么尺寸的行为不符合规范中的描述?

4

1 回答 1

2

看了com.sun.faces.renderkit.html_basic包中的 MenuRenderer 类的源代码后,不清楚是否是规范中的错误。

为了渲染 h:selectOneMenu 组件以及 h:selectManyMenu 组件,调用了 renderSelect 方法。关于 size 属性:

  • 如果未指定(这是 selectOneMenu 的情况),则设置默认值。
  • 如果指定,the "size" attribute will be rendered as one of the "pass thru" attributes.

这是源代码:

 protected void  [More ...] renderSelect(FacesContext context,
                            UIComponent component) throws IOException {

    [...]

    // Determine how many option(s) we need to render, and update
    // the component's "size" attribute accordingly;  The "size"
    // attribute will be rendered as one of the "pass thru" attributes

    [...]

    // If "size" is *not* set explicitly, we have to default it correctly
    Integer size = (Integer) component.getAttributes().get("size");
    if (size == null || size == Integer.MIN_VALUE) {
        size = count;
    }
    writeDefaultSize(writer, size);

    RenderKitUtils.renderPassThruAttributes(context,
                                    writer,
                                    component,
                                    ATTRIBUTES,
                                    getNonOnChangeBehaviors(component));

    [...]

}

混乱在于 writeDefaultSize 方法。它总是将默认大小设置为 1,即使要呈现的选项数量由 itemCount 参数给出:

 protected void  [More ...] writeDefaultSize(ResponseWriter writer, int itemCount)
    throws IOException {
     // if size is not specified default to 1.
     writer.writeAttribute("size", "1", "size");
 }

所以大小既不像 JSF 规范中描述的那样,也不像代码注释中描述的那样。它可能不是一个错误,但它有点令人困惑。

于 2013-10-16T08:26:20.130 回答