2010-08-17 9 views
4

Je suis intéressé par la création d'un composant dynamique dans JSF. J'entends par là un composant qui regarde et agit différemment en fonction des variables qui lui sont transmises.Composants dynamiques dans JSF

Prenons un exemple simple qui fonctionne réellement. Un composant composite (facelet) qui cache/montre différentes parties de lui-même en fonction des données. Dans ce cas, il prend un attribut nommé "myBean", que vous pouvez imaginer avoir un champ "value" et un champ "type". Le champ "type" détermine quel composant doit être rendu.

<?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> 

Bien que cela fonctionne, il devient rapidement difficile à manier. Si j'ai vingt types différents, je les ai tous spécifiés dans le même document et cela viole clairement le bon design.

Au lieu de cela, je voudrais être en mesure de remplacer la mise en œuvre avec quelque chose comme:

<ui:include value="#{myBean.type}"/> 

Ce que je comprends est pas possible, puisque ui:include se produit lorsque la construction de l'arborescence des composants, et le composant est traité au cours la phase de rendu.

Pourtant, cela doit être un problème commun. Quelle est la meilleure approche pour réaliser des composants dynamiques? J'utilise JSF 2.0, si cela fait une différence.

Répondre

2

Je ne vois pas de meilleurs moyens. XML n'est pas un langage OO. C'est le meilleur que vous pouvez obtenir avec XML. Si vous voulez le faire de la manière OO, alors vous devriez créer un composant réel avec un moteur de rendu. Par ailleurs, les composants composites ont été introduits dans JSF 2.0 et ne sont donc pas disponibles dans JSF 1.x. Donc, ça ne fait pas beaucoup de différence;)

+0

Vous savez, j'en arrive à la même conclusion moi-même. Il semble qu'il pourrait y avoir un avantage à cette approche par rapport à la modification dynamique de l'arbre des composants: le composant ne sera disponible qu'une seule fois dans l'arborescence des composants, même s'il se trouve dans un ui: repeat (pattern fly-weight). +1, mais pour l'instant je vais laisser la question ouverte. – waxwing

Questions connexes