The problem is that the tile configuration is not applied every time. I have embedded Apache 3 tiles with spring MVC. I used the annotation-based spring configuration. The problem with the application is that fragment definitions are applied randomly. When I try to run the application, the tile configuration that we configured may or may not be applied.
I am using Apache tomcat 7. Is this a server related issue? Is this a configuration issue? Or if there is one.
Here is my code
MVC Configuration
Annotation base Java Configuration using Spring @EnableWebMvc @Configuration @ComponentScan(basePackages = { "com.om.*" }) public class MVCConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setViewClass(JstlView.class); viewResolver.setPrefix("/WEB-INF/views/layout/"); viewResolver.setSuffix(".jsp"); return viewResolver; } @Bean public TilesViewResolver getTilesViewResolver() { TilesViewResolver tilesViewResolver = new TilesViewResolver(); tilesViewResolver.setViewClass(TilesView.class); return tilesViewResolver; } @Bean public TilesConfigurer getTilesConfigurer() { TilesConfigurer tilesConfigurer = new TilesConfigurer(); tilesConfigurer.setCheckRefresh(true); tilesConfigurer.setDefinitionsFactoryClass(TilesDefinitionsConfig.class);
MVCInitializer
public class MVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { MVCConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
TilesDefinitionsConfig
public final class TilesDefinitionsConfig implements DefinitionsFactory { private static final Map<String, Definition> tilesDefinitions = new HashMap<String,Definition>(); private static final Attribute BASE_TEMPLATE = new Attribute("/WEB-INF/views/layout/defaultLayout.jsp"); public Definition getDefinition(String name, Request tilesContext) { System.out.println("3"); return tilesDefinitions.get(name); } private static void addDefaultLayoutDef(String name, String title, String body) { Map<String, Attribute> attributes = new HashMap<String,Attribute>(); attributes.put("title", new Attribute(title)); attributes.put("header", new Attribute("/WEB-INF/views/layout/header.jsp")); attributes.put("menu", new Attribute("/WEB-INF/views/layout/menu.jsp")); attributes.put("body", new Attribute(body)); attributes.put("footer", new Attribute("/WEB-INF/views/layout/footer.jsp")); tilesDefinitions.put(name, new Definition(name, BASE_TEMPLATE, attributes)); } public static void addDefinitions(){ addDefaultLayoutDef("welcome", "welcome", "/WEB-INF/views/layout/welcome.jsp"); addDefaultLayoutDef("personList", "viewPerson", "/WEB-INF/views/layout/personList.jsp"); } }
controller
@Controller public class SpringTilesController { @RequestMapping(value="welcome") public ModelAndView index() { ModelAndView model=new ModelAndView(); System.out.println("In Controller"); model.setViewName("welcome"); return model; } @RequestMapping(value="viewPerson") public ModelAndView viewPersons(Model model) { Map<String, List<Person>> persons = new HashMap<String, List<Person>>(); persons.put("persons", Person.createPersons()); return new ModelAndView("personList", persons); } }
Entity
public class Person { private String name, email; private int age; public Person(String name, String email, int age) { this.name = name; this.email = email; this.age = age; } public String getName() {return name;} public void setName(String name) {this.name = name;} public String getEmail() {return email;} public void setEmail(String email) {this.email = email;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} @Override public String toString() { return String.format( "Person [name = %s, email = %s, age = %d]", name, email, age); } public static List<Person> createPersons() { List<Person> persons = new ArrayList<Person>(); persons.add(new Person("Tousif", " tousif@mail.com ", 32)); persons.add(new Person("Asif", " asif@mail.com ", 28)); persons.add(new Person("Ramiz", " ramiz@mail.com ", 26)); persons.add(new Person("Rizwan", " rizwan@mail.com ", 32)); persons.add(new Person("Amol", " amol@mail.com ", 33)); persons.add(new Person("Ramdas", " ramdas@mail.com ", 31)); return persons; } }
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.om</groupId> <artifactId>TilesDemo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>TilesDemo Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <jdk.version>1.7</jdk.version> <spring.version>4.1.6.RELEASE</spring.version> <spring.security.version>4.0.1.RELEASE</spring.security.version> <jstl.version>1.2</jstl.version> <javax.servlet.version>3.1.0</javax.servlet.version> <mysql.connector.version>5.1.31</mysql.connector.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-api</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-core</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-servlet</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-template</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-el</artifactId> <version>3.0.5</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <build> <finalName>TilesDemo</finalName> </build> </project>
Keep the header, footer, menu as required.
This is the defaultLayout.jsp page
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <html> <head> <title><tiles:insertAttribute name="title" ignore="true"></tiles:insertAttribute></title> </head> <body style="background-color: #FFF"> <div class="page"> <tiles:insertAttribute name="header" /> <div class="content"> <div id="body"> <tiles:insertAttribute name="body" /> </div> </div> <tiles:insertAttribute name="footer" /> </div> </body> </html>
footer.jsp
<hr /> <div class="span-1 prepend-3"> </div> <div class="span-16 last"> <p> <b> Technology</b> ( All rights Reserved) </p> </div>
header.jsp
<div class="span-24"> <img src="resources/images/images.png" width="950" style="padding-top:10px;" /> </div>
menu.jsp Options for the menu bar on the left.
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <ul style="list-style:none;line-height:28px;"> <li><spring:url value="/index" var="homeUrl" htmlEscape="true" /> <a href="/TilesDemo/welcome">Home</a> </li> <li><spring:url value="/viewPerson" var="personListUrl" htmlEscape="true" /> <a href="/TilesDemo/viewPerson">Person List</a> </li> </ul>
welcome.jsp
This is the body page that will use the header and footer and menu.
<div style="margin:10px;"> <h3>SpringMVC - Tiles3 Integration tutorial</h3> <p>By:- XYZ</p> </div>
The problem is that the plate configuration is not applied every time.