I have a Spring MVC application that is using Tile3. I have many static pages that need to embed them in the template of the website that is currently provided by tile3. (I need to have the same footer and header on all pages, either dynamic or static but not sure how to do the addressing for static pages).
Examples of static pages are index.jsp and aboutus.jsp. How can I access these static pages? should I do it through a controller?
I know I can use jsp:include but is that a good practice? isn't there any alternative as I am using tiles? This tutorial suggested to have separate controllers but I am not sure if that would be an optimal solution. As it sends unnecessary requests to the server.
Please let me know if there is any better option than Tiles
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springapp-servlet.xml</param-value>
</context-param>
</web-app>
tiles.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
"http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition name="baseLayout" template="/WEB-INF/templates/baseLayout.jsp">
<put-attribute name="title" value="Title is here (Tile)"/>
<put-attribute name="header" value="header.jsp"/>
<put-attribute name="menu" value="Title is here (Tile)"/>
<put-attribute name="body" value="Title is here (Tile)"/>
<put-attribute name="footer" value="footer.jsp"/>
</definition>
<definition name="hello" extends="baseLayout">
<put-attribute name="title" value="HELERE"/>
<put-attribute name="body" value="/WEB-INF/pages/pages/ewfsdfsdf.jsp"/>
</definition>
<definition name="index" extends="baseLayout">
<put-attribute name="title" value="HELERE"/>
<put-attribute name="body" value="/WEB-INF/pages/index.jsp"/>
</definition>
</tiles-definitions>
Controller
@Controller
public class HelloController {
protected final Log logger = LogFactory.getLog(getClass());
public HelloController() {
System.err.println("Constructor of HelloController");
}
@RequestMapping("/index.htm")
public String index(){
System.err.println("in index method");
return "index";
}
baseLayout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!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=UTF-8">
<title><tiles:insertAttribute name="title"/></title>
</head>
<body>
<div id="container">
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="menu"/>
<tiles:insertAttribute name="body"/>
<tiles:insertAttribute name="footer"/>
</div>
</body>
</html>
index.jsp
<p>
This is the body of index page
</p>
Using JSP:include
pros
- No extra load neither on DB nor on server
cons
- To backup need to backup all static files
- Might have overwork as each page should be prepared separately rather than having a single template for all pages and just populate the template
- If need to add something to static pages need to change all pages.
I just have found a great solution for it, to handle static pages we can use <mvc:view-controller>
in servlet, sample code is here and here, it works with Tiles as well just make sure you have a definition
for each path in your tiles.xml
file.
<mvc:view-controller path="/index" />
<mvc:view-controller path="/" view-name="index"/>