Struts2 - шаблоны страниц

Struts2 облегчает программистам жизнь при разработке WEB-интерфейса, предоставляя возможность создании страниц с использованием шаблонов на основе библиотеки и плагина Tiles. Шаблоны помогают создать единый стиль приложения, повторно использовать одни и те же компоненты, а также упростить внесение изменений в дизайн сайта.

Библиотеки Tiles

В Stuts2 интеграция с Tiles реализована при помощи плагина struts2-tiles-plugin-*.jar. Для использования Tiles необходимо в библиотеке приложения WEB-INF/lib разместить дополнительно следующие файлы (звездочкой отмечены версии библиотек) :
  • commons-digester-*.jar, commons-collections-*.jar, commons-beanutils-*.jar - Apache Commons;
  • tiles-api-*.jar, tiles-core-*.jar, tiles-jsp-*.jar - библиотеки tiles;
  • struts2-tiles-plugin-*.jar - плагин Struts2.

Кроме этого дополнительно необходимо в директории дискриптора WEB-INF расположить библиотеку тегов struts-tiles.tld - Tag Library Descriptor (TLD). Библиотеку тегов можно разместить и в другом месте, но тогда необходимо будет ее прописать в дескрипторе приложения web.xml. Например :
Фрагмент кода файла web.xml
<taglib> <taglib-uri>/struts-tiles</taglib-uri> <taglib-location>/WEB-INF/tags/struts-tiles.tld</taglib-location> </taglib>

Для того, чтобы использовать Tiles в WEB-приложении необходимо содать шаблон страницы.

Шаблон страницы с использованием Tiles

Шаблоны страниц — это JSP файлы, которые включают параметризированное содержание. Шаблоны реализованы с помощью набора тегов библиотеки struts-tiles.tld. Мы в нашем примере ограничимся только тегами insert, getAsString, put. Библиотека включает еще теги get, definition, putList, add, useAttribute, importAttribute, initComponentDefinitions, и желающие также могут их использвать в своих приложениях.

Создадим шаблон страницы, который будет состоять из трех частей :
  • header - верхняя часть;
  • menu, body, sidebar - центральная часть;
  • footer - нижняя часть.
Таким образом, наш шаблон будет иметь заголовок header, центральную часть, разделенную на три сектора, и footer.
Листинг шаблона Template.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %> <html> <head> <title><tiles:getAsString name="title" ignore="true" /></title> </head> <body> <table border="1" width="100%"> <tr valign="top"> <td colspan="5"><insert attribute="header" ignore="true" /></td> </tr> <tr valign="top"> <td width="100"><tiles:insert attribute="menu"/></td> <td>&nbsp;</td> <td><tiles:insert attribute="body"/></td> <td>&nbsp;</td> <td width="100"><tiles:insert attribute="sidebar"/></td> <tr> <td colspan=5 height=20%><tiles:insert attribute="footer" /></td> </tr> </table> </body> </html>

В файле Template.jsp мы определили структуру шаблона страниц WEB-приложения :
  • <%@ taglib uri="/WEB-INF/struts-tiles" prefix="tiles" %> - подключили библиотеку тегов Tiles;
  • <tiles:getAsString name="title" ignore="true" /> - для заголовка страницы будем использовать тег "title";
  • определили наименование всех секторов страницы - header, menu, body, sidebar, footer;
  • определили размеры секторов menu, sidebar;
  • сектора в центральной части разделили пробелами &nbsp;;
С помощью тега tiles:insert содержимое JSP-страниц будет вставляться в соответсвующий сектор шаблона. Если атрибут ignore установлен в true (ignore="true"), то Tiles игнорирует соответствующие параметр, если он отсутствует, иначе Tiles выдаст ошибку и страница не будет сформирована.

Наш шаблон Template.jsp представляет собой таблицу с именованными секторами (частями).

Создание страницы

Для создания нашей домашней страницы Home.jsp на основе шаблона Template.jsp необходимо вставить в сектора шаблона соответствующие JSP-страницы. Следующий код будет использован, чтобы создать страницу.
Листинг домашней страницы Home.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %> <tiles:insert page="Template.jsp" flush="true"> <tiles:put name="title" value="Домашняя страница" /> <tiles:put name="header" value="header.jsp" /> <tiles:put name="menu" value="menu.jsp" /> <tiles:put name="body" value="body.jsp" /> <tiles:put name="sidebar" value="sidebar.jsp" /> <tiles:put name="footer" value="footer.jsp" /> </tiles:insert>

Страница Home.jsp создается на основе шаблона Template.jsp. Наименование атрибута тега put определяет сектор размещения страницы. В нашем случае заголовок страницы "title" определен как "Домашняя страница", в верхней части страницы (header) будет располагаться содержимое файла header.jsp и т.д.

Теперь нам необходимо определить общие страницы всех файлов (header.jsp, footer.jsp, menu.jsp, sidebar.jsp) нашего сайта и для каждой страницы создать body.jsp. При необходимости изменения внешнего интерфейса страницы, нужно будет только изменить содержимое одного из файлов.

Заголовок страницы header.jsp

Листинг header.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <table cellSpacing=0 cellPadding=0 width="100%" border="0"> <tr> <td class=logo><img alt="logo" src="/images/logo.gif"></td> <td class=body>&nbsp;</td> </tr> </table>

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

Меню страницы menu.jsp

Листинг menu.jsp
<%@ taglib uri="/struts-tags" prefix="s" %> <a href="<s:url action='Main'/>">Main Page</a><br> <a href="<s:url action='Books'/>">Books Shop</a>

На странице меню мы подключили библиотеку тегов для вызова Action-классов. Меню включает только два пункта - переходы на главную страницу и в книжный магазин. Ссылки переходов определяют вызов действий и представлены тегами <s:url ... />