Как отобразить другое представление JSP для разных типов объектов - PullRequest
4 голосов
/ 14 июля 2009

Предполагая, что у меня есть список животных со стандартным полиморфным поведением, таких как Cat (s) и Dog (s).

Каков наилучший подход для отображения разных представлений JSP для каждого в списке?

<c:forEach var='animal' items='${animals}'>
    //show a different template per animal type
</c:forEach>

Честно говоря, наличие #toJSP для каждого компонента - это то, что я бы не стал рассматривать по понятным причинам.

Однако я испытываю желание использовать

public interface Template{

  public String render()
}

с каждым животным, переданным в конструкторе, однако я не уверен, где эти объекты должны быть созданы. Я предполагаю, что это может быть сделано внутри JSP в <%%> , но я не решаюсь использовать эту запись по некоторым причинам.

Ответы [ 4 ]

1 голос
/ 25 августа 2014

Итак, я использовал «связки», доступные для i18n в JSP, следующим образом:

<fmt:message var="template" key="${animal.class.name}" />

с template.properties файл

foo.bar.Animal = animal.jsp 
foo.bar.Cat = cat.jsp
foo.bar.Dog = dog.jsp

Таким образом, окончательное решение будет выглядеть так

<c:forEach var='animal' items='${animals}'>
    <span>
        <c:set var="animal" scope="request" value="${animal}"/>
        <fmt:message var="template" key="${animal.class.name}" />
        <jsp:include page="${template}" />
    </span>
</c:forEach>

С файлами шаблонов, которые выглядят так

Hello animal ${animal}!
Hello cat ${animal}!
Hello dog ${animal}!
1 голос
/ 06 октября 2009

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

1 голос
/ 19 ноября 2009

К сожалению, наследование и полиморфизм не очень хорошо работают в jsps.

Самое простое и удобное решение - просто сделать много

<c:choose>
   <c:when test="${animal.type == 'Cat'}">
      <my:renderCat cat="${animal}"/>
   </c:when>
   <c:when test="${animal.type == 'Dog'}">
      <my:renderDog Dog="${animal}"/>
   </c:when>
   ...
</c:choose>

и имеют файлы тегов (например, renderDog.tag, renderCat.tag), которые принимают каждое конкретное животное в качестве атрибута и вызывают их. по крайней мере, он сохраняет диспетчеризацию, и рендеринг отделяется.

0 голосов
/ 14 июля 2009

Объявите абстрактный метод в Animal, который возвращает строку с именем getMyJspPage ().

Тогда кошки и собаки могут возвращать ссылку на другую страницу JSP или фрагмент JSP, который вы можете включить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...