我知道創建自定義JSF組件的兩種方法: 1.本機JSF方式:創建JSF組件類,標籤等。2. Facelets方式:在xhtml文件中定義組件,以及然後在facelets taglib中創建適當的解密。創建JSF自定義組件的快速方法
目前我正在開發一個項目,其中引入facelets是不幸的。另一方面,創建自定義組件標準的JSF方式似乎是一個痛苦的屁股。
是否有第三方庫允許以類似於facelets的方式創建自定義組件,但不需要使用非標準渲染器?
我知道創建自定義JSF組件的兩種方法: 1.本機JSF方式:創建JSF組件類,標籤等。2. Facelets方式:在xhtml文件中定義組件,以及然後在facelets taglib中創建適當的解密。創建JSF自定義組件的快速方法
目前我正在開發一個項目,其中引入facelets是不幸的。另一方面,創建自定義組件標準的JSF方式似乎是一個痛苦的屁股。
是否有第三方庫允許以類似於facelets的方式創建自定義組件,但不需要使用非標準渲染器?
使用(例如)jsp:include和f: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修復。
這是JSF 2.0嗎? – Bozho 2010-04-27 10:28:05
@Boz:不要以爲「facelets是沒有問題的」,並且使用JSF 2.0和Facelets創建組件實際上是小菜一碟。屁股的疼痛聽起來像JSF 1.x,因爲它非常詳細/不透明;) – BalusC 2010-04-27 11:29:24
是的,很遺憾JSF 1.x :( – mgamer 2010-04-27 12:34:17