blob: c3407508ad6a2b0669d373476e35bf0515af9847 [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>Processing forms</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="/highlighter/github-theme.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>
</head>
<body>
<a href="http://github.com/apache/struts" class="github-ribbon">
<img style="position: absolute; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
</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-2021.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>
</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 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><a href="/contributors/">Contributors Guide</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="https://cwiki.apache.org/confluence/display/WW/Contributors+Guide">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/processing-forms.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="processing-forms">Processing Forms</h1>
<ul id="markdown-toc">
<li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
<li><a href="#forms-and-a-java-model-class" id="markdown-toc-forms-and-a-java-model-class">Forms and a Java model class</a></li>
<li><a href="#form-structure" id="markdown-toc-form-structure">Form structure</a></li>
<li><a href="#creating-the-action-class-to-handle-the-form-submission" id="markdown-toc-creating-the-action-class-to-handle-the-form-submission">Creating the Action class to handle the form submission</a></li>
<li><a href="#adding-the-view-for-the-result" id="markdown-toc-adding-the-view-for-the-result">Adding the view for the result</a></li>
<li><a href="#create-action-mapping-in-strutsxml" id="markdown-toc-create-action-mapping-in-strutsxml">Create action mapping in struts.xml</a></li>
<li><a href="#create-a-link-to-registerjsp" id="markdown-toc-create-a-link-to-registerjsp">Create a link to register.jsp</a></li>
</ul>
<p>This tutorial assumes you’ve completed the <a href="coding-actions.html">Coding Struts 2 Actions</a> tutorial and have a working
<strong>coding-actions</strong> project. The example code for this tutorial, <strong>form-processing</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>In this tutorial we’ll explore using Struts 2 to do more involved processing of a form submission. We’ll cover how to
use a Java model class to store the form input and how to create the Struts 2 form to match up with that model class.</p>
<p>The code provided in this tutorial may be added to the <a href="coding-actions.html">Coding Struts 2 Actions</a> example or you
can download this complete example from the github respository - <a href="https://github.com/apache/struts-examples">https://github.com/apache/struts-examples</a>.</p>
<p>The <a href="http://struts.apache.org/mail.html">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="forms-and-a-java-model-class">Forms and a Java model class</h2>
<p>For this tutorial let’s say we need to provide a form that a user may submit to register for a prize drawing. Our
business rules state the user must provide his/her first name, last name, email address, and age.</p>
<p>To encapsulate this data, we’ll use a simple Java class that follows the basic Java Bean specifications (public set/get
methods for each instance field). If you’re following along add this class to the package <code class="highlighter-rouge">org.apache.struts.register.model</code>
in the <a href="coding-actions.html">Coding Struts 2 Actions</a> example.</p>
<p><strong>Person.java</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Person</span> <span class="o">{</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">firstName</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">lastName</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">email</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">age</span><span class="o">;</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getFirstName</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">firstName</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setFirstName</span><span class="o">(</span><span class="n">String</span> <span class="n">firstName</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">firstName</span> <span class="o">=</span> <span class="n">firstName</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getLastName</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">lastName</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setLastName</span><span class="o">(</span><span class="n">String</span> <span class="n">lastName</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">lastName</span> <span class="o">=</span> <span class="n">lastName</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getEmail</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">email</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setEmail</span><span class="o">(</span><span class="n">String</span> <span class="n">email</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">email</span> <span class="o">=</span> <span class="n">email</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getAge</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">age</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setAge</span><span class="o">(</span><span class="kt">int</span> <span class="n">age</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">age</span> <span class="o">=</span> <span class="n">age</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">"First Name: "</span> <span class="o">+</span> <span class="n">getFirstName</span><span class="o">()</span> <span class="o">+</span> <span class="s">" Last Name: "</span> <span class="o">+</span> <span class="n">getLastName</span><span class="o">()</span> <span class="o">+</span>
<span class="s">" Email: "</span> <span class="o">+</span> <span class="n">getEmail</span><span class="o">()</span> <span class="o">+</span> <span class="s">" Age: "</span> <span class="o">+</span> <span class="n">getAge</span><span class="o">()</span> <span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>Note a few points about the above class. There is a public set/get method for each instance field. The age attribute
is of type integer. We’ve defined a public <code class="highlighter-rouge">toString</code> method that returns a String representing the state of the object.
Since we haven’t specified a constructor, Java will provide a default constructor that will set all instance fields to
their null values.</p>
<h2 id="form-structure">Form structure</h2>
<p>To collect the above information we’ll use a Struts 2 form. When creating this form the key concept we need to employ
is to tie each form field to a specific instance field of an object of type Person. Let’s look over the form first and
then discuss some key points. Create a view page named <code class="highlighter-rouge">register.jsp</code> (in <code class="highlighter-rouge">src/main/webapp</code>)</p>
<p><strong>register.jsp</strong></p>
<pre><code class="language-jsp">&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Register&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h3&gt;Register for a prize by completing this form.&lt;/h3&gt;
&lt;s:form action="register"&gt;
&lt;s:textfield name="personBean.firstName" label="First name" /&gt;
&lt;s:textfield name="personBean.lastName" label="Last name" /&gt;
&lt;s:textfield name="personBean.email" label ="Email"/&gt;
&lt;s:textfield name="personBean.age" label="Age" /&gt;
&lt;s:submit/&gt;
&lt;/s:form&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Since we are using Struts 2 tags, at the top of the page we need the Struts tag library declaration.</p>
<p>The Struts 2 form will submit to an action named register. We’ll need to define that action in our <code class="highlighter-rouge">struts.xml</code> file.</p>
<p>Note the four Struts 2 textfield tags. Each tag has a name value that includes an attribute of the <code class="highlighter-rouge">Person</code> class
(e.g. <code class="highlighter-rouge">firstName</code>). The name attribute’s value also has a reference to an object called <code class="highlighter-rouge">personBean</code>. This object is
of type <code class="highlighter-rouge">Person</code>. When we create the Action class that handles this form submission, we’ll have to specify that object
in that Action class (see below).</p>
<p>The complete name value, <code class="highlighter-rouge">personBean.firstName</code>, instructs Struts 2 to use the input value for that textfield as
the argument to the personBean object’s <code class="highlighter-rouge">setFirstName</code> method. So if the user types “Bruce” in the textfield that has
the label “First name”, the personBean’s <code class="highlighter-rouge">firstName</code> instance field will have a value of “Bruce”.</p>
<p>Note that we have a Struts 2 textfield for each instance field of the class Person. Remember that Person class’s age
attribute is of type integer. All form field input values are Strings. Struts 2 will automatically convert the String
value (“25”) the user entered for the age form field to 25 when calling the <code class="highlighter-rouge">setAge</code> method of object <code class="highlighter-rouge">personBean</code>.</p>
<h2 id="creating-the-action-class-to-handle-the-form-submission">Creating the Action class to handle the form submission</h2>
<p>When the user clicks on the submit button of the above form, the action “register” and the form data will be sent to
the Struts 2 framework. We need an Action class to process this form. If you recall from the tutorial
<a href="coding-actions.html">Coding Struts 2 Actions</a> our Action class should extend the Struts 2 ActionSupport class.</p>
<p>Here is the Action class used for this example. Place it in package org.apache.struts.register.action.</p>
<p><strong>Register.java Struts 2 Action Class</strong></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">struts</span><span class="o">.</span><span class="na">register</span><span class="o">.</span><span class="na">action</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">com.opensymphony.xwork2.ActionSupport</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.struts.register.model.Person</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Register</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="mi">1L</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">Person</span> <span class="n">personBean</span><span class="o">;</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="c1">//call Service class to store personBean's state in database</span>
<span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">Person</span> <span class="nf">getPersonBean</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">personBean</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setPersonBean</span><span class="o">(</span><span class="n">Person</span> <span class="n">person</span><span class="o">)</span> <span class="o">{</span>
<span class="n">personBean</span> <span class="o">=</span> <span class="n">person</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<p>In the <code class="highlighter-rouge">Register</code> class note that we’ve declared an attribute named <code class="highlighter-rouge">personBean</code> of type <code class="highlighter-rouge">Person</code> and there is a public
get and set method for this object.</p>
<p>The <code class="highlighter-rouge">Register</code> class also overrides the <code class="highlighter-rouge">execute</code> method. The <code class="highlighter-rouge">execute</code> method is the one we will specify in the
<code class="highlighter-rouge">struts.xml</code> to be called in response to the register action. In this example, the <code class="highlighter-rouge">execute</code> method just returns
the String constant <code class="highlighter-rouge">SUCCESS</code> (inherited from the <code class="highlighter-rouge">ActionSupport</code> class). But in a real application, within the <code class="highlighter-rouge">execute</code>
method we would call upon other classes (Service objects) to perform the business processing of the form, such as storing
the user’s input into a data repository.</p>
<p>The <code class="highlighter-rouge">personBean</code> object of type <code class="highlighter-rouge">Person</code> declared in the Register Action class matches the <code class="highlighter-rouge">personBean</code> name we used in
the form’s textfields. When the form is submitted, the Struts 2 framework will inspect the Action class and look for
an object named <code class="highlighter-rouge">personBean</code>. It will create that object using the <code class="highlighter-rouge">Person</code> class’s default constructor. Then for each
form field that has a name value of personBean.someAttribute (e.g <code class="highlighter-rouge">personBean.firstName</code>) it will call the personBean’s
public set method for that attribute and pass it the form field’s value (the user input). This all happens before
the execute method occurs.</p>
<p>When Struts 2 runs the <code class="highlighter-rouge">execute</code> method of class <code class="highlighter-rouge">Register</code>, the <code class="highlighter-rouge">personBean</code> object in class <code class="highlighter-rouge">Register</code> now has values
for its instance fields that are equal to the values the user entered into the corresponding form fields.</p>
<p>By using a Java model class to encapsulate the data provided by the form we don’t have to have a separate attribute
(with public set/get methods) in the Action class (Register) for each form field.</p>
<h2 id="adding-the-view-for-the-result">Adding the view for the result</h2>
<p>When <code class="highlighter-rouge">SUCCESS</code> is returned by the <code class="highlighter-rouge">execute</code> method we want to display a simple thank you page that shows the user’s
registration. Add the <code class="highlighter-rouge">thankyou.jsp</code> below to <code class="highlighter-rouge">src/main/webapp</code>.</p>
<p><strong>thankyou.jsp</strong></p>
<pre><code class="language-jsp">&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
&lt;%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;title&gt;Registration Successful&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h3&gt;Thank you for registering for a prize.&lt;/h3&gt;
&lt;p&gt;Your registration information: &lt;s:property value="personBean" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="&lt;s:url action='index' /&gt;" &gt;Return to home page&lt;/a&gt;.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>If you don’t recall how the Struts 2 property and url tags work consult the <a href="using-tags.html">Using Struts 2 Tags</a> tutorial.</p>
<h2 id="create-action-mapping-in-strutsxml">Create action mapping in struts.xml</h2>
<p>To specify the relationship between the form submission page, the Struts 2 Action class, and the success view page
we need to add an action node to <code class="highlighter-rouge">struts.xml</code>. Add this action node to <code class="highlighter-rouge">struts.xml</code> (<code class="highlighter-rouge">src/main/resources</code>) after
the hello action and before the closing package node.</p>
<p><strong>action node for struts.xml</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">"register"</span> <span class="na">class=</span><span class="s">"org.apache.struts.register.action.Register"</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>/thankyou.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
</code></pre></div></div>
<p>The above action tells Struts 2 that when the register action is provided to call method <code class="highlighter-rouge">execute</code> of class <code class="highlighter-rouge">Register</code>.
If that method returns result “success” return to the browser the <code class="highlighter-rouge">thankyou.jsp</code>.</p>
<p>Note that we don’t need to tell Struts 2 anything about processing the form. The transfer of the form field input values
to the <code class="highlighter-rouge">personBean</code> object will happen automatically provided we’ve followed the convention of naming our form fields
to match personBean.attributeName (e.g. <code class="highlighter-rouge">personBean.lastName</code>).</p>
<h2 id="create-a-link-to-registerjsp">Create a link to register.jsp</h2>
<p>So that the user can find the registration page, add this link to index.jsp</p>
<p><strong>Link to register.jsp</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;p&gt;&lt;a</span> <span class="na">href=</span><span class="s">"register.jsp"</span><span class="nt">&gt;</span>Please register<span class="nt">&lt;/a&gt;</span> for our prize drawing.<span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>
<p><strong>Run The Example</strong></p>
<p>If everything is correct, you should be able to run the application (using <code class="highlighter-rouge">mvn jetty:run</code>), and open this URL in your
web browser:
<a href="http://localhost:8080/form-processing/index.action">http://localhost:8080/form-processing/index.action</a>. On that page
should be a link to register.
Click on that link and you should see the <code class="highlighter-rouge">register.jsp</code> page.</p>
<p><img src="attachments/att14974999_registerjsp.png" alt="registerjsp.png" /></p>
<p>Fill out the form and click the submit button. You should then see the <code class="highlighter-rouge">thankyou.jsp</code> page.</p>
<p><img src="attachments/att14975000_thanyoujsp.png" alt="thanyoujsp.png" /></p>
<table>
<tbody>
<tr>
<td>Return to <a href="coding-actions.html">Coding Struts 2 Actions</a></td>
<td>or</td>
<td>onward to <a href="form-validation.html">Form validation</a></td>
</tr>
</tbody>
</table>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2018 <a href="http://www.apache.org/">The Apache Software Foundation </a>.
All Rights Reserved.
</div>
<div class="col-md-12">
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation.
</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>