4
我有興趣在JSF中創建動態組件。我的意思是一個組件的外觀和行爲依賴於它傳遞的變量。JSF中的動態組件
讓我們來看一個實際工作的簡單例子。根據數據隱藏/顯示其自身不同部分的複合組件(facelet)。在這種情況下,它需要一個名爲「myBean」的屬性,您可以想象它具有「值」字段和「類型」字段。 「類型」字段確定應該呈現哪個組件。
<?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:jsp="http://java.sun.com/JSP/Page"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="myBean" />
</cc:interface>
<cc:implementation>
<!-- Small input field if type is "shorttext" -->
<h:inputText value="#{myBean.value}" rendered="#{myBean.type == 'shorttext'}" />
<!-- Text area input field if type is "longtext" -->
<h:inputTextArea value="#{myBean.value}" rendered="#{myBean.type == 'longtext'}" />
</cc:implementation>
</html>
雖然這個工作,它很快變得笨拙。如果我有二十種不同的類型,我將它們全部在同一份文件中指定,明顯違反了良好的設計。
相反,我希望能夠與像更換執行:
<ui:include value="#{myBean.type}"/>
我的理解是不可能的,因爲建築組件樹時出現ui:include
,而該組件在處理渲染階段。
然而,這一定是一個常見問題。什麼是實現動態組件的最佳方法?我正在使用JSF 2.0,如果這有所作爲。
你知道,我自己也得出了同樣的結論。看起來,在動態修改組件樹的過程中,這種方法甚至可能會帶來好處:即使組件樹位於ui:repeat(fly-weight模式)中,組件樹也只會是一次。 +1,但現在我將把問題留給公開。 – waxwing 2010-08-17 12:05:09