blob: 7b2426a49ae73dbaf17f2c105d156561886c330e [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="Date-Revision-yyyymmdd" content="20140918"/>
<meta http-equiv="Content-Language" content="en"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Tiles Plugin</title>
<link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<link href="/css/syntax.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="/js/community.js"></script>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '41']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<a href="https://github.com/apache/struts" class="github-ribbon">
<img decoding="async" loading="lazy" style="position: absolute; right: 0; border: 0;" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_red_aa0000.png?resize=149%2C149" class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1">
</a>
<header>
<nav>
<div role="navigation" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
Menu
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
</div>
<div id="struts-menu" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Home<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/index.html">Welcome</a></li>
<li><a href="/download.cgi">Download</a></li>
<li><a href="/releases.html">Releases</a></li>
<li><a href="/announce-2024.html">Announcements</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Support<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/mail.html">User Mailing List</a></li>
<li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
<li><a href="/security.html">Reporting Security Issues</a></li>
<li><a href="/commercial-support.html">Commercial Support</a></li>
<li class="divider"></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
<li class="divider"></li>
<li><a href="/maven/project-info.html">Maven Project Info</a></li>
<li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
<li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Documentation<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/birdseye.html">Birds Eye</a></li>
<li><a href="/primer.html">Key Technologies</a></li>
<li><a href="/kickstart.html">Kickstart FAQ</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
<li class="divider"></li>
<li><a href="/getting-started/">Getting Started</a></li>
<li><a href="/security/">Security Guide</a></li>
<li><a href="/core-developers/">Core Developers Guide</a></li>
<li><a href="/tag-developers/">Tag Developers Guide</a></li>
<li><a href="/maven-archetypes/">Maven Archetypes</a></li>
<li><a href="/plugins/">Plugins</a></li>
<li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
<li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
<li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Contributing<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/youatstruts.html">You at Struts</a></li>
<li><a href="/helping.html">How to Help FAQ</a></li>
<li><a href="/dev-mail.html">Development Lists</a></li>
<li class="divider"></li>
<li><a href="/submitting-patches.html">Submitting patches</a></li>
<li><a href="/builds.html">Source Code and Builds</a></li>
<li><a href="/coding-standards.html">Coding standards</a></li>
<li><a href="/contributors/">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/release-guidelines.html">Release Guidelines</a></li>
<li><a href="/bylaws.html">PMC Charter</a></li>
<li><a href="/volunteers.html">Volunteers</a></li>
<li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
<li><a href="/updating-website.html">Updating the website</a></li>
</ul>
</li>
<li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
</ul>
</div>
</div>
</div>
</nav>
</header>
<article class="container">
<section class="col-md-12">
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/tiles/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
<a href="../" title="back to Plugins"><< back to Plugins</a>
<h1 class="no_toc" id="tiles-plugin">Tiles Plugin</h1>
<ul id="markdown-toc">
<li><a href="#features" id="markdown-toc-features">Features</a></li>
<li><a href="#usage" id="markdown-toc-usage">Usage</a> <ul>
<li><a href="#accessing-struts-attributes" id="markdown-toc-accessing-struts-attributes">Accessing Struts attributes</a></li>
<li><a href="#i18n" id="markdown-toc-i18n">I18N</a></li>
</ul>
</li>
<li><a href="#example" id="markdown-toc-example">Example</a></li>
<li><a href="#settings" id="markdown-toc-settings">Settings</a></li>
<li><a href="#installation" id="markdown-toc-installation">Installation</a></li>
</ul>
<p>Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent
look and feel. It can be used for both page decorating and componentization.</p>
<p>The Tiles plugin allows actions to return Tiles pages.</p>
<h2 id="features">Features</h2>
<ul>
<li>Supports Tiles in Freemarker, JSP, and Velocity</li>
<li>Provides annotations to keep tiles.xml short and put definitons into actions</li>
</ul>
<h2 id="usage">Usage</h2>
<p>The following steps must be taken in order to enable tiles support within your Struts2 application:</p>
<ol>
<li>
<p>Include the struts-tiles-plugin as a dependency in your web application. If you are using maven2, the dependency
configuration will be similar to:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
<span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
<span class="nt">&lt;artifactId&gt;</span>struts2-tiles-plugin<span class="nt">&lt;/artifactId&gt;</span>
<span class="nt">&lt;version&gt;</span>${version.tiles}<span class="nt">&lt;/version&gt;</span>
<span class="nt">&lt;/dependency&gt;</span>
</code></pre></div> </div>
</li>
<li>
<p>Register the Tiles listener. This listener will typically either be the standard tiles listener <code class="language-plaintext highlighter-rouge">org.apache.tiles.listener.TilesListener</code>
or the Struts2 replacement <code class="language-plaintext highlighter-rouge">org.apache.struts2.tiles.StrutsTilesListener</code>. The latter provides tighter integration with
Struts features such as freemarker integration.</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;listener&gt;</span>
<span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.tiles.StrutsTilesListener<span class="nt">&lt;/listener-class&gt;</span>
<span class="nt">&lt;/listener&gt;</span>
</code></pre></div> </div>
</li>
<li>
<p>All package definitions, which require tiles support, must either extend the <code class="language-plaintext highlighter-rouge">tiles-default</code> package or must register
the <strong>Tiles Result</strong> type definition.</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;result-types&gt;</span>
<span class="nt">&lt;result-type</span> <span class="na">name=</span><span class="s">"tiles"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.tiles.TilesResult"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/result-types&gt;</span>
</code></pre></div> </div>
</li>
<li>
<p>Configure your actions to utilize a tiles definition:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"sample"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.tiles.example.SampleAction"</span> <span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"tiles"</span><span class="nt">&gt;</span>tilesWorks<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
</code></pre></div> </div>
</li>
<li>
<p>Instead of xml configuration you can use annotations</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Result</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"success"</span><span class="o">,</span> <span class="n">type</span><span class="o">=</span><span class="s">"tiles"</span><span class="o">)</span>
<span class="nd">@TilesDefinition</span><span class="o">(</span><span class="n">extend</span> <span class="o">=</span> <span class="s">"fooLayout"</span><span class="o">,</span> <span class="n">putAttributes</span> <span class="o">=</span> <span class="o">{</span>
<span class="nd">@TilesPutAttribute</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"header"</span><span class="o">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">"/WEB-INF/tiles/header.jsp"</span><span class="o">),</span>
<span class="nd">@TilesPutAttribute</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"body"</span><span class="o">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">"/WEB-INF/tiles/body.ftl"</span><span class="o">)</span>
<span class="o">})</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">FooAction</span> <span class="kd">extends</span> <span class="nc">ActionSupport</span> <span class="o">{</span>
</code></pre></div> </div>
</li>
<li>
<p>You have to define Tiles Definitions in a <code class="language-plaintext highlighter-rouge">tiles.xml</code> file. That can be placed in <code class="language-plaintext highlighter-rouge">resources</code> or in <code class="language-plaintext highlighter-rouge">WEB-INF</code>.</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd"&gt;</span>
<span class="nt">&lt;tiles-definitions&gt;</span>
<span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"fooLayout"</span> <span class="na">template=</span><span class="s">"/WEB-INF/tiles/layout.jsp"</span><span class="nt">&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">value=</span><span class="s">"Tiles Sample"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"header"</span> <span class="na">value=</span><span class="s">".header"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">".bodyp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/definition&gt;</span>
<span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"tilesWorks"</span> <span class="na">extends=</span><span class="s">"fooLayout"</span><span class="nt">&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"header"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/header.jsp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/body.jsp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/definition&gt;</span>
<span class="nt">&lt;/tiles-definitions&gt;</span>
</code></pre></div> </div>
</li>
</ol>
<p>As from Struts 2.3.28, the plugin automatically loads all Tiles definitions matching the following pattern <code class="language-plaintext highlighter-rouge">tiles*.xml</code> -
you don’t have to specify them via <code class="language-plaintext highlighter-rouge">org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG</code> in <code class="language-plaintext highlighter-rouge">web.xml</code>,
but you can use this option if your application is going to work in restricted servlet environment e.g., Google AppEngine.
In such case, definitions will be read from the provided init-param.</p>
<blockquote>
<p>Note: When using a Tomcat WAR versoning mechanism which uses <code class="language-plaintext highlighter-rouge">##</code> you must specify all the tiles definition directly
using the <code class="language-plaintext highlighter-rouge">init-param</code>, in other case it won’t be loaded. It’s due to limitation of <code class="language-plaintext highlighter-rouge">URL</code> class.</p>
</blockquote>
<h3 id="accessing-struts-attributes">Accessing Struts attributes</h3>
<p>As from Struts version 2.5.3 it’s possible accessing defined values on a <code class="language-plaintext highlighter-rouge">ValueStack</code> using <code class="language-plaintext highlighter-rouge">S2</code> prefix when defining
an expression in tiles definition, e.g.:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"home"</span> <span class="na">extends=</span><span class="s">"logged-in"</span><span class="nt">&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">expression=</span><span class="s">"S2:actionProperty"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/home.jsp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/definition&gt;</span>
</code></pre></div></div>
<p>In such case Tiles will delegate evaluation of the expression to Struts and <code class="language-plaintext highlighter-rouge">ValueStack</code> will be examined.</p>
<h3 id="i18n">I18N</h3>
<p>Instead of defining new tiles definitions per supported language (i.e.: <code class="language-plaintext highlighter-rouge">tiles.xml</code>, <code class="language-plaintext highlighter-rouge">tiles_de.xml</code>, <code class="language-plaintext highlighter-rouge">tiles_pl.xml</code>)
you can use <code class="language-plaintext highlighter-rouge">I18N</code> prefix to evaluate provided expression as a key in Struts resource bundles.</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"home"</span> <span class="na">extends=</span><span class="s">"logged-in"</span><span class="nt">&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">expression=</span><span class="s">"I18N:home.title"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/home.jsp"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/definition&gt;</span>
</code></pre></div></div>
<h2 id="example">Example</h2>
<p>This example shows a Tiles layout page using Struts tags:</p>
<div class="language-jsp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;%@ taglib </span><span class="na">uri=</span><span class="s">"http://tiles.apache.org/tags-tiles"</span><span class="na"> prefix=</span><span class="s">"tiles"</span> <span class="nt">%&gt;</span>
<span class="nt">&lt;%@ taglib </span><span class="na">prefix=</span><span class="s">"s"</span><span class="na"> uri=</span><span class="s">"/struts-tags"</span> <span class="nt">%&gt;</span>
<span class="c">&lt;%-- Show usage; Used in Header --%&gt;</span>
<span class="nt">&lt;tiles:importAttribute </span><span class="na">name=</span><span class="s">"title"</span><span class="na"> scope=</span><span class="s">"request"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;&lt;title&gt;</span>Struts2 Showcase - <span class="nt">&lt;tiles:getAsString </span><span class="na">name=</span><span class="s">"title"</span><span class="nt">/&gt;&lt;/title&gt;&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
<span class="nt">&lt;tiles:insertAttribute </span><span class="na">name=</span><span class="s">"header"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;tiles:insertAttribute </span><span class="na">name=</span><span class="s">"body"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;p&gt;</span>Notice that this is a layout made in JSP<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>
<p>Please check <a href="https://github.com/apache/struts-examples/tree/master/tiles">tiles</a> example in <a href="https://github.com/apache/struts-examples/tree/master/tiles">struts-examples</a> project.</p>
<h2 id="settings">Settings</h2>
<p>This plugin does inherit settings from <a href="https://tiles.apache.org/framework/config-reference.html">Tiles configuration</a>.</p>
<h2 id="installation">Installation</h2>
<p>This plugin can be installed by copying the plugin jar into your application’s <code class="language-plaintext highlighter-rouge">/WEB-INF/lib</code> directory.
No other files need to be copied or created.</p>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation. All Rights Reserved.
</div>
<div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
</footer>
<script>!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = "//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");</script>
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
<div id="fb-root"></div>
<script>(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>