2009-07-14 7 views
4

En supposant que j'ai une liste d'Animal (s) avec un comportement polymorphique standard comme Cat (s) et Dog (s).Comment afficher une vue JSP différente pour différents types d'objets

Quelle est la meilleure approche pour afficher une vue JSP différente pour chacun de la liste? Pour être honnête, avoir un #toJSP pour chaque bean est quelque chose que je ne considérerais pas pour des raisons évidentes.

Je suis tenté cependant d'utiliser un

public interface Template{ 

    public String render() 
} 

avec chaque animal passé dans le constructeur, mais je ne sais pas où ces objets doivent être créés. Je suppose que cela peut être fait à l'intérieur de la JSP dans un < %%> mais j'hésite à utiliser cette notation pour une raison quelconque.

+0

Damn. On dirait que la réponse est "JSP complètement nul". Pas cool. – aaaidan

Répondre

1

donc j'ai fini avec les "paquets" qui sont disponibles pour i18n en JSP de la manière suivante

<fmt:message var="template" key="${animal.class.name}" /> 

avec template.properties fichier

foo.bar.Animal = animal.jsp 
foo.bar.Cat = cat.jsp 
foo.bar.Dog = dog.jsp 

Ainsi, la solution finale ressemblerait à ceci

<c:forEach var='animal' items='${animals}'> 
    <span> 
     <c:set var="animal" scope="request" value="${animal}"/> 
     <fmt:message var="template" key="${animal.class.name}" /> 
     <jsp:include page="${template}" /> 
    </span> 
</c:forEach> 

Avec gabarit fichiers qui ressemble à ceci

Hello animal ${animal}! 
Hello cat ${animal}! 
Hello dog ${animal}! 
0

Déclare une méthode abstraite sur Animal qui renvoie une chaîne, appelée getMyJspPage(). Puis les chats et les chiens peuvent renvoyer une référence à une page jsp ou un fragment jsp différent que vous pouvez inclure.

1

Vous pouvez utiliser une balise personnalisée qui prend l'animal en cours comme un attribut et l'utilise pour déterminer la vue correcte

1

Malheureusement, le travail de l'héritage et le polymorphisme ne marche pas dans jsps très bien.

Le plus simple, et la solution la plus maintenable a été de le faire beaucoup de

<c:choose> 
    <c:when test="${animal.type == 'Cat'}"> 
     <my:renderCat cat="${animal}"/> 
    </c:when> 
    <c:when test="${animal.type == 'Dog'}"> 
     <my:renderDog Dog="${animal}"/> 
    </c:when> 
    ... 
</c:choose> 

et ont des fichiers de balises (comme renderDog.tag, renderCat.tag) qui prend chaque animal spécifique comme un attribut, et appelez-les. au moins il garde l'expédition, et le rendu est séparé.

Questions connexes