在PrimeFaces中保存和重用标签定义

时间:2014-12-02 20:41:41

标签: jsf primefaces refactoring code-reuse

假设我有以下构造在很多地方污染了我的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)个属性和一个嵌套标签。这是用你的眼睛消耗的大量乏味细节。

我是否可以通过与PrimeFaces类似的方式重复使用CSS代码:将复杂的代码定义保存为<px:myCalendar/>,并使用上述参数减去ID值,这应该是尽管如此,为每个使用实例设置,其中px将是我的命名空间,然后每次我需要调用它时,我只会说<px:myCalendar id="uniqueCalID"/>和...... BOOM ......那就是所有的反复杂乱?

POST ANSWER EDIT:查看this tutorial

1 个答案:

答案 0 :(得分: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文件。这是代码。您可以注意到两个元素:<cc:interface><cc:implementation><cc:attribute>中的<cc:interface>元素是我们复合组件的输入。

<?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类,每次使用组件时都会实例化。