Является ли хорошей идеей включение других 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 - это аннотация компонента, позволяющая автоматически определять классы реализации посредством сканирования пути к классам.