Является ли хорошей идеей включение других JSP через среду Spring MVC?

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

Недавно мы перешли на Spring MVC для нашей прикладной среды, но обнаружили один (и действительно, только один) ограничивающий фактор во время разработки: как включать динамические представления в соответствующую модель.

Например, мы создаем страницу, которая содержит фрагменты многократного использования. Слева у нас есть фрагмент "случайный q и a", а сверху мы имеем общий фрагмент "навигации".

Каждый из этих фрагментов требует отдельной модели. Я инструктировал разработчика, который создает "навигационную" часть, для создания навигационной модели, контроллера и представления, полностью отделенного от модели "q and a", контроллера и логики. Это должно стимулировать возможность повторного использования, если другой макет страницы хочет "навигацию", но не "q and a" или наоборот.

Вы видите, куда я иду с этим? "Домашняя" страница включает в себя оба фрагмента, но было бы неплохо не "знать", какой контроллер / модель / просмотреть фрагменты нужны.

Я инструктировал разработчиков использовать Spring MVC следующим образом...

Пример home.jsp:

<body>
    <div class="top">
        <jsp:include page="/navigation"/>
    </div>
    <div class="left">
        <jsp:include page="/randomgQuestion"/>
    </div>
</html>

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

Это хорошая идея? Есть ли способ лучше?

Любая дискуссия приветствуется, но будьте конструктивны.

Цели - многократное использование и тупые представления.

Я предложу любые обновления или разъяснения по запросу. Спасибо.

2 ответа

То, что вы описываете, похоже на функциональность портала / портлетов (JSR-286) => т.е. приложение (портал), генерирующее веб-страницы, которые состоят из контента, созданного другими встроенными приложениями (портлетами). Порталы используют INCLUDE dispatch (что эквивалентно <jsp:include>) для обеспечения функциональности JSR-286. Так что с этой точки зрения, это хорошая идея использовать <jsp:include> обеспечить многократно используемые блоки контента, каждый из которых имеет собственный жизненный цикл MVC (хотя и использует одно и то же пространство имен атрибута запроса)...

Также обратите внимание, что если у вас есть простой фрагмент, который вы хотели бы повторно использовать между JSP, простой <%@include file="menu.jspf" %> может быть лучше.

И я также чувствую, что функциональность тегов JSP должна быть упомянута... создание контента для повторного использования в виде файла JSP TAG (/WEB-INF/tags/[taglib-folder/]*.tag) может предоставить некоторые расширенные функции макета. Для еще более продвинутых функций вы можете реализовать библиотеку тегов на основе Java.


Чтобы проиллюстрировать, как я использую пользовательские теги и включаю директиву в один проект, ниже приведено единственное представление JSP:

<%@ include file="/WEB-INF/taglib.jspf" %>
<layout:admin section="test">
    <layout:admin-context />
    <layout:admin-content>
        <h1><spring:message code="test.overview.heading" /></h1>
        <h2><spring:message code="test.detail.heading" /></h2>
        <%@ include file="test-detail.jspf" %>
    </layout:admin-content>
</layout:admin>

У нас не было варианта использования, в который включена отправка (т.е. <jsp:include />) будет необходимо.

Что касается вашего пользовательского интерфейса, Apache Tiles и Sitemesh - это то, на что вы можете посмотреть здесь.

С точки зрения уровня контроллера Spring имеет аннотацию @ControllerAdvice, которую можно использовать для размещения атрибутов модели в области видимости для всех контроллеров. Если, например, вы поместили навигационную модель в свой @ControllerAdvice, никакой другой контроллер не будет беспокоиться об установке ее в качестве атрибута модели.

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html

Методы @ModelAttribute также могут быть определены в аннотированном классе @ ControllerAdvice, и такие методы применяются ко всем контроллерам. Аннотация @ControllerAdvice - это аннотация компонента, позволяющая автоматически определять классы реализации посредством сканирования пути к классам.

Другие вопросы по тегам