blob: af0f7b9656329566894c8976d26bcda9f669beb6 [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>Control tags</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/getting-started/control-tags.md" title="Edit this page on GitHub">Edit on GitHub</a>
<a href="index.html" title="back to Getting started"><< back to Getting started</a>
<h1 class="no_toc" id="control-tags">Control Tags</h1>
<ul id="markdown-toc">
<li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
<li><a href="#struts-2-if-tag" id="markdown-toc-struts-2-if-tag">Struts 2 if Tag</a></li>
<li><a href="#struts-iterator-tag" id="markdown-toc-struts-iterator-tag">Struts iterator Tag</a></li>
<li><a href="#additional-iterator-attributes" id="markdown-toc-additional-iterator-attributes">Additional Iterator Attributes</a></li>
</ul>
<p>The example code for this tutorial, <strong>control-tags</strong>, is available at <a href="https://github.com/apache/struts-examples">struts-examples</a></p>
<h2 id="introduction">Introduction</h2>
<p>Struts 2 has several control tags that can be used in the view. This tutorial will discuss and show examples of how to
use the Struts 2 if and iterator tags. For more information about these and other control tags visit
<a href="../tag-developers/tag-reference">tags reference</a>.</p>
<p>The <a href="http://struts.apache.org/mail">Struts 2 user mailing list</a> is an excellent place to get help. If you are having
a problem getting the tutorial example applications to work search the Struts 2 mailing list. If you don’t find
an answer to your problem, post a question on the mailing list.</p>
<h2 id="struts-2-if-tag">Struts 2 if Tag</h2>
<p>In the example application’s thankyou.jsp is this markup.</p>
<p><strong>thankyou.jsp Struts if Tag</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:if</span> <span class="na">test=</span><span class="s">"personBean.over21"</span><span class="nt">&gt;</span>
<span class="nt">&lt;p&gt;</span>You are old enough to vote!<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/s:if&gt;</span>
<span class="nt">&lt;s:else&gt;</span>
<span class="nt">&lt;p&gt;</span>You are NOT old enough to vote.<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/s:else&gt;</span>
</code></pre></div></div>
<p>The Struts if tag has a test attribute. The value of the test attribute must evaluate to true or false. If true
the statements between the opening and closing s:if tags will be executed. If false, the statements between the opening
and closing s:else tags will be executed. Note that s:else tags come after the closing s:if tag and that the s:else
tags are not required.</p>
<p>In the above example the Struts framework will call method getPersonBean exposed by the Action class (EditAction.java).
Using the Person object returned by that method, the framework will then call method isOver21 of class Person.
That method returns a boolean that will be used to determine if the test is true or false.</p>
<p>The value of the test attribute must be an expression that evaluates to true or false, but doesn’t need to be a method
call that returns a boolean. For example this s:if tag that is in thankyou.jsp has a more complicated expression.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:if</span> <span class="na">test=</span><span class="s">"personBean.carModels.length &gt; 1"</span><span class="nt">&gt;</span>
<span class="nt">&lt;p&gt;</span>Car models
<span class="nt">&lt;/s:if&gt;</span>
<span class="nt">&lt;s:else&gt;</span>
<span class="nt">&lt;p&gt;</span>Car model
<span class="nt">&lt;/s:else&gt;</span>
</code></pre></div></div>
<p>The purpose of the above markup is to use either “Car model” or “Car models” depending on how many car models the user
selected on the edit page. So the value for the test attribute of this iterator tag gets the length of the carModels
String array and compares that to 1. If it’s greater than 1, the correct grammar is “Car models” else the correct
grammar is “Car model”.</p>
<h2 id="struts-iterator-tag">Struts iterator Tag</h2>
<p>The Struts iterator tag is used to generate a loop that iterates over each item in a collection. In the thankyou.jsp
is this markup.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;table</span> <span class="na">style=</span><span class="s">"margin-left:15px"</span><span class="nt">&gt;</span>
<span class="nt">&lt;s:iterator</span> <span class="na">value=</span><span class="s">"personBean.carModels"</span><span class="nt">&gt;</span>
<span class="nt">&lt;tr&gt;&lt;td&gt;&lt;s:property</span> <span class="nt">/&gt;&lt;/td&gt;&lt;/tr&gt;</span>
<span class="nt">&lt;/s:iterator&gt;</span>
<span class="nt">&lt;/table&gt;</span>
</code></pre></div></div>
<p>The goal of this code is to create an HTML table with a row that display a car model selected by the user on the edit
page. The car models the user selects on the edit page are stored in the carModels field (a String array)
of the personBean object (of class Person).</p>
<p>The iterator tag has a value attribute that must evaluate to a collection (Array, List, Map).</p>
<p>The <code class="language-plaintext highlighter-rouge">s:property</code> tag nested inside the iterator tag is used to display the specific value of the collection each time
the iterator loops over an element of the collection. Since the collection is an Array of String objects, the <code class="language-plaintext highlighter-rouge">s:property</code>
tag doesn’t need to specify a value attribute. By default the <code class="language-plaintext highlighter-rouge">s:property</code> tag will display the single String for that
element of the collection.</p>
<p>If the collection contains objects that have multiple fields, then you should use the value attribute of the s:property
tag to determine what field to display. For example:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;table</span> <span class="na">style=</span><span class="s">"margin-left:15px"</span><span class="nt">&gt;</span>
<span class="nt">&lt;s:iterator</span> <span class="na">value=</span><span class="s">"states"</span> <span class="nt">&gt;</span>
<span class="nt">&lt;tr&gt;&lt;td&gt;&lt;s:property</span> <span class="na">value=</span><span class="s">"stateAbbr"</span> <span class="nt">/&gt;&lt;/td&gt;</span> <span class="nt">&lt;td&gt;&lt;s:property</span> <span class="na">value=</span><span class="s">"stateName"</span> <span class="nt">/&gt;&lt;/tr&gt;</span>
<span class="nt">&lt;/s:iterator&gt;</span>
<span class="nt">&lt;/table&gt;</span>
</code></pre></div></div>
<p>The value of the iterator tag is states, which causes the Struts 2 framework to call the getStates method of the Action
class (<code class="language-plaintext highlighter-rouge">EditAction.java</code>). The getStates method returns a List of State objects. The State class has two fields stateAbbr
and stateName, both having the appropriate get method. The iterator will loop over each State object stored in the collection.
Each time through the loop, the Struts 2 framework will have a reference to the current State object and will call
getStateAbbr and getStateName methods for that current State object.</p>
<h2 id="additional-iterator-attributes">Additional Iterator Attributes</h2>
<p>The Struts 2 iterator tag has additional attributes you can use to control the begin and end values for specifying
that the iterator tag should only loop over a part of the collection. See the <a href="../tag-developers/iterator-tag">iterator tag reference</a> for more information.</p>
<table>
<tbody>
<tr>
<td>Return to <a href="form-validation-using-xml">Form validation using XML</a></td>
<td>or</td>
<td>onward to <a href="wildcard-method-selection">Wildcard method selection</a></td>
</tr>
</tbody>
</table>
</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>