blob: 6147ed665c916cc77585092701ab55ccb9a84518 [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>Coding actions</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/coding-actions.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="coding-actions">Coding actions</h1>
<ul id="markdown-toc">
<li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
<li><a href="#struts-2-action-classes" id="markdown-toc-struts-2-action-classes">Struts 2 Action Classes</a></li>
<li><a href="#processing-form-input-in-the-action-class" id="markdown-toc-processing-form-input-in-the-action-class">Processing Form Input In The Action Class</a></li>
<li><a href="#summary" id="markdown-toc-summary">Summary</a></li>
</ul>
<p>This tutorial assumes you’ve completed the <a href="using-tags">Using Struts 2 Tags</a> tutorial and have a working <strong>using-tags</strong>
project. The example code for this tutorial, <strong>coding-actions</strong>, is available for checkout from the Struts 2 GitHub repository
<a href="https://github.com/apache/struts-examples">struts-examples</a>.</p>
<h2 id="introduction">Introduction</h2>
<p>Coding a Struts 2 Action involves several parts:</p>
<ol>
<li>Mapping an action to a class</li>
<li>Mapping a result to a view</li>
<li>Writing the controller logic in the Action class</li>
</ol>
<p>In the previous tutorials we covered how to configure Struts to map a URL such as <code class="language-plaintext highlighter-rouge">hello.action</code> to an Action class
such as <code class="language-plaintext highlighter-rouge">HelloWorldAction</code> (specifically the execute method).</p>
<p><strong>Action Mapping</strong></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">"hello"</span> <span class="na">class=</span><span class="s">"org.apache.struts.helloworld.action.HelloWorldAction"</span> <span class="na">method=</span><span class="s">"execute"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>/HelloWorld.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
</code></pre></div></div>
<p>The Action mapping above also specified that if the <code class="language-plaintext highlighter-rouge">execute</code> method of class <code class="language-plaintext highlighter-rouge">HelloWorldAction</code> returns <code class="language-plaintext highlighter-rouge">success</code>
then the view <code class="language-plaintext highlighter-rouge">HelloWorld.jsp</code> will be returned to the browser.</p>
<p>This tutorial will introduce you to the basics of writing the controller logic in the Action class.</p>
<h2 id="struts-2-action-classes">Struts 2 Action Classes</h2>
<p>Action classes act as the controller in the MVC pattern. Action classes respond to a user action, execute business
logic (or call upon other classes to do that), and then return a result that tells Struts what view to render.</p>
<p>Struts 2 Action classes usually extend the <code class="language-plaintext highlighter-rouge">ActionSupport</code> class, which is provided by the Struts 2 framework.
Class <code class="language-plaintext highlighter-rouge">ActionSupport</code> provides default implementations for the most common actions (e.g. execute, input) and also
implements several useful Struts 2 interfaces. When your Action class extends class <code class="language-plaintext highlighter-rouge">ActionSupport</code> your class can either
override the default implementations or inherit them.</p>
<p>If you examine class HelloWorldAction from tutorial <a href="using-tags">Using Struts 2 Tags</a> you’ll see that it extends
the class <code class="language-plaintext highlighter-rouge">ActionSupport</code> and then overrides method <code class="language-plaintext highlighter-rouge">execute</code>.</p>
<p>The method <code class="language-plaintext highlighter-rouge">execute</code> is where we placed what we want this controller to do in response to the <code class="language-plaintext highlighter-rouge">hello.action</code>.</p>
<p><strong>Method execute of HelloWorldAction</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="nc">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="n">messageStore</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">MessageStore</span><span class="o">()</span> <span class="o">;</span>
<span class="n">helloCount</span><span class="o">++;</span>
<span class="k">return</span> <span class="no">SUCCESS</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<blockquote>
<p>Note that method execute declares it throws an Exception. We’ll cover in a later tutorial how to configure Struts
to handle any Exceptions thrown from the Action classes methods.</p>
</blockquote>
<h2 id="processing-form-input-in-the-action-class">Processing Form Input In The Action Class</h2>
<p>One of the most common responsibilities of the Action class is to process user input on a form and then make
the result of the processing available to the view page. To illustrate this responsibility, let’s say that
on our view page, <code class="language-plaintext highlighter-rouge">HelloWorld.jsp</code>, we want to display a personal hello, such as “Hello Struts User Bruce.”</p>
<p>In the <a href="using-tags">Using Struts 2 Tags</a> example application we added a Struts 2 form to <code class="language-plaintext highlighter-rouge">index.jsp</code>.</p>
<p><strong>Struts 2 Form Tags</strong></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"hello"</span><span class="nt">&gt;</span>
<span class="nt">&lt;s:textfield</span> <span class="na">name=</span><span class="s">"userName"</span> <span class="na">label=</span><span class="s">"Your name"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;s:submit</span> <span class="na">value=</span><span class="s">"Submit"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;/s:form&gt;</span>
</code></pre></div></div>
<p>Make a note of the value of the name attribute for the Struts 2 textfield tag, which is userName. When the user
clicks on the submit button for the above form, the action hello will be executed (<code class="language-plaintext highlighter-rouge">hello.action</code>). The form field
values will be posted to the Struts 2 Action class (<code class="language-plaintext highlighter-rouge">HelloWorldAction</code>). The Action class may automatically receive
those form field values provided it has a public set method that matches the form field name value.</p>
<p>So for the HelloWorldAction class to automatically receive the userName value it must have a public method setUserName
(note the JavaBean convention discussed in tutorial <a href="hello-world-using-struts2">Hello World</a>).</p>
<p>For the example application associated with this tutorial, add the following Java code to class <code class="language-plaintext highlighter-rouge">HelloWorldAction</code>.</p>
<p><strong>Add userName to HelloWorldAction</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">private</span> <span class="nc">String</span> <span class="n">userName</span><span class="o">;</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">getUserName</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">userName</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@StrutsParameter</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUserName</span><span class="o">(</span><span class="nc">String</span> <span class="n">userName</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">userName</span> <span class="o">=</span> <span class="n">userName</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<p>To personalize the MessageStore message (recall that class MessageStore is storing the message to display)
add the following Java code to the HelloWorldAction’s execute method after the statement that instantiates
the MessageStore object.</p>
<p><strong>Add userName value to message</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="o">(</span><span class="n">userName</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
<span class="n">messageStore</span><span class="o">.</span><span class="na">setMessage</span><span class="o">(</span> <span class="n">messageStore</span><span class="o">.</span><span class="na">getMessage</span><span class="o">()</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">userName</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Now build and run (<code class="language-plaintext highlighter-rouge">mvn jetty:run</code>) the application. Enter your name in the form and click the submit button.
You should see the following page.</p>
<p><img src="attachments/coding_actions_form_submit_result.png" alt="coding_actions_form_submit_result.png" /></p>
<p>When the form is submitted, Struts will call any set methods of the HelloWorldAction class that match the form field
names and are annotated with <code class="language-plaintext highlighter-rouge">@StrutsParameter</code>. So in this example method <code class="language-plaintext highlighter-rouge">setUserName</code> was called and passed the value
the user entered in the <code class="language-plaintext highlighter-rouge">userName</code> form field.</p>
<p>On the <code class="language-plaintext highlighter-rouge">index.jsp</code> we also have a Struts 2 action link (see tutorial <a href="using-tags">Using Struts 2 Tags</a>) that includes
a query string parameter: <code class="language-plaintext highlighter-rouge">userName=Bruce+Phillips</code>. If you click on that link you should see the following result:</p>
<p><img src="attachments/coding_actions_link_with_param_result.png" alt="coding_actions_link_with_param_result.png" /></p>
<p>Since the query string parameter is <code class="language-plaintext highlighter-rouge">userName</code>, Struts passed the value of that parameter to the <code class="language-plaintext highlighter-rouge">setUserName</code> method.</p>
<p>On the view page, <code class="language-plaintext highlighter-rouge">HelloWorld.jsp</code>, you can also access the <code class="language-plaintext highlighter-rouge">userName</code> value by using the Struts 2 property tag
(see tutorial <a href="using-tags">Using Struts 2 Tags</a>). Try showing just the <code class="language-plaintext highlighter-rouge">userName</code> value on the view page.</p>
<h2 id="summary">Summary</h2>
<p>This tutorial introduced you to how to code the Action class so it can process user input on a form or values in
a query string parameter. If the form had numerous fields, it would be cumbersome to have a set method that matches
up with each form field. So our next tutorial will cover how to integrate a model class, form fields in the view
and form processing in the Action class.</p>
<table>
<tbody>
<tr>
<td>Return to <a href="using-tags">Using Struts 2 Tags</a></td>
<td>or</td>
<td>onward to <a href="processing-forms">Processing Forms</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>