Struts 2 Tiles Plugin Tutorial with Example in Eclipse

      

Welcome to Part-4 of the 7-part series where we will go through different aspects for Struts2 Framework with some useful examples. In previous part we went through Struts2 Validation Framework. We saw how easy it is to integrate validation in your struts2 application.

In this part we will discuss about Tiles Framework and its Integration with Struts2. We will add Tiles support to our HelloWorld Struts application that we created in previous parts. I strongly recommend you to go through previous articles and download the source code of our sample application.

Introduction to Tiles 2

Nowadays, website are generally divided into pieces of reusable template that are being rendered among different web pages. For example a site containing header, footer, menu etc. This items remains same through out the website and give it a common look and feel. It is very difficult to hard code this in each and every webpage and if later a change is needed than all the pages needs to be modified. Hence we use templatization mechanism. We create a common Header, Footer, Menu page and include this in each page.

Tiles Plugin allow both templating and componentization. In fact, both mechanisms are similar: you
define parts of page (a “Tile”) that you assemble to build another part or a full page. A part can
take parameters, allowing dynamic content, and can be seen as a method in JAVA language. Tiles is a templating system used to maintain a consistent look and feel across all the web pages of a web application. It increase the reusability of template and reduce code duplication.

A common layout of website is defined in a central configuration file and this layout can be extended across all the webpages of the web application.

Our Application Layout

Our goal is to add Header, Footer and Menu to our StrutsHelloWorld application. Following will be the layout of the same.
struts2-tiles-layout

Required JAR files

In order to add Tiles support to our Struts2 application, we will need few jar files. Following is the list of JARs in our example. Add these JARs in WEB-INF/lib folder.
struts2-tiles-jar-files

Configuring Tiles in web.xml

To configure Tiles, an entry for listener has to be made in web.xml. Open the web.xml from WEB-INF folder and add following code into it.

	<listener>
		<listener-class>
			org.apache.struts2.tiles.StrutsTilesListener
		</listener-class>
	</listener>
	<context-param>
		<param-name>tilesDefinitions</param-name>
		<param-value>/WEB-INF/tiles.xml</param-value>
	</context-param>

The above code configure Tiles listener in web.xml. An input configuration file /WEB-INF/tiles.xml is passed as argument. This file contains the Tiles definition for our web application.

Create a file tiles.xml in WEB-INF folder and copy following code into it.
struts2-tiles-xml

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

<!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="baseLayout" template="/BaseLayout.jsp">
		<put-attribute name="title" value="" />
		<put-attribute name="header" value="/Header.jsp" />
		<put-attribute name="menu" value="/Menu.jsp" />
		<put-attribute name="body" value="" />
		<put-attribute name="footer" value="/Footer.jsp" />
	</definition>
	<definition name="/welcome.tiles" extends="baseLayout">
		<put-attribute name="title" value="Welcome" />
		<put-attribute name="body" value="/Welcome.jsp" />
	</definition>
	<definition name="/customer.tiles" extends="baseLayout">
		<put-attribute name="title" value="Customer Form" />
		<put-attribute name="body" value="/Customer.jsp" />
	</definition>
	<definition name="/customer.success.tiles" extends="baseLayout">
		<put-attribute name="title" value="Customer Added" />
		<put-attribute name="body" value="/SuccessCustomer.jsp" />
	</definition>
</tiles-definitions>

Here in tiles.xml we have define a template baseLayout. This layout contains attributes such as Header, Title, Body, Menu and Footer. The layout is then extended and new definitions for Welcome page and Customer page is defined. We have override the default layout and changed the content for Body and Title.

Creating JSPs

struts-2-tiles-layout-jspWe will define the template for our webapplication in a JSP file called BaseLayout.jsp. This template will contain different segments of web page (Header, Footer, Menu etc). Create 4 new JSP files BaseLayout.jsp, Header.jsp, Menu.jsp and Footer.jsp and copy following content in each of them.
BaseLayout.jsp

<%@ 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" ignore="true" /></title>
</head>
<body>
<table border="1" cellpadding="2" cellspacing="2" align="center">
	<tr>
		<td height="30" colspan="2"><tiles:insertAttribute name="header" />
		</td>
	</tr>
	<tr>
		<td height="250"><tiles:insertAttribute name="menu" /></td>
		<td width="350"><tiles:insertAttribute name="body" /></td>
	</tr>
	<tr>
		<td height="30" colspan="2"><tiles:insertAttribute name="footer" />
		</td>
	</tr>
</table>
</body>
</html>

Header.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<h2>Struts2 Example - ViralPatel.net</h2>

Menu.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:a href="customer-form">Customer</s:a>

Footer.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Copyright &copy; ViralPatel.net

Modifications in Struts.xml

In struts.xml we defined result tag which maps a particular action with a JSP page. Now we will modify it and map the result with Tiles. Following will be the content of struts.xml file.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.enable.DynamicMethodInvocation"
		value="false" />
	<constant name="struts.devMode" value="false" />
	<constant name="struts.custom.i18n.resources"
		value="ApplicationResources" />

	<package name="default" extends="struts-default" namespace="/">
		<result-types>
			<result-type name="tiles"
				class="org.apache.struts2.views.tiles.TilesResult" />
		</result-types>
		<action name="login"
			class="net.viralpatel.struts2.LoginAction">
			<result name="success" type="tiles">/welcome.tiles</result>
			<result name="error">Login.jsp</result>
		</action>
		<action name="customer"
			class="net.viralpatel.struts2.CustomerAction">
			<result name="success" type="tiles">/customer.success.tiles</result>
			<result name="input" type="tiles">/customer.tiles</result>
		</action>
		<action name="customer-form">
			<result name="success" type="tiles">/customer.tiles</result>
		</action>
	</package>
</struts>

The struts.xml now defines a new Result type for Tiles. This result type is used in <result> tag for different actions. Also note that we have define a new action customer-form. This is just an empty declaration to redirect user to Customer form page when she clicks Customer link from menu.

That’s All Folks

Compile and Execute the application in Eclipse and see that the header, menu and footer are properly applied.
Welcome Page with Tiles
struts-2-welcome-page-tiles
Customer Page with Tiles
struts2-tiles-customer-page
Customer Success Page with Tiles
struts2-customer-added-tiles

Download Source Code

Click here to download Source Code without JAR files (11KB)

Moving On

Today we saw how we can configure Tiles framework with Struts2 application. In next part we will discuss about Struts2 Interceptors and see example of it. I hope you liked this article. Feel free to post your queries and comments in comment section.


Facebook  Twitter      Stumbleupon  Delicious
  

6 Comments on “Struts 2 Tiles Plugin Tutorial with Example in Eclipse”

  • Pedro wrote on 4 January, 2010, 17:06

    Congratulations on this tutorial, I would like to make two comments:
    1) I downloaded the latest version of Struts2 and comes with the library “struts2-core-2.1.8.1.jar”. With this library do not work the examples. You have to install the versions “struts2-core-2.0.14.jar” you include the link in part 1 of tutorial that really works well. I have not tested with the version “struts2-core-2.1.6.jar”.
    2) I have a problem with Part 4 of the tutorial. I do not understand that serving the “customer-form” as well when you click on the link “customer” an error “HTTP Status 404 – / StrutsHelloWorld / Customer-form” ocurs. I have reviewed the signs of the tutorial and I can not see my mistake.
    Thanks in advance

  • aravind wrote on 5 January, 2010, 14:45

    Hi Viral Patel ,
    Thanks for the tutorial,
    It is very helpful ,
    Iam having below queries on Tiles
    Is it possible to use struts tiles like Iframe/Div ?
    ie. can i call different URLs in header and footer in above example?

    Kindly reply,

  • Jack wrote on 11 January, 2010, 13:40

    Hi Viral,

    Nice tutorials ..!

    But in the Tiles tutorial, I’m facing the same problem, which was mentioned above by Pedro.

    error:
    ———————————————-
    HTTP Status 404 – /mystuff/customer-form
    type Status report

    message /mystuff/customer-form

    description The requested resource (/mystuff/customer-form) is not available.
    ———————————————-
    And, I’m are eagerly waiting for your “Struts 2 Ajax Tutorial with Example”

    Kindly reply viral

  • Sadia Butt wrote on 21 January, 2010, 10:28

    Hey Viral

    Thanks for the tutorials. Though I was stuck in running the hello world but I managed to get it through. Also is there any forums or any thing in which I can ask you about some concepts & meanings of the syntax?? You understand what I am saying??

    Regards

    Sadia

  • Florian Schmitt wrote on 8 February, 2010, 17:32

    Hi Viral,

    great tutorial! Thank you very much for your work! BTW, i had to modyfiy the Customer.jsp and Welcome.jsp Files to get them displayed correctly with Tiles – if BaseLayout.jsp contains the complete XHTML framework, the “content tiles” should only contain the content of the body tags, i suppose? But maybe this is due to my usage of a css/div-based layout? In addition, i had to change the “add customer” link in Welcome.jsp so it points to customer-form instead of Customer.jsp – otherwise i loose my Tiles-Layout.

    Regards
    florian

  • Ali wrote on 4 March, 2010, 9:24

    I am having problems. when I click on the customer or add customer button then it shows the customer.action without the tiles & not in the way its show in the picture. then when I press add customer then it shows in the body tile???what could be the problem?

Write a Comment

Gravatars are small images that can show your personality. You can get your gravatar for free today!

Copyright © 2010 ViralPatel.net. All rights reserved.