Added: 
websites/production/struts/content/core-developers/action-proxy-and-actionproxy-factory.html
==============================================================================
--- 
websites/production/struts/content/core-developers/action-proxy-and-actionproxy-factory.html
 (added)
+++ 
websites/production/struts/content/core-developers/action-proxy-and-actionproxy-factory.html
 Thu Jun  1 11:35:58 2017
@@ -0,0 +1,251 @@
+<!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>Action Proxy & ActionProxy Factory</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="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.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="/downloads.html">Downloads</a></li>
+                <li><a href="/announce.html">Announcements</a></li>
+                <li><a href="http://www.apache.org/licenses/";>License</a></li>
+                <li><a 
href="http://apache.org/foundation/thanks.html";>Thanks!</a></li>
+                <li><a 
href="http://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="/maven/project-info.html">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="/docs/tutorials.html">Tutorials</a></li>
+                <li><a href="/docs/faqs.html">FAQs</a></li>
+                <li><a href="/docs/guides.html">Guides</a></li>
+                <li class="divider"></li>
+                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
+                <li><a href="/docs/plugins.html">Plugin APIs</a></li>
+                <li><a href="/docs/tag-reference.html">Tag reference</a></li>
+                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
+                <li class="divider"></li>
+                <li><a href="/security/">Security Guide (WIP)</a></li>
+                <li><a href="/core-developers/">Core Developers Guide 
(WIP)</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</a></li>
+                <li><a href="/coding-standards.html">Coding standards</a></li>
+                <li class="divider"></li>
+                <li><a href="/releases.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://git-wip-us.apache.org/repos/asf?p=struts.git";>Source 
Repository</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 href="index.html" title="back to Core Developers Guide"><< back to Core 
Developers Guide</a>
+    <h1 id="action-proxy--actionproxy-factory">Action Proxy &amp; ActionProxy 
Factory</h1>
+
+<p>The ActionProxy obtains the Action class and calls the appropriate method. 
By default, Actions are obtained through local instantiation, but an Action 
could also be obtained remotely if an alternative ActionProxy were provided.</p>
+
+<p>An alternative ActionProxy can be configured through ActionProxyFactory. 
Typically, an ActionProxy will utilize the ActionInvocation to encapsulate the 
execution of a particular request.</p>
+
+<p>The ActionInvocation determines how an Action is handled: Is it being 
intercepted?  Is there a PreResultListener acting on it?</p>
+
+<p>Essentially, ActionProxy encapsulates how an Action can be obtained. 
ActionInvocation encapsulates how the Action is executed when a request is 
invoked.</p>
+
+<p>####Customization####</p>
+
+<p>#####ActionProxyFactory#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+ ActionProxyFactory.setFactory(new MyActionProxyFactory() {
+
+    // Do something interesting...
+
+ });
+
+</code></pre>
+</div>
+
+<p>#####ActionProxy#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+ ActionProxyFactory.getFactory(new MyActionProxyFactory() {
+    ....
+    public ActionProxy createActionProxy(Configuration config,
+           String namespace, String actionName, Map extraContext)
+           throws Exception {
+        createActionProxy(config, namespace, actionName, extraContext, true);
+    }
+    public ActionProxy createActionProxy(Configuration config,
+           String namespace, String actionName, Map extraContext,
+           boolean executeResult, boolean cleanupContext)
+           throws Exception {
+        ....
+   }
+   ....
+ });
+
+</code></pre>
+</div>
+
+<p>#####ActionInvocation#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+ ActionProxyFactory.getFactory(new MyActionProxyFactory() {
+    ...
+    public ActionInvocation createActionInvocation(ActionProxy actionProxy)
+                            throws Exception {
+          createActionInvocation(actionProxy, new LinkedHashMap());
+    }
+    public ActionInvocation createActionInvocation(ActionProxy actionProxy,
+                            Map extraContext) throws Exception {
+          createActionInvocation(actionProxy, extraContext, true);
+    }
+    public ActionInvocation createActionInvocation(ActionProxy actionProxy,
+                            Map extraContext, boolean pushAction)
+                            throws Exception {
+          // Do implementation of ActionInvocation here
+          .....
+    }
+    ...
+ });
+
+</code></pre>
+</div>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-2016 <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>
+
+
+<script>
+$(function() {
+  return $("h2, h3, h4, h5, h6").each(function(i, el) {
+    var $el, id;
+    $el = $(el);
+    id = $el.attr('id');
+    if (id) {
+      $el.removeAttr('id');
+      return $el.before($("<a />").addClass('anchor').attr('name', id));
+    }
+  });
+});
+</script>
+
+</body>
+</html>

Added: websites/production/struts/content/core-developers/after-annotation.html
==============================================================================
--- websites/production/struts/content/core-developers/after-annotation.html 
(added)
+++ websites/production/struts/content/core-developers/after-annotation.html 
Thu Jun  1 11:35:58 2017
@@ -0,0 +1,206 @@
+<!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>After Annotation</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="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.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="/downloads.html">Downloads</a></li>
+                <li><a href="/announce.html">Announcements</a></li>
+                <li><a href="http://www.apache.org/licenses/";>License</a></li>
+                <li><a 
href="http://apache.org/foundation/thanks.html";>Thanks!</a></li>
+                <li><a 
href="http://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="/maven/project-info.html">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="/docs/tutorials.html">Tutorials</a></li>
+                <li><a href="/docs/faqs.html">FAQs</a></li>
+                <li><a href="/docs/guides.html">Guides</a></li>
+                <li class="divider"></li>
+                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
+                <li><a href="/docs/plugins.html">Plugin APIs</a></li>
+                <li><a href="/docs/tag-reference.html">Tag reference</a></li>
+                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
+                <li class="divider"></li>
+                <li><a href="/security/">Security Guide (WIP)</a></li>
+                <li><a href="/core-developers/">Core Developers Guide 
(WIP)</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</a></li>
+                <li><a href="/coding-standards.html">Coding standards</a></li>
+                <li class="divider"></li>
+                <li><a href="/releases.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://git-wip-us.apache.org/repos/asf?p=struts.git";>Source 
Repository</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 href="index.html" title="back to Core Developers Guide"><< back to Core 
Developers Guide</a>
+    <h1 id="after-annotation">After Annotation</h1>
+
+<p>####After Annotation####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.interceptor.annotations.After</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Usage#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.interceptor.annotations.After</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Parameters#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.interceptor.annotations.After</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Examples#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.interceptor.annotations.After</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-2016 <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>
+
+
+<script>
+$(function() {
+  return $("h2, h3, h4, h5, h6").each(function(i, el) {
+    var $el, id;
+    $el = $(el);
+    id = $el.attr('id');
+    if (id) {
+      $el.removeAttr('id');
+      return $el.before($("<a />").addClass('anchor').attr('name', id));
+    }
+  });
+});
+</script>
+
+</body>
+</html>

Added: 
websites/production/struts/content/core-developers/ajax-client-side-validation.html
==============================================================================
--- 
websites/production/struts/content/core-developers/ajax-client-side-validation.html
 (added)
+++ 
websites/production/struts/content/core-developers/ajax-client-side-validation.html
 Thu Jun  1 11:35:58 2017
@@ -0,0 +1,768 @@
+<!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>AJAX Client Side Validation</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="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.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="/downloads.html">Downloads</a></li>
+                <li><a href="/announce.html">Announcements</a></li>
+                <li><a href="http://www.apache.org/licenses/";>License</a></li>
+                <li><a 
href="http://apache.org/foundation/thanks.html";>Thanks!</a></li>
+                <li><a 
href="http://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="/maven/project-info.html">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="/docs/tutorials.html">Tutorials</a></li>
+                <li><a href="/docs/faqs.html">FAQs</a></li>
+                <li><a href="/docs/guides.html">Guides</a></li>
+                <li class="divider"></li>
+                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
+                <li><a href="/docs/plugins.html">Plugin APIs</a></li>
+                <li><a href="/docs/tag-reference.html">Tag reference</a></li>
+                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
+                <li class="divider"></li>
+                <li><a href="/security/">Security Guide (WIP)</a></li>
+                <li><a href="/core-developers/">Core Developers Guide 
(WIP)</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</a></li>
+                <li><a href="/coding-standards.html">Coding standards</a></li>
+                <li class="divider"></li>
+                <li><a href="/releases.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://git-wip-us.apache.org/repos/asf?p=struts.git";>Source 
Repository</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 href="index.html" title="back to Core Developers Guide"><< back to Core 
Developers Guide</a>
+    <h1 id="ajax-client-side-validation">AJAX Client Side Validation</h1>
+
+<p>This validation mode only works with the <em>ajax theme</em></p>
+
+<table>
+  <tbody>
+    <tr>
+    </tr>
+  </tbody>
+</table>
+
+<p>AJAX-based client side validation improves upon <a href="#PAGE_14262">Pure 
JavaScript Client Side Validation</a> by using a combination of JavaScript, DOM 
manipulation, and remote server communication. Unlike the pure client side 
implementation, AJAX-based validation communicates with the server. This means 
all your validation rules that worked when submitting a form will still work 
within the browser.</p>
+
+<p>The validation occurs on each <strong>onblur</strong> event for each form 
element. As each user types in some values and moves to the next form element, 
the value (and all other values previously entered) will be sent to the server 
for validation. The entire validation stack is run, including visitor 
validators and your action’s validate() method.</p>
+
+<p>If there is an error, like the pure implementation, the HTML and DOM will 
be updated immediately.</p>
+
+<p>For an example of this, see <em>AJAX Validation</em> .</p>
+
+<p><strong>AJAX Validation</strong></p>
+
+<p><strong>Description</strong></p>
+
+<p>Struts provides <a href="client-side-validation.html">client side 
validation</a>(using JavaScript) for a few validators. Using AJAX validation, 
all <a href="#PAGE_14292">validators</a> available to the application on the 
server side can be used without forcing the page to reload, just to show 
validation errors. AJAX validation has a server side, which is in included in 
<em>JSON Plugin</em>  (an interceptor and a result). Client side must be 
handled by applictions themself. One reason for that is there are too many 
JavaScript frameworks and libraries. Struts has no preference which of them you 
use. Previous versions of Struts included a client side which was relying on 
the Dojo JS framework and was located in Struts Dojo plugin. That has been 
deprecated for a long time and was eventually removed.</p>
+
+<p><strong>Example</strong></p>
+
+<p>This example is taken from the Struts showcase application.</p>
+
+<p><strong>Create the action class</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>public class 
AjaxFormSubmitAction extends ActionSupport {
+    private String requiredValidatorField = null;
+    private String requiredStringValidatorField = null;
+    private Integer integerValidatorField = null;
+    private Date dateValidatorField = null;
+    private String emailValidatorField = null;
+    private String urlValidatorField = null;
+    private String stringLengthValidatorField = null;
+    private String regexValidatorField = null;
+    private String fieldExpressionValidatorField = null;
+    @Override
+    public void validate() {
+        if (hasFieldErrors()) {
+            addActionError("Errors present!");
+        }
+    }
+    public Date getDateValidatorField() {
+        return dateValidatorField;
+    }
+    @DateRangeFieldValidator(
+        min="01/01/1990", 
+        max="01/01/2000", 
+        message="must be a min 01-01-1990 max 01-01-2000 if supplied")
+    public void setDateValidatorField(Date dateValidatorField) {
+        this.dateValidatorField = dateValidatorField;
+    }
+    public String getEmailValidatorField() {
+        return emailValidatorField;
+    }
+    @EmailValidator(message="must be a valid email if supplied")
+    public void setEmailValidatorField(String emailValidatorField) {
+        this.emailValidatorField = emailValidatorField;
+    }
+    public Integer getIntegerValidatorField() {
+        return integerValidatorField;
+    }
+    @IntRangeFieldValidator(min="1", max="10", message="must be integer min 1 
max 10 if supplied")
+    public void setIntegerValidatorField(Integer integerValidatorField) {
+        this.integerValidatorField = integerValidatorField;
+    }
+    public String getRegexValidatorField() {
+        return regexValidatorField;
+    }
+    @RegexFieldValidator(
+        regex="[^&lt;&gt;]+", 
+        message="regexValidatorField must match a regexp (.*\\.txt) if 
specified")
+    public void setRegexValidatorField(String regexValidatorField) {
+        this.regexValidatorField = regexValidatorField;
+    }
+    public String getRequiredStringValidatorField() {
+        return requiredStringValidatorField;
+    }
+    @RequiredStringValidator(trim=true, message="required and must be string")
+    public void setRequiredStringValidatorField(String 
requiredStringValidatorField) {
+        this.requiredStringValidatorField = requiredStringValidatorField;
+    }
+    public String getRequiredValidatorField() {
+        return requiredValidatorField;
+    }
+    @RequiredFieldValidator(message="required")
+    public void setRequiredValidatorField(String requiredValidatorField) {
+        this.requiredValidatorField = requiredValidatorField;
+    }
+    public String getStringLengthValidatorField() {
+        return stringLengthValidatorField;
+    }
+    @StringLengthFieldValidator(
+        minLength="2", 
+        maxLength="4", 
+        trim=true, 
+        message="must be a String of a specific greater than 1 less than 5 if 
specified")
+    public void setStringLengthValidatorField(String 
stringLengthValidatorField) {
+        this.stringLengthValidatorField = stringLengthValidatorField;
+    }
+    public String getFieldExpressionValidatorField() {
+        return fieldExpressionValidatorField;
+    }
+    @FieldExpressionValidator(
+        expression = "(fieldExpressionValidatorField == 
requiredValidatorField)", 
+        message = "must be the same as the Required Validator Field if 
specified")
+    public void setFieldExpressionValidatorField(
+            String fieldExpressionValidatorField) {
+        this.fieldExpressionValidatorField = fieldExpressionValidatorField;
+    }
+    public String getUrlValidatorField() {
+        return urlValidatorField;
+    }
+    @UrlValidator(message="must be a valid url if supplied")
+    public void setUrlValidatorField(String urlValidatorField) {
+        this.urlValidatorField = urlValidatorField;
+    }
+}
+</code></pre>
+</div>
+
+<p> </p>
+
+<p><strong>Map the Action</strong></p>
+
+<p>Note that is is not necessary when using <em>Convention Plugin</em> .</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="cp">&lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD 
Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</span>
+       
+<span class="nt">&lt;struts&gt;</span>
+    <span class="nt">&lt;package&gt;</span>
+         <span class="nt">&lt;action</span> <span class="na">name=</span><span 
class="s">"ajaxFormSubmit"</span> <span class="na">class=</span><span 
class="s">"org.apache.struts2.showcase.validation.AjaxFormSubmitAction"</span><span
 class="nt">&gt;</span>
+             <span class="nt">&lt;interceptor-ref</span> <span 
class="na">name=</span><span 
class="s">"jsonValidationWorkflowStack"</span><span class="nt">/&gt;</span>
+             <span class="nt">&lt;result</span> <span 
class="na">name=</span><span class="s">"input"</span><span 
class="nt">&gt;</span>/WEB-INF/validation/ajaxFormSubmit.jsp<span 
class="nt">&lt;/result&gt;</span>
+             <span class="nt">&lt;result</span> <span 
class="na">type=</span><span class="s">"jsonActionRedirect"</span><span 
class="nt">&gt;</span>ajaxFormSubmitSuccess<span 
class="nt">&lt;/result&gt;</span>
+         <span class="nt">&lt;/action&gt;</span>
+    <span class="nt">&lt;/package&gt;</span>
+
+</code></pre>
+</div>
+
+<p>AJAX validation is performed by the <em>jsonValidation</em>  interceptor. 
This interceptor is included in the <em>jsonValidationWorkflowStack</em> , and 
is required in order to perform AJAX validation. Normal results(input, success, 
etc) should be provided for the action in the case that someone tries to access 
the action directly, in which case normal validation will be triggered. So, how 
does the <em>jsonValidation</em>  know that it must perform AJAX validation vs 
regular validation? We will see that in a minute, but you don’t need to know 
that in order to use AJAX validation. Same applies for specialized Redirect 
Result Type <em>jsonActionRedirect</em> .</p>
+
+<p><strong>Create the JSP</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="err">&lt;</span>%@taglib prefix="s" uri="/struts-tags" %&gt;
+<span class="nt">&lt;html&gt;</span>
+<span class="nt">&lt;head&gt;</span>
+    <span class="nt">&lt;title&gt;</span>Struts2 Showcase - Validation - AJAX 
Form Submit<span class="nt">&lt;/title&gt;</span>
+    <span class="nt">&lt;s:head</span> <span class="na">theme=</span><span 
class="s">"xhtml"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/head&gt;</span>
+<span class="nt">&lt;body&gt;</span>
+<span class="nt">&lt;div</span> <span class="na">class=</span><span 
class="s">"page-header"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;h1&gt;</span>AJAX Form Submit<span 
class="nt">&lt;/h1&gt;</span>
+<span class="nt">&lt;/div&gt;</span>
+    <span class="nt">&lt;h3&gt;</span>Action Errors Will Appear Here<span 
class="nt">&lt;/h3&gt;</span>
+    <span class="nt">&lt;s:actionerror</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;hr/&gt;</span>
+    <span class="nt">&lt;s:form</span> <span class="na">method=</span><span 
class="s">"POST"</span> <span class="na">theme=</span><span 
class="s">"xhtml"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Required Validator Field"</span> <span 
class="na">name=</span><span class="s">"requiredValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Required String Validator 
Field"</span> <span class="na">name=</span><span 
class="s">"requiredStringValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Integer Validator Field"</span> <span 
class="na">name=</span><span class="s">"integerValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Date Validator Field"</span> <span 
class="na">name=</span><span class="s">"dateValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Email Validator Field"</span> <span 
class="na">name=</span><span class="s">"emailValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"URL Validator Field"</span> <span 
class="na">name=</span><span class="s">"urlValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"String Length Validator Field"</span> 
<span class="na">name=</span><span 
class="s">"stringLengthValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Regex Validator Field"</span> <span 
class="na">name=</span><span class="s">"regexValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:textfield</span> <span 
class="na">label=</span><span class="s">"Field Expression Validator 
Field"</span> <span class="na">name=</span><span 
class="s">"fieldExpressionValidatorField"</span> <span 
class="na">theme=</span><span class="s">"ajaxErrorContainers"</span><span 
class="nt">/&gt;</span>
+        <span class="nt">&lt;s:submit</span> <span 
class="na">label=</span><span class="s">"Submit"</span> <span 
class="na">cssClass=</span><span class="s">"btn btn-primary"</span><span 
class="nt">/&gt;</span>
+    <span class="nt">&lt;/s:form&gt;</span>
+<span class="nt">&lt;/body&gt;</span>
+<span class="nt">&lt;/html&gt;</span> 
+</code></pre>
+</div>
+
+<p>Things to note on this JSP:</p>
+
+<ul>
+  <li>
+    <p>The <em>form</em>  tag <strong>does not</strong> have <em>validate</em> 
 set to <em>true</em> , which would perform client validation before the AJAX 
validation.</p>
+  </li>
+  <li>
+    <p>It uses a customized theme <em>ajaxErrorContainers</em> . The default 
Struts themes generate HTML-Elements to show validation errors only if errors 
are present when page is created on server side. But in order to show 
validation errors that arrive later via AJAX it is necessary to have 
error-container elements in DOM always.</p>
+  </li>
+</ul>
+
+<p>What happens if validation succeeds? That depends on your request 
parameters and action configuration. If you are using 
<em>jsonActionRedirect</em>  result mentioned above the action will be executed 
while AJAX request is active and respond with JSON providing a new URL to load. 
Otherwise the AJAX response will be empty and the form must be submitted a 2nd 
time but as usual request, not AJAX.</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>Setting <em>validate</em>  to <em>true</em>  in the <em>form</em>  
tag will enable client side, JavaScript validation, which can be used along 
with AJAX validation (runs before the AJAX validation).</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Custom Theme</strong></p>
+
+<p>In this sample the <em>custom theme</em>  is based on <em>xhtml</em>  
theme. It is required to override 3 FTL files.</p>
+
+<blockquote>
+  <p>theme.properties</p>
+</blockquote>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>parent = xhtml
+</code></pre>
+</div>
+
+<p> </p>
+
+<blockquote>
+  <p>actionerror.ftl</p>
+</blockquote>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>&lt;#--
+    Make sure element is always present. To be filled later via JS.
+--&gt;
+&lt;ul&lt;#rt/&gt;
+&lt;#if parameters.id??&gt;
+ id="${parameters.id?html}"&lt;#rt/&gt;
+&lt;/#if&gt;            
+&lt;#if parameters.cssClass??&gt;
+ class="${parameters.cssClass?html}"&lt;#rt/&gt;
+&lt;#else&gt;
+ class="errorMessage"&lt;#rt/&gt;
+&lt;/#if&gt;
+&lt;#if parameters.cssStyle??&gt;
+ style="${parameters.cssStyle?html}"&lt;#rt/&gt;
+&lt;/#if&gt;
+&gt;
+&lt;#if (actionErrors?? &amp;&amp; actionErrors?size &gt; 0)&gt;
+    &lt;#list actionErrors as error&gt;
+        &lt;#if error??&gt;
+            &lt;li&gt;&lt;span&gt;&lt;#if 
parameters.escape&gt;${error!?html}&lt;#else&gt;${error!}&lt;/#if&gt;&lt;/span&gt;&lt;#rt/&gt;&lt;/li&gt;&lt;#rt/&gt;
+        &lt;/#if&gt;
+    &lt;/#list&gt;
+&lt;/#if&gt;
+&lt;/ul&gt;
+</code></pre>
+</div>
+
+<p> </p>
+
+<blockquote>
+  <p>controlfooter.ftl</p>
+</blockquote>
+
+<div class="highlighter-rouge"><pre 
class="highlight"><code>${parameters.after!}&lt;#t/&gt;
+    &lt;/td&gt;&lt;#lt/&gt;
+&lt;/tr&gt;
+&lt;#if (parameters.errorposition!"top") == 'bottom'&gt;
+&lt;#assign hasFieldErrors = parameters.name?? &amp;&amp; fieldErrors?? 
&amp;&amp; fieldErrors[parameters.name]??/&gt;
+&lt;#if hasFieldErrors&gt;
+&lt;tr errorFor="${parameters.id}"&gt;
+    &lt;td class="tdErrorMessage" colspan="2"&gt;&lt;#rt/&gt;
+        &lt;#if hasFieldErrors&gt;
+            &lt;#list fieldErrors[parameters.name] as error&gt;
+                &lt;div 
class="errorMessage"&gt;${error?html}&lt;/div&gt;&lt;#t/&gt;
+            &lt;/#list&gt;
+        &lt;/#if&gt;
+    &lt;/td&gt;&lt;#lt/&gt;
+&lt;/tr&gt;
+&lt;/#if&gt;
+&lt;/#if&gt;
+
+
+</code></pre>
+</div>
+
+<p> </p>
+
+<blockquote>
+  <p>controlheader-core.ftl</p>
+</blockquote>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> &lt;#--
+    Always include elements to show errors. They may be filled later via AJAX.
+--&gt;
+&lt;#assign hasFieldErrors = parameters.name?? &amp;&amp; fieldErrors?? 
&amp;&amp; fieldErrors[parameters.name]??/&gt;
+&lt;#if (parameters.errorposition!"top") == 'top'&gt;
+&lt;tr errorFor="${parameters.id}"&gt;
+    &lt;td class="tdErrorMessage" colspan="2" 
data-error-for-fieldname="${parameters.name}"&gt;&lt;#rt/&gt;
+        &lt;#if hasFieldErrors&gt;
+            &lt;#list fieldErrors[parameters.name] as error&gt;
+                &lt;div 
class="errorMessage"&gt;${error?html}&lt;/div&gt;&lt;#t/&gt;
+            &lt;/#list&gt;
+        &lt;/#if&gt;
+    &lt;/td&gt;&lt;#lt/&gt;
+&lt;/tr&gt;
+&lt;/#if&gt;
+&lt;#if !parameters.labelposition?? &amp;&amp; 
(parameters.form.labelposition)??&gt;
+&lt;#assign labelpos = parameters.form.labelposition/&gt;
+&lt;#elseif parameters.labelposition??&gt;
+&lt;#assign labelpos = parameters.labelposition/&gt;
+&lt;/#if&gt;
+&lt;#--
+    if the label position is top,
+    then give the label it's own row in the table
+--&gt;
+&lt;tr&gt;
+&lt;#if (labelpos!"") == 'top'&gt;
+    &lt;td class="tdLabelTop" colspan="2"&gt;&lt;#rt/&gt;
+&lt;#else&gt;
+    &lt;td class="tdLabel"&gt;&lt;#rt/&gt;
+&lt;/#if&gt;
+&lt;#if parameters.label??&gt;
+    &lt;label &lt;#t/&gt;
+&lt;#if parameters.id??&gt;
+        for="${parameters.id?html}" &lt;#t/&gt;
+&lt;/#if&gt;
+&lt;#if hasFieldErrors&gt;
+        class="errorLabel"&lt;#t/&gt;
+&lt;#else&gt;
+        class="label"&lt;#t/&gt;
+&lt;/#if&gt;
+    &gt;&lt;#t/&gt;
+&lt;#if parameters.required!false &amp;&amp; 
parameters.requiredPosition!"right" != 'right'&gt;
+        &lt;span class="required"&gt;*&lt;/span&gt;&lt;#t/&gt;
+&lt;/#if&gt;
+${parameters.label?html}&lt;#t/&gt;
+&lt;#if parameters.required!false &amp;&amp; 
parameters.requiredPosition!"right" == 'right'&gt;
+ &lt;span class="required"&gt;*&lt;/span&gt;&lt;#t/&gt;
+&lt;/#if&gt;
+${parameters.labelseparator!":"?html}&lt;#t/&gt;
+&lt;#include 
"/${parameters.templateDir}/${parameters.expandTheme}/tooltip.ftl" /&gt;
+&lt;/label&gt;&lt;#t/&gt;
+&lt;/#if&gt;
+    &lt;/td&gt;&lt;#lt/&gt;
+&lt;#-- add the extra row --&gt;
+&lt;#if (labelpos!"") == 'top'&gt;
+&lt;/tr&gt;
+&lt;tr&gt;
+&lt;/#if&gt;
+
+
+</code></pre>
+</div>
+
+<p><strong>CSS</strong></p>
+
+<p>To show users some nice visual feedback while waiting for AJAX response you 
can use a little CSS. Remember to include the referenced <em>indicator.gif</em> 
.</p>
+
+<div class="highlighter-rouge"><pre 
class="highlight"><code>.ajaxVisualFeedback {
+    width: 16px;
+    height: 16px;
+    background-image: url('../images/indicator.gif');
+    background-repeat: no-repeat;
+    float: right;
+}
+</code></pre>
+</div>
+
+<p> </p>
+
+<p><strong>JavaScript</strong></p>
+
+<p>Now this is where the magic happens. Here <em>jQuery</em>  is used to 
register an eventhandler which intercepts form submits. It takes care of hiding 
validation errors that might be present, submit the form via AJAX and handle 
JSON responses.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> /**
+  * Validates form per AJAX. To be called as onSubmit handler.
+  *
+  * @param event onSubmit event
+  */
+function ajaxFormValidation(event) {
+    event.preventDefault();
+    _removeValidationErrors();
+    var _form = $(event.target);
+    var _formData = _form.serialize(true);
+    // prepare visual feedback
+    // you may want to use other elements here
+    var originalButton = _form.find('.btn-primary');
+    // note: jQuery returns an array-like object
+    if (originalButton &amp;&amp; originalButton.length &amp;&amp; 
originalButton.length &gt; 0) {
+        originalButton.hide();
+        var feedbackElement = $('&lt;div 
class="ajaxVisualFeedback"&gt;&lt;/div&gt;').insertAfter(originalButton);
+        var restoreFunction = function() {
+            originalButton.show();
+            feedbackElement.remove();
+        }
+    }
+    var options = {
+        data: 
'struts.enableJSONValidation=true&amp;struts.validateOnly=false&amp;' + 
_formData,
+        async: true,
+        processData: false,
+        type: 'POST',
+        success: function (response, statusText, xhr) {
+            if (response.location) {
+                // no validation errors
+                // action has been executed and sent a redirect URL wrapped as 
JSON
+                // cannot use a normal http-redirect (status-code 3xx) as this 
would be followed by browsers and would not be available here
+                // follow JSON-redirect
+                window.location.href = response.location;
+            } else {
+                if (restoreFunction) {
+                    restoreFunction();
+                }
+                _handleValidationResult(_form, response);
+            }
+        },
+        error: function(xhr, textStatus, errorThrown) {
+            if (restoreFunction) {
+                restoreFunction();
+            }
+            // struts sends status code 400 when validation errors are present
+            if (xhr.status === 400) {
+                _handleValidationResult(_form, JSON.parse(xhr.responseText))
+            } else {
+                // a real error occurred -&gt; show user an error message
+                _handleValidationResult(_form, {errors: ['Network or server 
error!']})
+            }
+               }
+    }
+    // send request, after delay to make sure everybody notices the visual 
feedback :)
+    window.setTimeout(function() {
+        var url = _form[0].action;
+        jQuery.ajax(url, options);
+    }, 1000);
+}
+/**
+ * Removes validation errors from HTML DOM.
+ */
+function _removeValidationErrors() {
+    // action errors
+    // you might want to use a custom ID here
+    $('ul.errorMessage li').remove();
+    // field errors
+    $('div.errorMessage').remove();
+}
+/**
+ * Incorporates validation errors in HTML DOM.
+ *
+ * @param form Form containing errors.
+ * @param errors Errors from server.
+ */
+function _handleValidationResult(form, errors) {
+    // action errors
+    if (errors.errors) {
+        // you might want to use a custom ID here
+        var errorContainer = $('ul.errorMessage');
+        $.each(errors.errors, function(index, errorMsg) {
+            var li = $('&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;');
+            li.text(errorMsg); // use text() for security reasons
+            errorContainer.append(li);
+        });
+    }
+    // field errors
+    if (errors.fieldErrors) {
+        $.each(errors.fieldErrors, function(fieldName, errorMsg) {
+            var td = $('td[data-error-for-fieldname="' + fieldName + '"]');
+            if (td) {
+                var div = $('&lt;div class="errorMessage"&gt;&lt;/div&gt;');
+                div.text(errorMsg); // use text() for security reasons
+                td.append(div);
+            }
+        });
+    }
+}
+// register onSubmit handler
+$(window).bind('load', function() {
+    $('form').bind('submit', ajaxFormValidation);
+});
+</code></pre>
+</div>
+
+<p> </p>
+
+<p><strong>How it works</strong></p>
+
+<p><em>jsonValidation</em>  interceptor must be placed on a stack, following 
the <em>validation</em>  interceptor. The interceptor itself won’t perform 
any validation, but will check for validation errors on the action being 
invoked (assuming that the action is ValidationAware).</p>
+
+<p>If you just want to use AJAX validation, without knowing the implementation 
details, you can skip this section.</p>
+
+<p>When the <em>jsonValidation</em>  interceptor is invoked, it will look for 
a parameter named <em>struts.enableJSONValidation</em> , this parameter 
<strong>must</strong> be set to <em>true</em> , otherwise the interceptor 
won’t do anything. Then the interceptor will look for a parameter named 
<em>struts.validateOnly</em> , if this parameter exists, is set to 
<em>true</em> , and there are validation errors (o action errors) they will be 
serialized into JSON in the form:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span class="w">
+    </span><span class="nt">"errors"</span><span class="p">:</span><span 
class="w"> </span><span class="p">[</span><span class="s2">"Global Error 
1"</span><span class="p">,</span><span class="w"> </span><span 
class="s2">"Global Error 2"</span><span class="p">],</span><span class="w">
+    </span><span class="nt">"fieldErrors"</span><span class="p">:</span><span 
class="w"> </span><span class="p">{</span><span class="w">
+        </span><span class="nt">"field1"</span><span class="p">:</span><span 
class="w"> </span><span class="p">[</span><span class="s2">"Field 1 Error 
1"</span><span class="p">,</span><span class="w"> </span><span 
class="s2">"Field 1 Error 2"</span><span class="p">],</span><span class="w">
+        </span><span class="nt">"field1"</span><span class="p">:</span><span 
class="w"> </span><span class="p">[</span><span class="s2">"Field 2 Error 
1"</span><span class="p">,</span><span class="w"> </span><span 
class="s2">"Field 2 Error 2"</span><span class="p">]</span><span class="w">  
+    </span><span class="p">}</span><span class="w">
+</span><span class="p">}</span><span class="w">
+
+</span></code></pre>
+</div>
+
+<p>If the action implements the <em>ModelDrive</em>  interface, “model.” 
will be stripped from the field names in the returned JSON. If validation 
succeeds (and <em>struts.validateOnly</em>  is true), an empty JSON string 
will be returned:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{}</span><span class="w">
+
+</span></code></pre>
+</div>
+
+<p>If <em>struts.validateOnly</em>  is false the action and result are 
executed. In this case <em>jsonActionRedirect</em>  result is very useful. It 
creates a JSON response in the form:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span class="nt">"location"</span><span 
class="p">:</span><span class="w"> </span><span class="s2">"&lt;url to be 
loaded next&gt;"</span><span class="p">}</span><span class="w">
+
+</span></code></pre>
+</div>
+
+<blockquote>
+
+</blockquote>
+
+<blockquote>
+
+</blockquote>
+
+<blockquote>
+  <p>Remember to set struts.enableJSONValidation=true in the request to enable 
AJAX validation</p>
+</blockquote>
+
+<blockquote>
+
+</blockquote>
+
+<p><strong>JSONValidationInterceptor parameters</strong></p>
+
+<p>The following request parameters can be used to enable exposing validation 
errors:</p>
+
+<ul>
+  <li>
+    <p><strong>struts.enableJSONValidation</strong> - a request parameter 
must be set to <strong>true</strong> to use this interceptor</p>
+  </li>
+  <li>
+    <p><strong>struts.validateOnly</strong> - If the request has this 
parameter, execution will return after validation (action won’t be executed). 
If <strong>struts.validateOnly</strong> is set to false you may want to use 
<em>JSONActionRedirectResult</em></p>
+  </li>
+  <li>
+    <p><strong>struts.JSONValidation.no.encoding</strong> - If the request has 
this parameter set to <strong>true,</strong> the character encoding will 
<strong>NOT</strong> be set on the response - is needed in portlet 
environment</p>
+  </li>
+</ul>
+
+<p>You can override names of these parameters by specifying the following 
parameters when setting up a stack:</p>
+
+<ul>
+  <li>
+    <p><strong>validateJsonParam</strong> - to override name of 
<strong>struts.enableJSONValidation</strong>**
+**</p>
+  </li>
+  <li>
+    <p><strong>validateOnlyParam</strong> - to override name of 
<strong>struts.validateOnly</strong></p>
+  </li>
+  <li>
+    <p><strong>noEncodingSetParam</strong> - to override name of 
<strong>struts.JSONValidation.no.encoding</strong></p>
+  </li>
+  <li>
+    <p><strong>validationFailedStatus</strong> - status to be set on response 
when there are validation errors, by default <strong>400</strong></p>
+  </li>
+</ul>
+
+<p>**
+**</p>
+
+<p> Parameters overriding is available since Struts 2.5.9</p>
+
+<p><strong>Flow chart of AJAX validation</strong></p>
+
+<p>Some details are omitted, like results used.</p>
+
+<table>
+  <tbody>
+    <tr>
+    </tr>
+  </tbody>
+</table>
+
+<p>As explained above: there is a case where form is submitted twice, one time 
as AJAX with validation only and another time as usual submit.</p>
+
+<table>
+  <tbody>
+    <tr>
+    </tr>
+  </tbody>
+</table>
+
+<p><em>struts2-ajax-vali-flow.png</em></p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-2016 <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>
+
+
+<script>
+$(function() {
+  return $("h2, h3, h4, h5, h6").each(function(i, el) {
+    var $el, id;
+    $el = $(el);
+    id = $el.attr('id');
+    if (id) {
+      $el.removeAttr('id');
+      return $el.before($("<a />").addClass('anchor').attr('name', id));
+    }
+  });
+});
+</script>
+
+</body>
+</html>

Added: websites/production/struts/content/core-developers/ajax.html
==============================================================================
--- websites/production/struts/content/core-developers/ajax.html (added)
+++ websites/production/struts/content/core-developers/ajax.html Thu Jun  1 
11:35:58 2017
@@ -0,0 +1,346 @@
+<!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>AJAX</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="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.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="/downloads.html">Downloads</a></li>
+                <li><a href="/announce.html">Announcements</a></li>
+                <li><a href="http://www.apache.org/licenses/";>License</a></li>
+                <li><a 
href="http://apache.org/foundation/thanks.html";>Thanks!</a></li>
+                <li><a 
href="http://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="/maven/project-info.html">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="/docs/tutorials.html">Tutorials</a></li>
+                <li><a href="/docs/faqs.html">FAQs</a></li>
+                <li><a href="/docs/guides.html">Guides</a></li>
+                <li class="divider"></li>
+                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
+                <li><a href="/docs/plugins.html">Plugin APIs</a></li>
+                <li><a href="/docs/tag-reference.html">Tag reference</a></li>
+                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
+                <li class="divider"></li>
+                <li><a href="/security/">Security Guide (WIP)</a></li>
+                <li><a href="/core-developers/">Core Developers Guide 
(WIP)</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</a></li>
+                <li><a href="/coding-standards.html">Coding standards</a></li>
+                <li class="divider"></li>
+                <li><a href="/releases.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://git-wip-us.apache.org/repos/asf?p=struts.git";>Source 
Repository</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 href="index.html" title="back to Core Developers Guide"><< back to Core 
Developers Guide</a>
+    <h1 id="ajax">AJAX</h1>
+
+<p>AJAX is an acronym for Asynchronous JavaScript and XML. Essentially, a 
JavaScript can make a HTTP request and update portions of a page directly, 
without going through a conventional POST or GET and refreshing the entire 
page. Better yet, a page can contain several JavaScripts making simultaneous 
(asynchronous) requests.</p>
+
+<p>The key point is that when a script makes an “Ajax request” (XHR), the 
server doesn’t know it came from a script, and handles it like any other 
request. One reason Ajax is so successful is that it works just fine with 
existing server technologies, including Struts.</p>
+
+<p>It’s not the Ajax request that is different, but the Ajax response. 
Instead of returning an entire page for the browser to display (or redisplay), 
an Ajax response will just return a portion of a page. The response can take 
the form of XML, or HTML, or plain text, another script, or whatever else the 
calling script may want.</p>
+
+<p>Both Struts 1 and Struts 2 can return any type of response. We are not 
limited to forwarding to a server page. In Struts 1, you can just do something 
like:</p>
+
+<div class="highlighter-rouge"><pre 
class="highlight"><code>response.setContentType("text/html");
+PrintWriter out = response.getWriter();
+out.println("Hello World!  This is an AJAX response from a Struts Action.");
+out.flush();
+return null;
+
+</code></pre>
+</div>
+
+<p>In Struts 2, we can do the same thing with a Stream result.</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>Using a Struts 2 plugin (e.g., <em>JSON plugin</em> , jQuery plugin, 
etc.) is, in general, preferred to writing the response directly from within an 
action. See sections following this for further details.</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Struts 2 Stream result Action</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>package actions;
+
+import java.io.InputStream;
+import java.io.StringBufferInputStream;
+import com.opensymphony.xwork2.ActionSupport;
+
+public class TextResult extends ActionSupport  {
+    private InputStream inputStream;
+    public InputStream getInputStream() {
+        return inputStream;
+    }
+
+    public String execute() throws Exception {
+        inputStream = new ByteArrayInputStream("Hello World! This is a text 
string response from a Struts 2 Action.".getBytes("UTF-8"));
+        return SUCCESS;
+    }
+}
+
+</code></pre>
+</div>
+
+<p><strong>Struts 2 Configuring the TextResult Action</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>&lt;action 
name="text-result" class="actions.TextResult"&gt;
+    &lt;result type="stream"&gt;
+        &lt;param name="contentType"&gt;text/html&lt;/param&gt;
+        &lt;param name="inputName"&gt;inputStream&lt;/param&gt;
+    &lt;/result&gt;
+&lt;/action&gt;
+
+</code></pre>
+</div>
+
+<p>(ok)  Struts 2 can also return a JSON (JavaScript Object Notation) 
response, using a <a 
href="http://cwiki\.apache\.org/S2PLUGINS/json\-plugin\.html";>plugin</a>^[http://cwiki.apache.org/S2PLUGINS/json-plugin.html].</p>
+
+<p>On the client side, there are two basic strategies, which can be mixed and 
matched.</p>
+
+<p>First, you can use some type of JSP tag. Here, you don’t have to know 
very much at all about Ajax or JavaScript. The taglib does all the work, and 
you just have to figure out how to use the taglib. The standard Struts 2 taglib 
includes several <em>Ajax JSP tags</em> , and many third-party libraries are 
available, including:</p>
+
+<ul>
+  <li>
+    <p><a href="http://ajaxtags\.sourceforge\.net/";>Ajax 
Tags</a>^[http://ajaxtags.sourceforge.net/]</p>
+  </li>
+  <li>
+    <p><a href="http://javawebparts\.sourceforge\.net/";>AjaxParts 
Taglib</a>^[http://javawebparts.sourceforge.net/]</p>
+  </li>
+  <li>
+    <p><a 
href="http://servletsuite\.blogspot\.com/2006/06/coldtags\-suite\-ajax\-edition\.html";>ColdTags
 
Suite</a>^[http://servletsuite.blogspot.com/2006/06/coldtags-suite-ajax-edition.html]</p>
+  </li>
+  <li>
+    <p><a href="http://www\.jenkov\.com/prizetags/introduction\.tmpl";>Prize 
Tags</a>^[http://www.jenkov.com/prizetags/introduction.tmpl]</p>
+  </li>
+  <li>
+    <p><a 
href="http://json\-taglib\.sourceforge\.net/";>JSON-taglib</a>^[http://json-taglib.sourceforge.net/]</p>
+  </li>
+</ul>
+
+<p>Alternatively, you can use a plain-old Ajax widget on a plain-old HTML 
page, using libraries like <a 
href="http://dojotoolkit\.org/";>Dojo</a>^[http://dojotoolkit.org/], <a 
href="http://jquery\.com/";>JQuery</a>^[http://jquery.com/], or <a 
href="http://developer\.yahoo\.com/yui/";>YUI</a>^[http://developer.yahoo.com/yui/],
 and the StreamResult or the <a 
href="http://cwiki\.apache\.org/S2PLUGINS/json\-plugin\.html";>JSON 
Plugin</a>^[http://cwiki.apache.org/S2PLUGINS/json-plugin.html]. Here, the 
sky’s the limit, but you actually have to learn something about JavaScript as 
a language.</p>
+
+<p>####Ajax Plugins####</p>
+
+<p>While Struts works fine with Ajax out-of-the-box, for added value, several 
Ajax-centric plugins are available.</p>
+
+<p>#####Ajax Tag Plugins#####</p>
+
+<ul>
+  <li>
+    <p><strong>jQuery</strong> - The <a 
href="https://github\.com/struts\-community\-plugins/struts2\-jquery";>jQuery 
Plugin</a>^[https://github.com/struts-community-plugins/struts2-jquery] 
provide ajax functionality and UI Widgets an JavaScript Grid based on the 
jQuery javascript framework.**
+**</p>
+  </li>
+  <li>
+    <p><strong>Ajax Parts</strong> - The <a 
href="http://code\.google\.com/p/struts2ajaxpartstaglibplugin/";>AjaxParts 
Taglib (APT)</a>^[http://code.google.com/p/struts2ajaxpartstaglibplugin/] is a 
component of the Java Web Parts (JWP) project (<a 
href="http://javawebparts\.sourceforge\.net";>http://javawebparts.sourceforge.net</a>)
 that allows for 100% declarative (read: no Javascript coding required!) AJAX 
functionality within a Java-based webapp.</p>
+  </li>
+  <li>
+    <p><strong>Dojo</strong> - The <em>Ajax Tags Dojo Plugin</em>  was 
represented as a theme for Struts 2.0. For Struts 2.1, the Dojo tags are 
bundled as a plugin until version 2.3.x. Since version 2.5 this plugin is not 
part of th Struts2 distribution anymore </p>
+  </li>
+  <li>
+    <p><strong>YUI</strong> - The <a 
href="https://code\.google\.com/p/struts2yuiplugin/";>Yahoo User Interface (YUI) 
Plugin</a>^[https://code.google.com/p/struts2yuiplugin/] has only a few tags 
are available so far, but the YUI tags tend to be easier to use than the Dojo 
versions.</p>
+  </li>
+</ul>
+
+<p>#####Other Ajax Plugins#####</p>
+
+<ul>
+  <li>
+    <p><strong>Ajax File Upload</strong> - With the <a 
href="http://www\.davidjc\.com/ajaxfileupload/demo\!input\.action";>Ajax File 
Upload Plugin</a>^[http://www.davidjc.com/ajaxfileupload/demo!input.action] we 
can upload a file to the server and asynchronously monitor its progress.</p>
+  </li>
+  <li>
+    <p><strong>GWT</strong> - The <a 
href="https://code\.google\.com/p/struts2gwtplugin/";>Google Web Toolkit 
Plugin</a>^[https://code.google.com/p/struts2gwtplugin/] exposes Struts 2 
actions to the GWT RPC mechanism.</p>
+  </li>
+  <li>
+    <p><strong>JSON</strong> - The <em>JSON Plugin</em>  serializes Actions 
properties into JSON, making it easy to respond to JavaScript requests.</p>
+  </li>
+</ul>
+
+<p>See the <a href="http://cwiki\.apache\.org/S2PLUGINS/home\.html";>Struts 
Plugin Repository</a>^[http://cwiki.apache.org/S2PLUGINS/home.html] for a 
complete list of Struts 2 plugins.</p>
+
+<p>####Ajax Results with JSP####</p>
+
+<p>While server pages are most often used to generate HTML, we can use server 
pages to create other types of data streams. Here’s an example:</p>
+
+<p><strong>book.jsp</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>&lt;%@ page 
import="java.util.Iterator,
+                java.util.List,
+                com.esolaria.dojoex.Book,
+                com.esolaria.dojoex.BookManager" %&gt;
+&lt;%
+       String bookIdStr = request.getParameter("bookId");
+       int bookId = (bookIdStr == null || "".equals(bookIdStr.trim())) 
+               ? 0 : Integer.parseInt(bookIdStr);
+       Book book = BookManager.getBook(bookId);
+       if (book != null) {
+               out.println(book.toJSONString());
+               System.out.println("itis: " + book.toJSONString());
+       }
+%&gt;
+
+</code></pre>
+</div>
+
+<p>In the code example, we use</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>System.out.println
+</code></pre>
+</div>
+<p>to return a JSON data stream as the response. For more about this 
technique, see the article <a 
href="http://today\.java\.net/pub/a/today/2006/04/27/building\-ajax\-with\-dojo\-and\-json\.html";>Using
 Dojo and JSON to Build Ajax 
Applications</a>^[http://today.java.net/pub/a/today/2006/04/27/building-ajax-with-dojo-and-json.html].</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-2016 <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>
+
+
+<script>
+$(function() {
+  return $("h2, h3, h4, h5, h6").each(function(i, el) {
+    var $el, id;
+    $el = $(el);
+    id = $el.attr('id');
+    if (id) {
+      $el.removeAttr('id');
+      return $el.before($("<a />").addClass('anchor').attr('name', id));
+    }
+  });
+});
+</script>
+
+</body>
+</html>

Added: websites/production/struts/content/core-developers/alias-interceptor.html
==============================================================================
--- websites/production/struts/content/core-developers/alias-interceptor.html 
(added)
+++ websites/production/struts/content/core-developers/alias-interceptor.html 
Thu Jun  1 11:35:58 2017
@@ -0,0 +1,204 @@
+<!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>Alias Interceptor</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="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.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="/downloads.html">Downloads</a></li>
+                <li><a href="/announce.html">Announcements</a></li>
+                <li><a href="http://www.apache.org/licenses/";>License</a></li>
+                <li><a 
href="http://apache.org/foundation/thanks.html";>Thanks!</a></li>
+                <li><a 
href="http://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="/maven/project-info.html">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="/docs/tutorials.html">Tutorials</a></li>
+                <li><a href="/docs/faqs.html">FAQs</a></li>
+                <li><a href="/docs/guides.html">Guides</a></li>
+                <li class="divider"></li>
+                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
+                <li><a href="/docs/plugins.html">Plugin APIs</a></li>
+                <li><a href="/docs/tag-reference.html">Tag reference</a></li>
+                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
+                <li class="divider"></li>
+                <li><a href="/security/">Security Guide (WIP)</a></li>
+                <li><a href="/core-developers/">Core Developers Guide 
(WIP)</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</a></li>
+                <li><a href="/coding-standards.html">Coding standards</a></li>
+                <li class="divider"></li>
+                <li><a href="/releases.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://git-wip-us.apache.org/repos/asf?p=struts.git";>Source 
Repository</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 href="index.html" title="back to Core Developers Guide"><< back to Core 
Developers Guide</a>
+    <h1 id="alias-interceptor">Alias Interceptor</h1>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.interceptor.AliasInterceptor</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Parameters#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.interceptor.AliasInterceptor</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Extending the Interceptor#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=extending|javadoc=true|url=com.opensymphony.xwork2.interceptor.AliasInterceptor</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+<p>#####Examples#####</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span 
class="p">{</span><span 
class="err">snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.interceptor.AliasInterceptor</span><span
 class="p">}</span><span class="w">
+</span></code></pre>
+</div>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-2016 <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>
+
+
+<script>
+$(function() {
+  return $("h2, h3, h4, h5, h6").each(function(i, el) {
+    var $el, id;
+    $el = $(el);
+    id = $el.attr('id');
+    if (id) {
+      $el.removeAttr('id');
+      return $el.before($("<a />").addClass('anchor').attr('name', id));
+    }
+  });
+});
+</script>
+
+</body>
+</html>


Reply via email to