2014-12-02 55 views
1

比方說,我有以下構建污染我的JSF代碼簡單很多地方:儲蓄與PrimeFaces重用標籤定義

<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 ...那裏所有重複的混亂?

郵政的答案編輯:退房this tutorial

+0

downvote,真的嗎? – amphibient 2014-12-02 20:53:44

回答

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:interface>中的<cc:attribute>元素是我們複合組件的輸入。

<?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> 

有一個屬性「標籤」的通知 - 即在「接口」元素聲明的屬性。

這是非常基本的用例,雖然它會幫助你的情況。更復雜的場景包括傳遞類型化屬性和實現支持組件 - java類,每次使用組件時都會實例化。

+0

謝謝。你知道是否有辦法將所有重複/常量屬性集中在組合中,但將變量放在最終實現中,就像我上面用'id'舉例說明的那樣? – amphibient 2014-12-03 15:31:56

+1

是的,有。當我到達我的電腦時,我會用複合組件重新修改您的示例。簡而言之,在cc:interface部分聲明組件類型,它將在使用頁面中用作此組件的標籤名稱。另外,你用cc:attribute聲明瞭一些屬性,並設置了它們的名字,類型,是否需要attibute,默認值。通過使用頁面的這些屬性將可變參數傳遞給組件。 Id屬性有特殊的含義。您不應該在界面中聲明它,它可以使用#{cc.clientId} EL表達式進行訪問。 – iTollu 2014-12-03 16:52:20

+0

謝謝。另外,如果你可以提供一個實際的小例子,那會很好 – amphibient 2014-12-03 17:01:42