【问题标题】:Saving and reusing tag definition in PrimeFaces在 PrimeFaces 中保存和重用标签定义
【发布时间】:2015-01-31 05:42:47
【问题描述】:

假设我有以下构造在许多地方污染了我的 JSF 代码的简单性:

<p:calendar id="decisionDate"
    effect="explode" 
    yearRange="2000:2100"
    pattern="MM/dd/yyyy"
    navigator="true" display="inline"
    value=""
    label="Decision Date"
    maxlength="10"
    size="20">
        <f:convertDateTime pattern="MM/dd/yyyy" />
</p:calendar>

可以看出,它有九 (9) 个属性和一个嵌套标签。这是一个非常繁琐的细节,需要你的眼睛来理解。

有没有一种方法可以像CSS一样重用PrimeFaces标签:将复杂的标签定义保存为&lt;px:myCalendar/&gt;,上面的参数减去ID,应该为每个实例设置尽管如此,px 将是我的命名空间,然后每次我需要调用它时,我都会说 &lt;px:myCalendar id="uniqueCalID"/&gt; 和 ... BOOM ... 所有重复的混乱都消失了吗?

发布答案编辑:查看this tutorial

【问题讨论】:

    标签: jsf primefaces refactoring code-reuse


    【解决方案1】:

    您可以定义复合组件。它是使用 xhtml+ jsf 命名空间定义的,但在您的情况下,它是不必要的支持组件,它是 java 类,为每个复合组件的使用实例化。

    在复合组件接口中,您可以定义属性,从而改变其行为。然后在实现中,您可以插入所需的 primefaces 组件,其中包含一些硬编码属性和一些从您的复合组件调用传递的属性。

    考虑这个教程:https://docs.oracle.com/javaee/6/tutorial/doc/giqzr.html

    示例

    复合组件是资源,所以我们把它放在/resources文件夹下面。让我们创建子文件夹/resources/myCompositeComponents 并在那里创建xhtml 文件myCalendar.xhtml。这将是我们的复合组件。基本上,它是带有额外命名空间xmlns:cc="http://java.sun.com/jsf/composite" 的xhtml 文件。这是代码。您可以注意到两个元素:&lt;cc:interface&gt;&lt;cc:implementation&gt;。而&lt;cc:interface&gt; 中的&lt;cc:attribute&gt; 元素是我们复合组件的输入。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:f="http://xmlns.jcp.org/jsf/core"
          xmlns:cc="http://java.sun.com/jsf/composite"
          xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html">
    <cc:interface>
        <cc:attribute name="label" default="Decision Date"/>
    </cc:interface>
    <cc:implementation>
        <h2>#{cc.clientId}</h2>
        <h:outputLabel
                id="Label"
                value="#{cc.attrs.label}"/>
        <p:calendar id="Calendar"
                    effect="explode"
                    yearRange="2000:2100"
                    pattern="MM/dd/yyyy"
                    navigator="true" display="inline"
                    value=""
                    label="Label"
                    maxlength="10"
                    size="20">
            <f:convertDateTime pattern="MM/dd/yyyy" />
        </p:calendar>
    </cc:implementation>
    </html>
    

    那么,让我们使用它。为了能够声明我们全新的组件,我们将在使用页面中添加额外的命名空间:xmlns:my="http://java.sun.com/jsf/composite/myCompositeComponents"。命名空间 uri 的最后一部分对应于 /resources 下的文件夹,复合组件所在的位置。给它任何你喜欢的前缀。这是源代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html
            PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:my="http://java.sun.com/jsf/composite/myCompositeComponents">
    
    <h:head>
        <title>Simple JSF Facelets page</title>
    </h:head>
    
    <h:body>
        <my:myCalendar id="LetsUseIt" label="MyLabel"/>
    </h:body>
    
    </html>
    

    注意属性“label”——即在“interface”元素中声明的属性。

    这是非常基本的用例,尽管它会在您的情况下有所帮助。更复杂的场景包括传递类型属性和实现支持组件 - java 类,每次使用组件时都会实例化。

    【讨论】:

    • 谢谢。你知道是否有一种方法可以将所有重复/常量属性集中在组合中,但将变量 one(s) 放在最终实现中,就像我上面用id 举例说明的那样?
    • 是的,有。当我到达我的电脑时,我将使用复合组件重新制作您的示例。简而言之,在 cc:interface 部分中声明组件类型,它将作为该组件在使用页面中的标记名称。此外,您使用 cc:attribute 声明一些属性并设置它们的名称、类型、是否需要属性、默认值。通过使用页面的这些属性将可变参数传递给组件。 id 属性有特殊含义。你不应该在接口中声明它,它可以通过#{cc.clientId} EL表达式访问。
    • 谢谢。另外,如果你能提供一个实际的小例子,那就太好了
    • 我的意思是 中的元素 。它声明您的组件在某些页面中使用时将接受属性“label”:.
    • 值得注意的是,复合组件不仅仅特定于 Primefaces - 它们是 JavaServer Faces 2.x 规范的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多