Пользовательский рендеринг в JSP на основе типа класса без instanceof - PullRequest
5 голосов
/ 29 марта 2009

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 29 марта 2009

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

<c:forEach var="o" items="${bigListofObjects}"  >
    <c:import url="render-${o.type}.jsp"/>
</c:forEach>
1 голос
/ 29 марта 2009

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

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

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

0 голосов
/ 29 марта 2009

У вас может быть внешний цикл 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>
...