Spring 4 MVC+Apache Tiles 3 Example

In this post we will integrate Apache Tiles 3 with Spring MVC 4, using annotation-based configuration. Apache Tiles is a template based, composite view framework: it allows to reuse page pieces across the application, keeping consistent look and feel. Page layouts in general contains several page-fragments like header,footer, menu & content. In a consistent layout, only content changes between page navigation while other page fragments like header,footer & menu remains fixed most of the time.

Tiles allows developers to define these page fragments which can be assembled into a complete pages at runtime.



Other interesting posts you may like

Following technologies being used:

  • Spring 4.2.6.RELEASE
  • Apache Tiles 3.0.5
  • Maven 3
  • JDK 1.7
  • Tomcat 8.0.21
  • Eclipse MARS.1 Release 4.5.1

Let’s begin.

Step 1: Create the directory structure

Following will be the final project structure:

Let’s now add the content mentioned in above structure explaining each in detail.

Step 2: Update pom.xml to include required dependencies

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.websystique.springmvc</groupId>

    <artifactId>Spring4MVCApacheTiles3Example</artifactId>

    <packaging>war</packaging>

    <version>1.0.0</version>

    <name>Spring4MVCApacheTiles3Example</name>

    <properties>

        <springframework.version>4.2.6.RELEASE</springframework.version>

        <apachetiles.version>3.0.5</apachetiles.version>

    </properties>

    <dependencies>

        <!-- Spring -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-core</artifactId>

            <version>${springframework.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-web</artifactId>

            <version>${springframework.version}</version>

        </dependency>

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-webmvc</artifactId>

            <version>${springframework.version}</version>

        </dependency>

        <!-- Apache Tiles -->

        <dependency>

            <groupId>org.apache.tiles</groupId>

            <artifactId>tiles-core</artifactId>

            <version>${apachetiles.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.tiles</groupId>

            <artifactId>tiles-api</artifactId>

            <version>${apachetiles.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.tiles</groupId>

            <artifactId>tiles-servlet</artifactId>

            <version>${apachetiles.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.tiles</groupId>

            <artifactId>tiles-jsp</artifactId>

            <version>${apachetiles.version}</version>

        </dependency>

        

        <!-- Servlet+JSP+JSTL -->

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>javax.servlet-api</artifactId>

            <version>3.1.0</version>

        </dependency>

        <dependency>

            <groupId>javax.servlet.jsp</groupId>

            <artifactId>javax.servlet.jsp-api</artifactId>

            <version>2.3.1</version>

        </dependency>

        <dependency>

            <groupId>javax.servlet</groupId>

            <artifactId>jstl</artifactId>

            <version>1.2</version>

        </dependency>

        

    </dependencies>

    <build>

        <pluginManagement>

            <plugins>

                <plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-compiler-plugin</artifactId>

                    <version>3.2</version>

                    <configuration>

                        <source>1.7</source>

                        <target>1.7</target>

                    </configuration>

                </plugin>

                <plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-war-plugin</artifactId>

                    <version>2.4</version>

                    <configuration>

                        <warSourceDirectory>src/main/webapp</warSourceDirectory>

                        <warName>Spring4MVCApacheTiles3Example</warName>

                        <failOnMissingWebXml>false</failOnMissingWebXml>

                    </configuration>

                </plugin>

            </plugins>

        </pluginManagement>

        <finalName>Spring4MVCApacheTiles3Example</finalName>

    </build>

</project>

Apart from usual Spring dependencies, We have also added few dependencies for Apache Tiles 3. Additional dependencies can be added for more advanced tiles usageMaven Apache-tiles page lists all the dependencies from basic to advanced usages.

Step 3: Configure Tiles

Configure tiles in Spring Application configuration file.

package com.websystique.springmvc.configuration;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import org.springframework.web.servlet.view.tiles3.TilesConfigurer;

import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

@Configuration

@EnableWebMvc

@ComponentScan(basePackages = "com.websystique.springmvc")

public class AppConfig extends WebMvcConfigurerAdapter{

    /**

     * Configure TilesConfigurer.

     */

    @Bean

    public TilesConfigurer tilesConfigurer(){

        TilesConfigurer tilesConfigurer = new TilesConfigurer();

        tilesConfigurer.setDefinitions(new String[] {"/WEB-INF/views/**/tiles.xml"});

        tilesConfigurer.setCheckRefresh(true);

        return tilesConfigurer;

    }

    /**

     * Configure ViewResolvers to deliver preferred views.

     */

    @Override

    public void configureViewResolvers(ViewResolverRegistry registry) {

        TilesViewResolver viewResolver = new TilesViewResolver();

        registry.viewResolver(viewResolver);

    }

    

    /**

     * Configure ResourceHandlers to serve static resources like CSS/ Javascript etc...

     */

    

    @Override

    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/static/**").addResourceLocations("/static/");

    }

    

}

Highlights of above configurations are TilesConfigurer & TilesViewResolver. TilesConfigurer simply configures a TilesContainer using a set of files containing definitions, to be accessed by TilesView instances. Definition files are basically XML files containing layout definitions.

In our Spring MVC application, we also need a ViewResolver. Spring comes with a Tiles specific ViewResolver named TilesViewResolver. Once configured, the view names returned from your controller methods will be treated as tiles view and Spring will look for a definition having the same name in definitions XML files.

Step 4: Create tiles definitions

Shown below is the definition file tiles.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!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

 

   <!-- Base Definition -->

   <definition name="base-definition"

       template="/WEB-INF/views/tiles/layouts/defaultLayout.jsp"

       <put-attribute name="title" value="" /> 

       <put-attribute name="header" value="/WEB-INF/views/tiles/template/defaultHeader.jsp" /> 

       <put-attribute name="menu" value="/WEB-INF/views/tiles/template/defaultMenu.jsp" /> 

       <put-attribute name="body" value="" /> 

       <put-attribute name="footer" value="/WEB-INF/views/tiles/template/defaultFooter.jsp" /> 

   </definition

 

   <!-- Home Page -->

   <definition name="home" extends="base-definition"

       <put-attribute name="title" value="Welcome" /> 

       <put-attribute name="body" value="/WEB-INF/views/pages/home.jsp" /> 

   </definition

   <!-- Product Page -->

   <definition name="products" extends="base-definition"

       <put-attribute name="title" value="Products" /> 

       <put-attribute name="body" value="/WEB-INF/views/pages/products.jsp" /> 

   </definition

      

   <!-- Contact-us Page -->

   <definition name="contactus" extends="base-definition"

       <put-attribute name="title" value="Contact Us" /> 

       <put-attribute name="body" value="/WEB-INF/views/pages/contactus.jsp" /> 

   </definition

 

</tiles-definitions>

In above definition file, we have defined a base-definition and several other definitions extending base-definition. Other defintions are just overwriting the part they are specialized for. template attribute in definition-block is used to specify the actual layout file. Each of the definition (by name) can be treated as a tiles-view.

Step 5: Create Layouts

In our case we have defined a basic layout [/WEB-INF/views/tiles/layouts/defaultLayout.jsp] pinned with definition using template attribte.

defaultLayout.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<%@ page isELIgnored="false" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>

<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/bootstrap.css‘ />"  rel="stylesheet"></link>

    <link href="<c:url value=‘/static/css/app.css‘ />" rel="stylesheet"></link>

</head>

 

<body>

        <header id="header">

            <tiles:insertAttribute name="header" />

        </header>

    

        <section id="sidemenu">

            <tiles:insertAttribute name="menu" />

        </section>

            

        <section id="site-content">

            <tiles:insertAttribute name="body" />

        </section>

        

        <footer id="footer">

            <tiles:insertAttribute name="footer" />

        </footer>

</body>

</html>

This layout file provides the consistent look-n-feel across your application. If you want to change layout, define a corresponding layout file and attach to the definition using template attribute.

As you can see, we have a header,footer,menu & body. We are using tags-tiles tag library to provide the placeholder within layout file. Attributes specified using insertAttribute will be provided by corresponding definition(or the one extending it).

Step 6: Create views

We have created some default views[used when the extending definition does not overwrite them] and some specific ones.
defaultHeader.jsp

<div>

        <h1>Tiles Demo</h1>

</div>

defaultFooter.jsp

<div>

  Made in this world.

</div>

defaultMenu.jsp

<nav>

    <a href="${pageContext.request.contextPath}/"><img class="logo" src="${pageContext.request.contextPath}/static/img/Linux-icon.png"></a>

    <ul id="menu">

        <li><a href="${pageContext.request.contextPath}/">Home</a></li>

       <li><a href="${pageContext.request.contextPath}/products">Products</a></li>

       <li><a href="${pageContext.request.contextPath}/contactus">Contact Us</a></li>

    </ul>

</nav>

home.jsp

<h2>Welcome to Home page</h2>

products.jsp

<h2>Products page</h2>

contactus.jsp

<h2>Contact Us Page</h2>

Step 7: Create Controller

package com.websystique.springmvc.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

@Controller

@RequestMapping("/")

public class AppController {

    @RequestMapping(value = { "/"}, method = RequestMethod.GET)

    public String homePage(ModelMap model) {

        return "home";

    }

    @RequestMapping(value = { "/products"}, method = RequestMethod.GET)

    public String productsPage(ModelMap model) {

        return "products";

    }

    @RequestMapping(value = { "/contactus"}, method = RequestMethod.GET)

    public String contactUsPage(ModelMap model) {

        return "contactus";

    }

}

Look at each of these controller methods. The returned value from them is treated as tiles-view [Thanks to TilesViewResolver] and corresponding tiles-definition gets consulted.

Step 8: Create Initializer

package com.websystique.springmvc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override

    protected Class<?>[] getRootConfigClasses() {

        return new Class[] { AppConfig.class };

    }

 

    @Override

    protected Class<?>[] getServletConfigClasses() {

        return null;

    }

 

    @Override

    protected String[] getServletMappings() {

        return new String[] { "/" };

    }

}

Step 9: Build, deploy and Run Application

Now build the war (either by eclipse as was mentioned in previous tutorials) or via maven command line( mvn clean install). Deploy the war to a Servlet 3.0 container . Since here i am using Tomcat, i will simply put this war file into tomcat webapps folder and click on startup.bat inside tomcat/bin directory.

If you prefer to deploy from within Eclipse using tomcat: For those of us, who prefer to deploy and run from within eclipse, and might be facing difficulties setting Eclipse with tomcat, the detailed step-by-step solution can be found at : How to setup tomcat with Eclipse.

Open browser and browse at http://localhost:8080/Spring4MVCApacheTiles3Example/

Click on different menu items to see the content gets changes while preserving the actual look-n-feel.

Download Source Code

Download Now!

References

http://websystique.com/springmvc/spring-4-mvc-apache-tiles-3-annotation-based-example/

时间: 2024-08-26 20:26:53

Spring 4 MVC+Apache Tiles 3 Example的相关文章

Spring 3 MVC and Apache Tiles 3 Integration Error

<bean id="viewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> <property name="viewClass"> <value> org.springframework.web.servlet.view.tiles3.TilesView </value> </pr

spring in action 4 6.3使用Apache Tiles

配置Tiles视图解析器 需要一个TilesConfigurer bean,该bean用于定位和加载tile定义,还需要一个TilesViewResolver用于将逻辑视图名与tile定义映射起来.在WebConfig.java中 @Configuration @EnableWebMvc @ComponentScan(basePackageClasses={AutoScan.class}) public class WebConfig extends WebMvcConfigurerAdapte

spring项目报org.apache.tiles.definition.DefinitionsFactoryException: I/O错误原因及解决办法。

今天升级一个spring项目遇到如下错: HTTP Status 500 - Request processing failed; nested exception is org.apache.tiles.definition.DefinitionsFactoryException: I/O Error reading definitions. org.springframework.web.util.NestedServletException: Request processing fail

初试 spring web mvc

作为一名code需要了解更多的知识,编程方面的东西太多了,是个逐渐积累的过程.最近学习一下spring web mvc,写下我个人的一些经验. 1.准备jar包.spring mvc 已经到了版本4,网上的很多资料已经不在适用.给出的下载地址也无法适用.这是非常痛苦的.我费了好大功夫才获得这些JAR包. 在官方介绍文档里获得http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework-reference/htmls

Spring 4 MVC HelloWorld - XML示例

构建Spring MVC 4的HelloWorld实例. 使用以下技术: Spring 4.0.6.RELEASE Maven 3 JDK 1.8 如果您已经熟悉maven使用eclipse 创建项目,请随意跳过第1步. 让我们开始. 步骤1:在Eclipse中创建一个新的Maven webapp项目 Goto File-> New - > Maven Project, 取消选中"使用默认工作区位置",以防您希望在其他位置创建项目 点击下一步 从选项列表中选择maven w

Spring 4 MVC HelloWorld - 注解/JavaConfig实例

在之前的Spring 4 MVC HelloWorld - 实例中,有spring-mvc.xml和web.xml这两个xml文件.现在通过java配置,将删除这个两个xml文件. 1.pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

spring 3 mvc hello world + mavern +jetty

Spring 3 MVC hello world example By mkyong | August 2, 2011 | Updated : June 15, 2015 In this tutorial, we show you a Spring 3 MVC hello world example, using Maven build tool. Technologies used : Spring 3.2.13.RELEASE Maven 3 JDK 1.6 Eclipse 4.4 Boos

Spring - Sring MVC入门

2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的.   另外还有一种基于组件的.事件驱动的Web框架在此就不介绍了,如Tapestry.JSF等.   Spring Web MVC也是服务到工作者模式的实现,但

Spring FrameWork4(MVC + IOC)快速入门实例

使用Maven创建工程并配置依赖项 首先创建一个Maven Project: 然后选择创建Maven 的webapp实例,当然也可以通过命令行方式创建Maven webapp的项目再转化并导入到MyEclipse中. 在pom.xml中需要对于Spring依赖项进行配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta