2009-03-29 12 views
5

Jak poprawnie renderować listę obiektów w jsp z różnymi typami? Powiedzmy, na przykład, że muszę renderować te różne obiekty w określonej kolejności.Niestandardowe renderowanie w JSP na podstawie typu klasy bez wystąpieniaof

Jednym ze sposobów może być użycie spotykany typ zmiennej lub instanceof ale to oznacza, mający duży przełącznik/if je wszystkie zarządzanie:

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

mogę dodać metodę render() dla każdej klasy, lecz oznacza to mieszanie widoku z resztą kodu.

Co się stanie, jeśli chcę później renderować inny typ? Czy jest coś, co mogę zrobić z niestandardowymi tagami jsp?

Odpowiedz

6

Można dołączyć inny jsp, który wykonałby poprawne renderowanie dla danego typu. na przykład:

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

Można mieć zewnętrzną pętlę foreach że iteracje nad listą listy typów:

<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

Można by utworzyć interfejs ze wspólnej metody dla każdej klasy do wdrożenia, że ​​emitowane HTML/JSP, którego potrzebujesz w sposób polimorficzny. Nie szaleję na punkcie tej sugestii, ponieważ w zły sposób przenika interfejs użytkownika do klas modeli. Być może innym sposobem byłby wzór Odwiedzającego, który mógłby wyemitować dla Ciebie interfejs użytkownika.

Tak czy inaczej, będziesz musiał dodać kod, gdy pojawi się nowy typ.

Byłbym niechętny do stworzenia niestandardowej biblioteki znaczników. Musisz być ostrożny, aby upewnić się, że styl nie wycieknie do niego, co uniemożliwi skinienie CSS.