Здравствуйте!
В работе я часто использую фреймворк Apache Tiles. Де-факто он является основной технологией для создания UI в проектах над которыми я работаю. В связи с этим хотелось бы поделиться наработанным опытом работы с данной технологией. В цикле будет несколько статей, в которых я разберу что такое этот Tiles, как его настраивать, как правильно использовать и как его задружить со Spring MVC. Первые несколько статей - по сути вольный пересказ официальной документации с моими примерами, которые можно будет запустить у себя на компьютере, так что если кому нравится работать с первоисточником - милости прошу.
Фреймворк Apache Tiles это реализация паттерна Composite View. Данный паттерн формализует типичное использование веб-страниц, подразумевая что они построены по одинаковым принципам и имеют одинаковую структуру. Разбивая страницы на независимые блоки мы создаем шаблоны, составленные из этих блоков. Как правило страницы состоят из сходных элементов и при переходе с одной странички на другую нам надо поменять только один блок - контент. С помощью Tiles очень легко определить общие составные части таких страниц и создать шаблон, который будет использоваться для рендеринга.
Итак, приступим к конфигурированию проекта.
Вы можете начать с начала и самостоятельно создать мавен веб проект. О том как это делается можно почитать тут.
Или же вы можете скачать готовый проект из моего репозитория.
В терминале выполните следующие команды:
В работе я часто использую фреймворк Apache Tiles. Де-факто он является основной технологией для создания UI в проектах над которыми я работаю. В связи с этим хотелось бы поделиться наработанным опытом работы с данной технологией. В цикле будет несколько статей, в которых я разберу что такое этот Tiles, как его настраивать, как правильно использовать и как его задружить со Spring MVC. Первые несколько статей - по сути вольный пересказ официальной документации с моими примерами, которые можно будет запустить у себя на компьютере, так что если кому нравится работать с первоисточником - милости прошу.
Содержание
Часть 1. Основы.Часть 1. Основы
Фреймворк Apache Tiles это реализация паттерна Composite View. Данный паттерн формализует типичное использование веб-страниц, подразумевая что они построены по одинаковым принципам и имеют одинаковую структуру. Разбивая страницы на независимые блоки мы создаем шаблоны, составленные из этих блоков. Как правило страницы состоят из сходных элементов и при переходе с одной странички на другую нам надо поменять только один блок - контент. С помощью Tiles очень легко определить общие составные части таких страниц и создать шаблон, который будет использоваться для рендеринга.
Итак, приступим к конфигурированию проекта.
Вы можете начать с начала и самостоятельно создать мавен веб проект. О том как это делается можно почитать тут.
Или же вы можете скачать готовый проект из моего репозитория.
В терминале выполните следующие команды:
> git clone https://imilienko@bitbucket.org/imilienko/apache-tiles-tutorial.git
> cd ./apache-tiles-tutorial
> git checkout step0
Файловая структура должна получиться как на картинке. (Прим. Файлы и директории выделенные синим - добавленные в процессе работы над проектом).
Далее идем в pom.xml и добавляем зависимость
<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-extras</artifactId> <version>3.0.7</version> </dependency>
Это общая зависимость - она подтягивает все необходимые для работы артефакты, самое то для старта.
Теперь нам нужно зарегистрировать листенер и сервлет. Листенер нам нужен для того чтобы поднять Tiles контейнер, а сервлет - чтобы маршрутизировать ссылки и отдавать готовые страницы. Регистрацию их мы производим в web.xml
<web-app> <display-name>Tiles Tutor</display-name> <listener> <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class> </listener> <servlet> <servlet-name>Tiles Dispatch Servlet</servlet-name> <servlÏt-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Tiles Dispatch Servlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Отлично! Теперь почти все готово, осталось создать сами страницы.
В Apache Tiles страница как сущность состоит из трех элементов - шаблон, атрибут, определение.
Шаблон - это jsp/jspx страница на которой вы определяете структуру вашего UI, у него могут присутствовать или отсутствовать атрибуты;
Атрибут - это та часть шаблона, в которую можно вставить что угодно, хоть простую строку, хоть другое определение;
Как пример можно рассмотреть классическую структуру сайта
Такую страницу можно реализовать следующим шаблоном
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <table> <tr> <td colspan="2"> <tiles:insertAttribute name="header" /> </td> </tr> <tr> <td> <tiles:insertAttribute name="menu" /> </td> <td> <tiles:insertAttribute name="body" /> </td> </tr> <tr> <td colspan="2"> <tiles:insertAttribute name="footer" /> </td> </tr> </table>
Определение в свою очередь - это собственно страница, которая отдается конечному пользователю. Определение состоит из шаблона и частично или полностью заполненных атрибутов. Если атрибуты заполнены не полностью, то это абстрактное определение и оно может использоваться как основа для создания расширенных определений,
Пример определения:
<definition name="myapp.homepage" template="/layouts/classic.jsp"> <put-attribute name="header" value="/tiles/banner.jsp" /> <put-attribute name="menu" value="/tiles/common_menu.jsp" /> <put-attribute name="body" value="/tiles/home_body.jsp" /> <put-attribute name="footer" value="/tiles/credits.jsp" /> </definition>
В нашем конкретном случае, так как мы используем сервлет-диспетчер из коробки, имя определения будет контекстным путем для страницы, то есть, если мы хотим увидеть страницу созданную из определения, приведенного выше, то нам надо перейти по адресу http://
Итак, теперь создадим парочку шаблонов.
Создадим основной шаблон, который определяет структуру страниц нашего приложения
{base.dir}/src/main/webapp/layout/classic.html
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ page contentType="text/html; UTF-8" %> <html> <head> <title>Tiles Example</title> <link rel="stylesheet" type="text/css" href="static/css/style.css"/> </head> <body> <table> <tr> <td colspan="2"> <tiles:insertAttribute name="header" /> </td> </tr> <tr> <td> <tiles:insertAttribute name="menu" /> </td> <td> <tiles:insertAttribute name="body" /> </td> </tr> <tr> <td colspan="2"> <tiles:insertAttribute name="footer" /> </td> </tr> </table> </body> </html>Как видим, тут у нас четыре атрибута, которые определяют основные элементы страницы - хедер, меню, контент, футер. Создадим шаблоны и для них
{base.dir}/src/main/webapp/tiles/heade.jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ page contentType="text/html; UTF-8" %> <header > <h1>Apache tiles Base tutorial</h1> </header>
{base.dir}/src/main/webapp/tiles/menu.jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ page contentType="text/html; UTF-8" %> <aside > <ul>
<li> <a href="/item_one">Item one</a> </li> <li> <a href="/item_two">Item two</a> </li> <li> <a href="/path/to/item_three">Item three</a> </li> </ul> </aside>
{base.dir}/src/main/webapp/tiles/body.jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ page contentType="text/html; UTF-8" %> <main> <p><tiles:insertAttribute name="body_text" defaultValue="Girl look at this body - I work out!"/> </p> </main>{base.dir}/src/main/webapp/tiles/footer.jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ page contentType="text/html; UTF-8" %> <footer > <small>©Imilienko 2017</small> </footer>Как видно, в body.jsp у нас есть атрибутик, body_text со значением по-умолчанию. Это значит, что если мы в качестве атрибута в определении ничего не передадим, то на этом место будет просто вставлена строка "Girl look at this body - I work out!".
Осталось только подготовить определения.
По-умолчанию Tiles читает определения из файла WEB-INF/tiles.xml. Если подключен слушатель CompleteAutoloadTilesListener, то чтение производится из любого файла соответствующего WEB-INF/tiles*.xml. Если в этом случае вы положили туда парочку таких файлов, то они объединятся в один. Таким образом можно разбивать определения по нескольким файлам, дабы не смешивать, например, элементы и блоки, если вы пользуетесь БЭМ.
У нас проект стартовый и маленький поэтому мы все сложим в один WEB-INF/tiles.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> <tiles-definitions> <definition name="classic" template="/layouts/classic.jsp"> <put-attribute name="header" value="/tiles/header.jsp"/> <put-attribute name="menu" value="/tiles/menu.jsp"/> <put-attribute name="body" value="/tiles/body.jsp"/> <put-attribute name="footer" value="/tiles/footer.jsp"/> </definition> <definition name="" extends="classic"></definition> <definition name="item_one" extends="classic"> <put-attribute name="body"> <definition template="/tiles/body.jsp"> <put-attribute name="body_text" value="This item one, man!"/> </definition> </put-attribute> </definition> <definition name="item_two" extends="classic"> <put-attribute name="body"> <definition template="/tiles/body.jsp"> <put-attribute name="body_text" value="This yet another item , man!"/> </definition> </put-attribute> </definition> <definition name="path/to/item_three" extends="classic"> <put-attribute name="body"> <definition template="/tiles/body.jsp"> <put-attribute name="body_text" value="Yey! You here, man!"/> </definition> </put-attribute> </definition> </tiles-definitions>
Как видно у нас тут несколько определений, соответственно несколько страниц. Определение, именованное как classic - основное, оно определяет структуру страниц веб-приложения, содержит все неизменяемые элементы (хедер и пр.). Определение без имени выступает в качестве главной страницы. Остальные определения, в том числе и главная страница наследуют определению classic, получая от него структуру и заменяя только содержимое блока body.
Теперь можно запускать! Деплоим на томкат и получаем:
УРА! Все работает! Как видите, все проще, чем кажется.
Если возникли вопросы или трудности, пишите в комменты или на почту
igormilienko@yandex.ru.
Еще раз ссылка на git репозиторий
https://bitbucket.org/imilienko/apache-tiles-tutorial
Комментарии
Отправить комментарий