2009-03-29 5 views
5

Comment rendre correctement une liste d'objets dans jsp avec différents types? Dire, par exemple, je dois rendre ces différents objets dans un ordre spécifié.Rendu personnalisé dans JSP basé sur le type de classe sans instanceof

variables Une façon pourrait être d'utiliser un type commun ou instanceof mais cela signifie avoir un gros commutateur/instruction if pour les gérer:

<c:forEach var="o" items="${bigListofObjects}" > 
    <c:choose> 
     <c:when test='${o.type=="simple"}' > 
     <!-- render simple --> 
     </c:when> 
     <c:when test='${o.type=="complex"}' > 
     <!-- render complex --> 
     </c:when> 
     <!-- etc etc ... --> 
    </c:choose> 
</c:forEach> 

je pourrais ajouter une méthode render() à chaque classe, mais alors cela signifie mélanger la vue avec le reste du code. Que se passe-t-il si je veux rendre un autre type plus tard? Y a-t-il quelque chose que je pourrais faire avec les balises jsp personnalisées?

Répondre

6

Vous pouvez inclure un autre fichier jsp qui effectuera le rendu correct pour un type donné. par exemple:

<c:forEach var="o" items="${bigListofObjects}" > 
    <c:import url="render-${o.type}.jsp"/> 
</c:forEach> 
0

Vous pourriez avoir une boucle foreach externe qui effectue une itération sur une liste de la liste des types:

<c:forEach var="t" items="${listOfTypes}"> 
    <c:forEach var="o" items="${bigListofObjects}"> 
     <if test='${o.type==t}'> 
      <!-- render --> 
     </c:if> 
    </c:forEach> 
</c:forEach> 
1

Vous pouvez créer une interface avec une méthode commune pour chaque classe pour mettre en œuvre qui émettait le HTML/JSP dont vous aviez besoin d'une manière polymorphe. Je ne suis pas si fou de cette suggestion, car il fuit l'interface utilisateur dans les classes de modèles dans un mauvais sens. Peut-être un autre moyen de contourner ce serait un modèle de visiteur qui pourrait émettre l'interface utilisateur pour vous.

De toute façon, vous auriez à ajouter du code quand un nouveau type est apparu. Je serais réticent à créer une bibliothèque de balises personnalisée.

Vous devez faire attention à ce que le style ne fuit pas, rendant le skin CSS impossible.

Questions connexes