如何在JSF中创建现有组件的组合?

时间:2011-03-07 12:02:12

标签: jsf components facelets

我想知道是否可以编写自己的组件(或称之为Widget,Object)。

我的意思是,而不是(例如)在其中使用h:panelGrouph:outputLabel,而是创建我自己的h:panelMarkzzz,作为panelGroup和outputLabel的组合。

JSF可以吗?

2 个答案:

答案 0 :(得分:7)

是的,可以创建这样的现有组件的组合。

开球示例:

/resources/foo/group.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:cc="http://xmlns.jcp.org/jsf/composite">
    <cc:interface>
        <cc:attribute name="label" type="java.lang.String" required="true" />
    </cc:interface>
    <cc:implementation>
         <h:panelGroup>
             <h:outputLabel value="#{cc.attrs.label}" />
             <cc:insertChildren />
         </h:panelGroup>
    </cc:implementation>
</html>

/test.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:foo="http://xmlns.jcp.org/jsf/composite/foo">
    <h:head>
        <title>Test</title>
    </h:head>
    <h:body>
        <foo:group label="Label value">
            <h:outputText value="This will appear after label inside the panelgroup" />
        </foo:group>
    </h:body>
</html>

/foo文件夹名称可以随意使用,您可以在XML名称空间中将其引用为http://xmlns.jcp.org/jsf/composite/XXX。 XHTML文件名是标记名称。

也就是说,复合组件具有性能影响,只有在使用简单的include或tagfile无法实现功能要求时才能使用它们。在您的特定情况下,您最好使用标记文件。只有在<cc:interface componentType="...">实际需要它时才能使用复合组件。

另见:

答案 1 :(得分:2)

也许你的意思是Composite Components