2010-04-27 124 views
2

我知道創建自定義JSF組件的兩種方法: 1.本機JSF方式:創建JSF組件類,標籤等。2. Facelets方式:在xhtml文件中定義組件,以及然後在facelets taglib中創建適當的解密。創建JSF自定義組件的快速方法

目前我正在開發一個項目,其中引入facelets是不幸的。另一方面,創建自定義組件標準的JSF方式似乎是一個痛苦的屁股。

是否有第三方庫允許以類似於facelets的方式創建自定義組件,但不需要使用非標準渲染器?

+0

這是JSF 2.0嗎? – Bozho 2010-04-27 10:28:05

+1

@Boz:不要以爲「facelets是沒有問題的」,並且使用JSF 2.0和Facelets創建組件實際上是小菜一碟。屁股的疼痛聽起來像JSF 1.x,因爲它非常詳細/不透明;) – BalusC 2010-04-27 11:29:24

+0

是的,很遺憾JSF 1.x :( – mgamer 2010-04-27 12:34:17

回答

2

使用(例如)jsp:includef:subview可以進行有限的模板化。

或者,您可以擴展UIComponent覆蓋所選方法,然後使用binding屬性通過現有標記和管理bean提供它。這仍然需要對組件開發(以及這種選擇的後果)有合理的詳​​細理解,但是可以顯着減少文件/代碼量。

這種方法有點破解,但對於短期內容可能還行。您不會爲要分發的組件庫或需要長期維護的組件執行此操作。

新的組件:

public class QuickComponent extends HtmlOutputText { 
    @Override public void encodeAll(FacesContext context) throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.writeText("I'm not really a HtmlOutputText", null); 
    for (UIComponent kid : getChildren()) { 
     if (kid instanceof UIParameter) { 
     UIParameter param = (UIParameter) kid; 
     writer.startElement("br", this); 
     writer.endElement("br"); 
     writer.writeText(param.getName() + "=" + param.getValue(), null); 
     } 
    } 
    } 
} 

這個bean提供一個實例:

/**Request-scope managed bean defined in faces-config.xml*/ 
public class QuickComponentProviderBean { 
    private QuickComponent quick; 

    public void setQuick(QuickComponent quick) { 
    this.quick = quick; 
    } 

    public QuickComponent getQuick() { 
    if (quick == null) { 
     quick = new QuickComponent(); 
    } 
    return quick; 
    } 
} 

注:不要重複使用多標籤讀取一個bean的屬性在你的意見,否則它們會引用同一個對象實例。

添加新的組件給視圖:

<h:outputText binding="#{quickComponentProviderBean.quick}"> 
    <f:param name="Hello" value="World" /> 
</h:outputText> 

注意:可以被定義並沒有改變的屬性。它們由TLD修復。