2009-03-29 4 views
5

Wie würden Sie eine Liste von Objekten in JSP mit unterschiedlichen Typen richtig darstellen? Angenommen, ich muss diese verschiedenen Objekte in einer bestimmten Reihenfolge darstellen.Benutzerdefiniertes Rendering in JSP basierend auf dem Typ der Klasse ohne instanceof

Eine Möglichkeit könnte sein, eine gemeinsame Art Variable zu verwenden oder instanceof aber das bedeutet ein großer Schalter mit/if-Anweisung, sie alle zu verwalten:

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

ich einen für jede Klasse() -Methode machen hinzufügen könnte, aber dann bedeutet das, die Ansicht mit dem Rest des Codes zu mischen.

Was passiert, wenn ich später einen anderen Typ rendern möchte? Gibt es etwas, was ich mit benutzerdefinierten JSP-Tags tun könnte?

Antwort

6

Sie könnten ein anderes JSP einschließen, das für einen gegebenen Typ das korrekte Rendering durchführen würde. zum Beispiel:

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

Sie könnten eine äußere foreach-Schleife haben, die Iteration über eine Liste der Liste der Typen:

<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

Sie könnten eine Schnittstelle mit einer gemeinsamen Methode erstellen für jede Klasse, die emittiert wird, zu implementieren die HTML/JSP, die Sie in einer polymorphen Weise benötigten. Ich bin nicht so verrückt nach diesem Vorschlag, weil er die Benutzeroberfläche schlecht in die Modellklassen einbringt. Vielleicht ein anderer Weg wäre ein Besuchermuster, das die Benutzeroberfläche für Sie ausgeben könnte.

In jedem Fall müssen Sie Code hinzufügen, wenn ein neuer Typ angezeigt wird.

Ich würde nur ungern eine benutzerdefinierte Tag-Bibliothek erstellen. Sie müssen vorsichtig sein, um sicherzustellen, dass der Stil nicht hineingelaufen ist, was CSS-Skinning unmöglich macht.