2009-03-29 13 views
5

¿Cómo representaría correctamente una lista de objetos en jsp con tipos diferentes? Digamos, por ejemplo, que tengo que renderizar estos diferentes objetos en un orden específico.Representación personalizada en JSP según el tipo de clase sin instanceof

Una forma podría ser utilizar una variable de tipo común o instanceof pero eso significa tener un gran interruptor de encendido/if para manejar todos ellos:

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

que podría añadir un método render() para cada clase, pero entonces eso significa mezclar la vista con el resto del código.

¿Qué ocurre si deseo mostrar otro tipo más adelante? ¿Hay algo que pueda hacer con las etiquetas jsp personalizadas?

Respuesta

6

Puede incluir otra jsp que realice la representación correcta para un tipo determinado. por ejemplo:

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

usted podría tener un bucle forEach exterior que itera sobre una lista de lista de tipos:

<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

Se puede crear una interfaz con un método común para cada clase para implementar la emitida el HTML/JSP que necesitabas de forma polimórfica No estoy tan loco con esta sugerencia porque filtra la interfaz de usuario en las clases modelo de una mala manera. Quizás otra forma de evitarlo sería un patrón de Visitante que podría emitir la UI por usted.

De cualquier forma, debería agregar el código cuando aparece un nuevo tipo.

Sería reacio a crear una biblioteca de etiquetas personalizadas. Tendría que tener cuidado para asegurarse de que el estilo no se filtre en él, lo que imposibilita la creación de CSS.

Cuestiones relacionadas