看了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 规范中描述的那样,也不像代码注释中描述的那样。它可能不是一个错误,但它有点令人困惑。