Есть такой замечательный framework tiles. Раньше он шел в комплекте с Struts но со временем отпочковался в самостоятельный продукт и получил название Tiles 2. Его суть состоит в том чтобы упростить дизайн представления нашего приложения. Т.е. наша страница собирается из множества элементов (плиток), которые при переходе по ссылкам заменяются в тех или иных местах. Таким образом исчезает необходимость хранить избыточный код на страницах, трекать изменения футером, хедеров, т.к. они представлены только в единственном экземпляре и вставляются в то или иное представления посредством настройки в конфигурационном xml файле. Но самое главное что каждую такую плитку можно отрисовывать своим контроллером. Имплементация этого механизма будет описана ниже.
Просто сделать обработчик на каждую плитку также не интересно. Для остроты ощущений добавим возможность IOC в обработчик и вытаскивания полей или значений просетаных через applicationContext. Для простоты используем Spring 3 MVC. Так что это можно расценивать как Spring 3 MVC & Tiles 2.2 Integration.
В проект нужно добавить библиотеки Spring 3 JSTL1.1+.jar, ну и Сами либы Tiles 2.2 + опциональные
Структура проекта такая приблизительно :)

Веб контент будет иметь следующую структуру:

Ну и собственно там же названия файлов конфигурационных и JSP страниц
Наш web.xml:
Наш файл tiles-defs.xml в котором описано кто будет обрабатывать наши плитки и каким образом они будут заполнять страницу (конфигурироваться, вставляться друг в друга)
applicationContext.xml выглядет следующим образом - тут задефайнены некторые сипользуемые бины
Далее определим где как и какие теги нам выводить. Т.е. расположим сконфигурируем нашу шаблонную страницу. baseLayout.jsp:
Класс контроллера с анатоациями будет выглядеть так:
Ниже приведена реализация для Footer - java-класс и jsp страница соответственно. Все остальные файлы по аналогии.
Ну и footer.jsp в котором можно вывести или свой тайлс или просто переменную, которую добавили в scope приложения (передали на страницу)
На этом все. Все сконфигурировано и работает. Есть еще несколько вариантов сделать то же самое, возможно будут приаттачены в процессе
Просто сделать обработчик на каждую плитку также не интересно. Для остроты ощущений добавим возможность IOC в обработчик и вытаскивания полей или значений просетаных через applicationContext. Для простоты используем Spring 3 MVC. Так что это можно расценивать как Spring 3 MVC & Tiles 2.2 Integration.
В проект нужно добавить библиотеки Spring 3 JSTL1.1+.jar, ну и Сами либы Tiles 2.2 + опциональные
slf4j-api-1.5.8.jar slf4j-jdk14-1.5.8.jar commons-logging-api-1.1.1.jar commons-logging-1.1.1.jar commons-digester-2.0.jar commons-beanutils-1.8.0.jar
Структура проекта такая приблизительно :)
Веб контент будет иметь следующую структуру:
Ну и собственно там же названия файлов конфигурационных и JSP страниц
Наш web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>springTilesAnnotations</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Наш файл tiles-defs.xml в котором описано кто будет обрабатывать наши плитки и каким образом они будут заполнять страницу (конфигурироваться, вставляться друг в друга)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name=".footer" template="/jsp/layout/footer.jsp" preparer="tilesFooter"/>
<definition name=".header" template="/jsp/layout/header.jsp" preparer="tilesHeader"/>
<definition name=".menu" template="/jsp/layout/menu.jsp"/>
<definition name="content.home" template="/jsp/index.jsp"/>
<definition name="content.about" template="/jsp/about.jsp"/>
<definition name="baseLayout" template="/jsp/layout/baseLayout.jsp">
<put-attribute name="title" value="Samonova Travel" type="string"/>
<put-attribute name="footer" value=".footer"/>
<put-attribute name="header" value=".header"/>
<put-attribute name="menu" value=".menu"/>
<put-attribute name="content" value=""/>
</definition>
<definition name="page.home" extends="baseLayout">
<put-attribute name="content" value="content.home"/>
</definition>
<definition name="page.about" extends="baseLayout">
<put-attribute name="content" value="content.about"/>
</definition>
</tiles-definitions>
applicationContext.xml выглядет следующим образом - тут задефайнены некторые сипользуемые бины
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<context:component-scan base-package="com.example.spring.controller"/>
<mvc:annotation-driven/>
<bean id="tilesHeader" class="com.example.tiles.custom.Header"
p:headerMessage="My Custom Spring Defined Header Message">
</bean>
<bean id="tilesFooter" class="com.example.tiles.custom.Footer"
p:footerText="My Custom Spring Defined Footer Message. My Company 2011 ©' ">
</bean>
</beans>
ну и собственно конфигурация наших тайлсов и Spring MVC с обработкой нашими Spring-бинами - очень важно отметить p:preparerFactoryClass="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" так как именно эта фабрика помогает на конфигурировать спринг бины и инжектать в них свойства при обработке тайлсов. dispatcher-servlet.xml: т.е. всместо класса обработчика-прорисовщика (preparer) мы указываем имя Spring бина который будет отвечать за обработку jsp страницы<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="urlMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"> </bean> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" p:definitions="/WEB-INF/tiles-defs.xml" p:preparerFactoryClass="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"> </bean> </beans>
Далее определим где как и какие теги нам выводить. Т.е. расположим сконфигурируем нашу шаблонную страницу. baseLayout.jsp:
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=cp1251" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link href="style.css" rel="stylesheet" type="text/css" />
<script src="js/functions.js" type="text/javascript"></script>
<title><tiles:getAsString name="title" /></title>
</head>
<body>
<div class="wrapper">
<tiles:insertAttribute name="header" />
<div class="contentContainer">
<tiles:insertAttribute name="menu"/>
<div class="content">
<tiles:insertAttribute name="content"/>
</div>
<div class="push"></div>
</div>
<tiles:insertAttribute name="footer" />
</div>
</body>
</html>
Класс контроллера с анатоациями будет выглядеть так:
package com.example.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ExampleController {
@RequestMapping(value="/home.jspx")
public ModelAndView toHomePage(){
return new ModelAndView("page.home");
}
@RequestMapping(value="/index.jspx")
public ModelAndView toIndexPage(){
return new ModelAndView("page.home");
}
@RequestMapping(value="/about.jspx")
public ModelAndView toAboutPage(){
return new ModelAndView("page.about");
}
}
Для того чтобы у нас футер и хедер обрабатывались отдельным классом нужно реализовать интерфейс ViewPreparer Ниже приведена реализация для Footer - java-класс и jsp страница соответственно. Все остальные файлы по аналогии.
package com.example.tiles.custom;
import org.apache.tiles.Attribute;
import org.apache.tiles.AttributeContext;
import org.apache.tiles.context.TilesRequestContext;
import org.apache.tiles.preparer.ViewPreparer;
public class Footer implements ViewPreparer {
private String footerText;
public String getFooterText() {
return footerText;
}
public void setFooterText(String footerText) {
this.footerText = footerText;
}
@Override
public void execute(TilesRequestContext tilesContext,
AttributeContext attributeContext) {
// To get Access to Veriables
String message = (String) tilesContext.getRequestScope().get("message");
// Insert New Attributes
attributeContext.putAttribute("footerMessage", new Attribute(footerText));
}
}
Ну и footer.jsp в котором можно вывести или свой тайлс или просто переменную, которую добавили в scope приложения (передали на страницу)
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%> <div class="footer"> <p> <tiles:insertAttribute name="footerMessage" /> </p> </div>
На этом все. Все сконфигурировано и работает. Есть еще несколько вариантов сделать то же самое, возможно будут приаттачены в процессе
Комментариев нет:
Отправить комментарий