簡體   English   中英

JSF中的動態組件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM