2009-03-29 3 views
5

Как бы вы правильно отображали список объектов в jsp с разными типами? Скажем, например, я должен отображать эти разные объекты в определенном порядке.Пользовательский рендеринг в JSP на основе типа класса без экземпляра

Одним из способов может быть использовать общую переменную типа или InstanceOf, но это означает, что имея большой переключатель/если заявление управлять ими:

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

Я мог бы добавить метод визуализации() для каждого класса, но то это означает смешивание представления с остальной частью кода.

Что произойдет, если я захочу сделать другой тип позже? Есть ли что-то, что я могу сделать с пользовательскими тегами jsp?

ответ

6

Вы можете включить другой jsp, который сделает правильный рендеринг для данного типа. например:

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

Вы могли бы иметь внешний контур Foreach, который перебирает список списка типов:

<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

Вы можете создать интерфейс с общим методом для каждого класса, чтобы реализовать что излучаемый HTML/JSP, который вам нужен полиморфным способом. Я не настолько сумасшедший в отношении этого предложения, потому что он плохо протекает в пользовательском интерфейсе классов модели. Возможно, еще один способ вокруг него - это шаблон посетителя, который может исправить пользовательский интерфейс.

В любом случае вам нужно будет добавить код при появлении нового типа.

Я бы не хотел создавать пользовательскую библиотеку тегов. Вы должны быть осторожны, чтобы убедиться, что стиль не просачивается в него, что делает CSS skinning невозможным.

 Смежные вопросы

  • Нет связанных вопросов^_^