[英]Dynamic components in 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,如果有幫助的話。
我看不出更好的方法。 XML不是OO語言。 這是XML所能提供的最好的東西。 如果要以OO方式進行操作,則應使用渲染器創建真實的組件。
順便說一下,復合組件是在JSF 2.0中引入的,因此在JSF 1.x中不可用。 所以它並沒有太大的區別;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.