Ответ 1
В итоге я использовал JSF + Facelets. Я объединил их с Spring MVC и работает как шарм.
Я ищу фреймворк, который лучше и проще в использовании, чем Apache Tiles (который до сих пор я использовал пару раз).
С Tiles кажется, что когда у меня есть 100 действий, мне нужно создать 100 jsp файлов и создать 100 определений в tiles.xml
.
Есть ли лучшая структура для управления моими шаблонами? Я хочу создать, например, 2 шаблона:
a) меню и столбец для контента
b) меню, столбец для содержимого, правый столбец с баннером
В обоих шаблонах меню постоянно. В template b
правый столбец является постоянным, поэтому только столбец содержимого отличается. Для этого простого примера я не хочу определять каждый JSP файл, который расширяет template a
(только для обеспечения тела). Это ламе imo. Или, может быть, я хромаю, и я могу определить шаблон DEFAULT в Apache Tiles, и я просто не использую его правильно. В любом случае, вся помощь была оценена.
В итоге я использовал JSF + Facelets. Я объединил их с Spring MVC и работает как шарм.
В целом, я бы порекомендовал SiteMesh над Tiles.
Вот, как настроить SiteMesh 3
Вы можете использовать Tiles для шаблонов на странице, но используйте SiteMesh для шаблона сайта. Тем не менее...
Как сделать плитки сосать меньше:
Использовать соглашение по конфигурации. Например, поместите свои определения в webapp/WEB-INF/tiles.xml
, и нет необходимости указывать плитки там, где они есть.
Использовать подстановочные знаки:
<definition name="default" template="/WEB-INF/templates/default.jsp">
<put-attribute name="titleKey" value=""/>
<put-attribute name="body" value=""/>
</definition>
<definition name="*" extends="default">
<put-attribute name="titleKey" value="{1}.title"/>
<put-attribute name="body" value="/WEB-INF/views/{1}.jsp" />
</definition>
Если ваш контроллер возвращает имя представления index
, оно будет соответствовать определению *
и использовать JSP файл /WEB-INF/views/index.jsp
для тела и использовать свойство message index.title
.
Если ваш контроллер вернет имя представления contact-us
, оно будет соответствовать определению *
и использовать JSP файл /WEB-INF/views/contact-us.jsp
для тела и использовать свойство message contact-us.title
В вашем шаблоне добавьте:
<c:set var="titleKey"><tiles:getAsString name="titleKey" /></c:set>
и
<title><spring:message code="${titleKey}"/></title>
Добавьте ReloadableResourceBundleMessageSource
bean в контекст приложения сервлета.
Сделайте файл /src/main/resources/messages.properties
, с содержимым вроде:
index.title = Welcome to Acme, Inc.
contact-us.title = Contact Us
Другой подход - Sitemesh. Он был спроектирован так, чтобы отображать представления, в которых вы не можете изменить оригинал, поэтому это скорее структура преобразования/декодирования html, чем шаблонная структура, такая как Tiles.
По моему личному мнению Tiles - лучший подход для приложений, и я попытался бы реализовать какой-то резольвер (основанный на некоторых соглашениях об именах), который делает файлы xml устаревшими, но это не вопрос.
@See: Эта старая версия показывает, как работает SiteMesh.
(аналогично this)
Вам не нужно определение для каждого действия.
Эта конфигурация шаблонов - это зависание от плиток - 1 день. Это действительно не обязательно для плиток-2, когда были введены подстановочные знаки, и особенно с плитами-3 вместе с OptionRenderer.
Здесь учебник, который поможет вам с
Основываясь на опыте, я настоятельно рекомендовал Apache Wicket.