1. 概述
Apache Tiles 是一個免費、開源的模板引擎,完全基於 Composite 設計模式構建。
Composite 設計模式是一種結構型模式,它將對象組合成樹狀結構,以表示整體-部分層次關係,並且該模式對單個對象和對象組合一視同仁。換句話説,在 Tiles 中,頁面是通過組裝子視圖(稱為 Tiles)的組合構建的。
與其它框架相比,該框架的優勢包括:
- 可重用性
- 易於配置
- 低性能開銷
在本文中,我們將重點介紹 將 Apache Tiles 與 Spring MVC 集成。
2. 依賴配置
第一步是添加必要的 依賴項 在 pom.xml 中:
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.8</version>
</dependency>3. 瓷磚佈局文件
現在我們需要定義模板定義,並且針對每個頁面,我們將覆蓋特定頁面的模板定義:
<tiles-definitions>
<definition name="template-def"
template="/WEB-INF/views/tiles/layouts/defaultLayout.jsp">
<put-attribute name="title" value="" />
<put-attribute name="header"
value="/WEB-INF/views/tiles/templates/defaultHeader.jsp" />
<put-attribute name="menu"
value="/WEB-INF/views/tiles/templates/defaultMenu.jsp" />
<put-attribute name="body" value="" />
<put-attribute name="footer"
value="/WEB-INF/views/tiles/templates/defaultFooter.jsp" />
</definition>
<definition name="home" extends="template-def">
<put-attribute name="title" value="Welcome" />
<put-attribute name="body"
value="/WEB-INF/views/pages/home.jsp" />
</definition>
</tiles-definitions>4. ApplicationConfiguration 和其他類
作為配置的一部分,我們將創建三個特定的 Java 類,即 ApplicationInitializer、ApplicationController 和 ApplicationConfiguration:
- ApplicationInitializer 初始化並檢查 ApplicationConfiguration 類中指定的必要配置。
- ApplicationConfiguration 類包含將 Spring MVC 與 Apache Tiles 框架集成的配置。
- ApplicationController 類與 tiles.xml 文件同步,並根據傳入的請求重定向到必要的頁面。
Let us see each of the classes in action:
@Controller
@RequestMapping("/")
public class TilesController {
@RequestMapping(
value = { "/"},
method = RequestMethod.GET)
public String homePage(ModelMap model) {
return "home";
}
@RequestMapping(
value = { "/apachetiles"},
method = RequestMethod.GET)
public String productsPage(ModelMap model) {
return "apachetiles";
}
@RequestMapping(
value = { "/springmvc"},
method = RequestMethod.GET)
public String contactUsPage(ModelMap model) {
return "springmvc";
}
}public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(TilesApplicationConfiguration.class);
container.addListener(new ContextLoaderListener(ctx));
ServletRegistration.Dynamic servlet = container.addServlet(
"dispatcher", new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
}
}以下是兩個重要的類在 Spring MVC 應用中配置 Tiles 時起關鍵作用。它們分別是 TilesConfigurer 和 TilesViewResolver:
- TilesConfigurer 幫助將 Tiles 框架與 Spring 框架關聯,提供 Tiles 配置文件路徑。
- TilesViewResolver 是 Spring API 中提供的適配器類,用於解析 Tiles 視圖。
最後,在 ApplicationConfiguration 類中,我們使用 TilesConfigurer 和 TilesViewResolver 類來實現集成:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.baeldung.spring.controller.tiles")
public class TilesApplicationConfiguration implements WebMvcConfigurer {
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(
new String[] { "/WEB-INF/views/**/tiles.xml" });
tilesConfigurer.setCheckRefresh(true);
return tilesConfigurer;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
TilesViewResolver viewResolver = new TilesViewResolver();
registry.viewResolver(viewResolver);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("/static/");
}
}5. Tiles 模板文件
我們已經完成了 Apache Tiles 框架的配置以及應用程序中使用的模板和特定 Tiles 的定義。
在此步驟中,我們需要創建與在 tiles.xml 中定義的特定模板文件。
以下是可作為構建特定頁面的基礎佈局的片段:
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title><tiles:getAsString name="title" /></title>
<link href="<c:url value='/static/css/app.css' />"
rel="stylesheet">
</link>
</head>
<body>
<div class="flex-container">
<tiles:insertAttribute name="header" />
<tiles:insertAttribute name="menu" />
<article class="article">
<tiles:insertAttribute name="body" />
</article>
<tiles:insertAttribute name="footer" />
</div>
</body>
</html>6. 結論
本文檔完成了 Spring MVC 與 Apache Tiles 的集成。