2009-03-29 7 views
5

Come si renderà correttamente un elenco di oggetti in jsp con tipi diversi? Ad esempio, devo rendere questi oggetti diversi in un ordine specificato.Rendering personalizzato in JSP in base al tipo di classe senza instanceof

Un modo potrebbe essere quello di utilizzare una variabile di tipo comune o instanceof, ma che significa avere un grande interruttore/if per gestire tutti:

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

potrei aggiungere un metodo render() per ogni classe, ma quindi ciò significa mescolare la vista con il resto del codice.

Cosa succede se voglio eseguire il rendering di un altro tipo in seguito? C'è qualcosa che potrei fare con tag jsp personalizzati?

risposta

6

È possibile includere un altro jsp che esegua il rendering corretto per un determinato tipo. per esempio:

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

si potrebbe avere un ciclo foreach esterna che itera su un elenco di elenco dei tipi:

<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

Si potrebbe creare un'interfaccia con un metodo comune per ogni classe per implementare quella emessa l'HTML/JSP di cui avevi bisogno in modo polimorfico. Non sono pazzo di questo suggerimento perché perde l'interfaccia utente nelle classi del modello in modo negativo. Forse un altro modo per aggirarlo sarebbe un pattern Visitor che potrebbe emettere l'interfaccia utente per te.

In entrambi i casi, è necessario aggiungere il codice quando viene visualizzato un nuovo tipo.

Sarei riluttante a creare una libreria di tag personalizzata. Dovresti fare attenzione per assicurarti che lo stile non vi perda, rendendo impossibile lo skin CSS.

Problemi correlati