3

我想为内置组件创建自定义渲染器:<h:selectOneRadio /> 我想知道,如何确定内置组件的渲染器以创建自己的渲染器并从中扩展?

我想知道一种获取它的机制,以便我可以应用它来确定任何其他内置组件的渲染器,而不仅仅是<h:selectOneRadio />.

谢谢

4

1 回答 1

7

标准 JSF 组件的渲染器类是特定于实现的(Mojarra 和 MyFaces 都有自己的实现),并且注册为<renderer>特定于实现的faces-config.xml(或它的工件)。

要找到它,你基本上需要先知道组件族和渲染器类型,这样你就可以自己在实现特定的faces-config.xml文件中查找渲染器类。

您的出发点是javax.faces.component.html摘要。由组件类<h:selectOneRadio>表示。它的 javadocHtmlSelectOneRadio的介绍性文本说:

默认情况下,rendererType 属性必须设置为“ javax.faces.Radio”。

有渲染器类型。

组件系列在同一个 javadocCOMPONENT_FAMILY的“继承自的字段UISelectOne”部分下被指定为常量。点击进入“常量字段值”

public static final java.lang.String COMPONENT_FAMILY " javax.faces.SelectOne"

有组件族。

现在,我们应该查看特定于实现的faces-config.xml文件(或它的工件)。不幸的是,它的位置/名称没有记录在案,但我可以说,在 Mojarra 的情况下,它是com/sun/faces/jsf-ri-runtime.xml实现 JAR 文件中的文件(您可以使用 zip 工具提取 JAR 文件)。打开它并查找与组件系列和渲染器类型<renderer>匹配的条目:javax.faces.SelectOnejavax.faces.Radio

<renderer>
    <component-family>javax.faces.SelectOne</component-family>
    <renderer-type>javax.faces.Radio</renderer-type>
    <renderer-class>
         com.sun.faces.renderkit.html_basic.RadioRenderer
    </renderer-class>
</renderer>

最后是它:com.sun.faces.renderkit.html_basic.RadioRenderer.

请注意,精确地扩展该类会将您的自定义渲染器与特定的 JSF 实现结合起来。您的渲染器将无法在不同的实现(例如 MyFaces)上重用。为了实现独立,您需要自己编写扩展的整个渲染器javax.faces.renderer.Renderer

也可以看看:

于 2012-10-11T11:31:11.467 回答