這兩天項(xiàng)目進(jìn)行了到了菜單組件的開(kāi)發(fā).把能使用的JSF的Tree組件都翻了個(gè)遍,試了個(gè)遍.沒(méi)有中意的.要不是太復(fù)雜就是太難用.(好象差不多一個(gè)意思^_^).最后決定自己開(kāi)發(fā)一個(gè)Tree組件.
有如下功能:
1、數(shù)據(jù)要能夠與bean聯(lián)系起來(lái),因?yàn)椴藛问莿?dòng)態(tài)的從數(shù)據(jù)庫(kù)里取出來(lái)或動(dòng)態(tài)生成的;
2、要無(wú)限級(jí)次的(其實(shí)有點(diǎn)變態(tài),那有那么層次的菜單);
3、要是DIV+CSS的,不要table的(這么多大的、知名的JSF組件為什么都是table布局呢?難道他們和我一樣不會(huì)用DIV?^_^)
...
在網(wǎng)上一找,有一個(gè)DIV+CSS的tree組件出現(xiàn)了。在 http://cnlei.iecn.net/
下來(lái)源碼一看很清晰。連我這不懂CSS的也看得明白了一大半。決定就對(duì)它進(jìn)行改造。生成JSF的組件。
在開(kāi)發(fā)的過(guò)程中有一些要記錄的:
1、JSF1.2的組件開(kāi)發(fā)和JSF1.1有的很大的不同。尤其是EL表達(dá)式。而且是extends的基類(lèi)也不同。
JSF1.2中的TagLib要繼承javax.faces.webapp.UIComponentELTag。
2、TagLib接受的屬性只能是ValueExpression類(lèi)型。如果需要用字符型。需要再進(jìn)行處理。不象JSF1.1中有方法判斷是表達(dá)式還是值。
接受表達(dá)的值,并給組件賦值:
private ValueExpression value;
...
if (value != null)
component.setValueExpression("value",
value);
如果要接受字符串的屬性要這樣得到字符串的值。
if (id != null)
{
component.setId(id.getExpressionString());
}
3、如果想把組件在Facelets中應(yīng)用,要寫(xiě)Renderer。(至少我是這樣,不寫(xiě)Renderer在Facelets中就不能應(yīng)用。但在JSP中可以使用)還要寫(xiě)一個(gè)componets.tablib.xml。
在Renderer中得到表達(dá)式的值:
ValueExpression valueVe = component.getValueExpression("value");
if
(valueVe != null) {
Object _object =
valueVe.getValue(context.getELContext());
//...
}
4、要在faces-config.xml中配置component 和render-kit.
總之寫(xiě)JSF的組件是很麻煩的事情。如果有其他的選擇還是不要自己寫(xiě)。但是寫(xiě)好之后用起卻是非常的方便的。
<xy:tree value="#{menuBean.nodes}"
title="#{resource.menu_title}"/>
一句話(huà)就可以生成一樹(shù)。很爽吧!

附源碼(Eclipse 工程) 下載源碼
源碼中沒(méi)有相關(guān)jar 包,加在一起太大了沒(méi)辦法上傳。用到的jar包如下:
commons-beanutils.jar
commons-codec.jar
commons-collections.jar
commons-digester.jar
commons-el.jar
commons-fileupload.jar
commons-lang.jar
commons-logging.jar
commons-validator.jar
jakarta-oro.jar
javaee.jar
jsf-api.jar
jsf-impl.jar
jstl-1.2.jar
jstl.jar
log4j-1.2.8.jar
如果有沒(méi)辦法找到可以給我發(fā)Email:wfn_libo # 163.com