struts-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From git-site-r...@apache.org
Subject [struts-site] branch asf-site updated: Updates production by Jenkins
Date Wed, 27 Sep 2017 14:29:40 GMT
This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/struts-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 8ae801d  Updates production by Jenkins
8ae801d is described below

commit 8ae801d86070ec60af2dec653429fa7d8e1831cb
Author: jenkins <builds@apache.org>
AuthorDate: Wed Sep 27 14:29:38 2017 +0000

    Updates production by Jenkins
---
 content/plugins/bean-validation/index.html         |  388 +
 content/plugins/cdi/index.html                     |  597 ++
 content/plugins/codebehind/index.html              |  301 +
 content/plugins/config-browser/index.html          |  221 +
 content/plugins/dwr/index.html                     |  221 +
 content/plugins/embedded-jsp/index.html            |  255 +
 content/plugins/jasperreports/index.html           |  283 +
 content/plugins/java-8-support/index.html          |  219 +
 content/plugins/javatemplates/index.html           |  232 +
 content/plugins/jfreechart/index.html              |  281 +
 content/plugins/jsf/index.html                     |  282 +
 content/plugins/osgi/index.html                    |  581 ++
 content/plugins/oval/index.html                    |  405 +
 content/plugins/plexus/index.html                  |  243 +
 content/plugins/plugin-developers.html             | 8595 +-------------------
 content/plugins/plugins.html                       |  601 ++
 content/plugins/portlet-tiles/index.html           |  252 +
 content/plugins/portlet/index.html                 |  413 +
 .../plugins/portlet/struts-2-portlet-tutorial.html |  800 ++
 content/plugins/rest/index.html                    |  659 ++
 content/plugins/sitegraph/index.html               |  331 +
 content/plugins/sitemesh/index.html                |  498 ++
 content/plugins/spring/index.html                  |  492 ++
 .../spring-session-components-workarounds.html     |  186 +
 content/plugins/struts-1/index.html                |  347 +
 content/plugins/testng/index.html                  |  240 +
 content/plugins/tiles-3/index.html                 |  263 +
 content/plugins/tiles/index.html                   |  345 +
 content/plugins/tiles/tiles-use.html               |  252 +
 29 files changed, 10199 insertions(+), 8584 deletions(-)

diff --git a/content/plugins/bean-validation/index.html b/content/plugins/bean-validation/index.html
new file mode 100644
index 0000000..2bf5d98
--- /dev/null
+++ b/content/plugins/bean-validation/index.html
@@ -0,0 +1,388 @@
+<!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>Bean Validation Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/bean-validation/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="bean-validation-plugin">Bean Validation Plugin</h1>
+
+<h2 id="bean-validation">Bean Validation</h2>
+
+<p>The Bean Validation plugin implements a bridge to use Bean Validation in struts actions. Bean Validation has been specified in JSR 303 and is part of the JavaEE platform. Full-fledged application servers already bring validation providers which can be leveraged by this plugin. The plugin integrates with other struts features like:</p>
+
+<ul>
+  <li>
+    <p>i18n</p>
+  </li>
+  <li>
+    <p>model driven</p>
+  </li>
+  <li>
+    <p>AJAX Validation</p>
+  </li>
+  <li>
+    <p>workflow</p>
+  </li>
+</ul>
+
+<h2 id="setup">Setup</h2>
+
+<p>In order to use the Bean Validation plugin, you first need to add the JAR file to the <code class="highlighter-rouge">WEB-INF/lib</code> directory of your application or include the dependency in your project’s Maven POM file.</p>
+
+<p><strong>pom.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
+    <span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
+    <span class="nt">&lt;artifactId&gt;</span>struts2-bean-validation-plugin<span class="nt">&lt;/artifactId&gt;</span>
+    <span class="nt">&lt;version&gt;</span>X.X.X<span class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+</code></pre>
+</div>
+
+<p>Where X.X.X is the current version of Struts 2. Please remember that the Bean Validation Plugin is available from version 2.5.</p>
+
+<h2 id="configuration">Configuration</h2>
+
+<p>This sample shows the configuration constants the plugin provides. It also shows how to enable bean-validation by extending your own application package from <code class="highlighter-rouge">struts-bean-validation</code> which comes along with the plugin.</p>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.beanValidation.providerClass"</span> <span class="na">value=</span><span class="s">"org.hibernate.validator.HibernateValidator"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.beanValidation.ignoreXMLConfiguration"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.beanValidation.convertMessageToUtf"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.beanValidation.convertMessageFromEncoding"</span> <span class="na">value=</span><span class="s">"ISO-8859-1"</span><span class="nt">/&gt;</span>
+ 
+    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"my-bean-validation"</span> <span class="na">extends=</span><span class="s">"struts-bean-validation"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;/package&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+</code></pre>
+</div>
+
+<p>Here is another example that shows how you can combine bean-validation with other plugins by configuring your own Interceptor-Stack (note: this is just a very short example. In a real app you should take more care about your stack). You can combine bean validation with classic struts validation (or disable either) by putting the according interceptors in your stack (or by removing them from your stack).</p>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>	<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"my-app-package"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
+		<span class="nt">&lt;interceptors&gt;</span>
+			<span class="nt">&lt;interceptor&gt;</span>
+				 name="beanValidation"
+				 class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor"&gt;
+			<span class="nt">&lt;/interceptor&gt;</span>
+			<span class="nt">&lt;interceptor-stack</span> <span class="na">name=</span><span class="s">"appDefaultStack"</span><span class="nt">&gt;</span>
+				<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"beanValidation"</span><span class="nt">/&gt;</span>
+				<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"defaultStack"</span><span class="nt">/&gt;</span>
+			<span class="nt">&lt;/interceptor-stack&gt;</span>
+		<span class="nt">&lt;/interceptors&gt;</span>
+	<span class="nt">&lt;/package&gt;</span>
+</code></pre>
+</div>
+
+<p> </p>
+
+<h2 id="bean-validation-example">Bean Validation Example</h2>
+
+<p>Here is an example Action that makes use of bean validation. Note that some of the validation annotations are taken from <code class="highlighter-rouge">javax</code> package (which is defined in the JSR) while others are taken from the validaton provider (in this case: <code class="highlighter-rouge">hibernate</code>). You can specifiy own text keys in the <code class="highlighter-rouge">message</code> attribute of the annotations. If you do that the whole struts i18n mechanism kicks  [...]
+
+<p><strong>com.example.actions.BeanValidationAction</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">actions</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.beanvalidation.constraints.FieldMatch</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.struts2.convention.annotation.Action</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.struts2.convention.annotation.Namespace</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.struts2.convention.annotation.ParentPackage</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.struts2.convention.annotation.Result</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.apache.struts2.interceptor.validation.SkipValidation</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.hibernate.validator.constraints.Email</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.hibernate.validator.constraints.NotBlank</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.hibernate.validator.constraints.ScriptAssert</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">org.hibernate.validator.constraints.URL</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.validation.constraints.*</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.util.Date</span><span class="o">;</span>
+
+
+<span class="nd">@Namespace</span><span class="o">(</span><span class="s">"/bean-validation"</span><span class="o">)</span>
+<span class="nd">@ParentPackage</span><span class="o">(</span><span class="s">"my-bean-validation"</span><span class="o">)</span>
+<span class="nd">@Action</span><span class="o">(</span><span class="n">results</span> <span class="o">=</span> <span class="o">{</span>
+        <span class="nd">@Result</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"input"</span><span class="o">,</span> <span class="n">location</span> <span class="o">=</span> <span class="s">"bean-validation.jsp"</span><span class="o">),</span>
+        <span class="nd">@Result</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"success"</span><span class="o">,</span> <span class="n">location</span> <span class="o">=</span> <span class="s">"/WEB-INF/validation/successFieldValidatorsExample.jsp"</span><span class="o">)</span>
+<span class="o">})</span>
+<span class="nd">@FieldMatch</span><span class="o">(</span><span class="n">first</span> <span class="o">=</span> <span class="s">"fieldExpressionValidatorField"</span><span class="o">,</span> <span class="n">second</span> <span class="o">=</span> <span class="s">"requiredValidatorField"</span><span class="o">,</span> <span class="n">message</span> <span class="o">=</span> <span class="s">"requiredValidatorField and fieldExpressionValidatorField are not matching"</span><span class="o">)</span>
+<span class="nd">@ScriptAssert</span><span class="o">(</span><span class="n">lang</span> <span class="o">=</span> <span class="s">"javascript"</span><span class="o">,</span> <span class="n">script</span> <span class="o">=</span> <span class="s">"_this.dateValidatorField != null &amp;&amp; _this.dateValidatorField.before(new java.util.Date())"</span><span class="o">,</span> <span class="n">message</span> <span class="o">=</span> <span class="s">"Date need to before now"</span><span class= [...]
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">BeanValidationExampleAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+    <span class="nd">@NotNull</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">requiredValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotBlank</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">requiredStringValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span><span class="o">(</span><span class="n">message</span><span class="o">=</span><span class="s">"your.text.key.here"</span><span class="o">)</span>
+    <span class="nd">@Min</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span>
+    <span class="nd">@Max</span><span class="o">(</span><span class="mi">10</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">Integer</span> <span class="n">integerValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span>
+    <span class="kd">private</span> <span class="n">Date</span> <span class="n">dateValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span>
+    <span class="nd">@Size</span><span class="o">(</span><span class="n">min</span> <span class="o">=</span> <span class="mi">4</span><span class="o">,</span> <span class="n">max</span> <span class="o">=</span> <span class="mi">64</span><span class="o">)</span>
+    <span class="nd">@Email</span>
+
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">emailValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span>
+    <span class="nd">@Size</span><span class="o">(</span><span class="n">min</span> <span class="o">=</span> <span class="mi">4</span><span class="o">,</span> <span class="n">max</span> <span class="o">=</span> <span class="mi">64</span><span class="o">)</span>
+    <span class="nd">@URL</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">urlValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span>
+    <span class="nd">@Size</span><span class="o">(</span><span class="n">min</span> <span class="o">=</span> <span class="mi">2</span><span class="o">,</span> <span class="n">max</span> <span class="o">=</span> <span class="mi">4</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">stringLengthValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="nd">@Pattern</span><span class="o">(</span><span class="n">regexp</span> <span class="o">=</span> <span class="s">"[^&lt;&gt;]+"</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">regexValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">fieldExpressionValidatorField</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+
+
+ <span class="kd">public</span> <span class="n">Date</span> <span class="n">getDateValidatorField</span><span class="o">()</span> <span class="o">{</span>
+
+        <span class="k">return</span> <span class="n">dateValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setDateValidatorField</span><span class="o">(</span><span class="n">Date</span> <span class="n">dateValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">dateValidatorField</span> <span class="o">=</span> <span class="n">dateValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getEmailValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">emailValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setEmailValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">emailValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">emailValidatorField</span> <span class="o">=</span> <span class="n">emailValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">Integer</span> <span class="n">getIntegerValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">integerValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setIntegerValidatorField</span><span class="o">(</span><span class="n">Integer</span> <span class="n">integerValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">integerValidatorField</span> <span class="o">=</span> <span class="n">integerValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getRegexValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">regexValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setRegexValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">regexValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">regexValidatorField</span> <span class="o">=</span> <span class="n">regexValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getRequiredStringValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">requiredStringValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setRequiredStringValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">requiredStringValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">requiredStringValidatorField</span> <span class="o">=</span> <span class="n">requiredStringValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getRequiredValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">requiredValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setRequiredValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">requiredValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">requiredValidatorField</span> <span class="o">=</span> <span class="n">requiredValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getStringLengthValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">stringLengthValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setStringLengthValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">stringLengthValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">stringLengthValidatorField</span> <span class="o">=</span> <span class="n">stringLengthValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getFieldExpressionValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">fieldExpressionValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setFieldExpressionValidatorField</span><span class="o">(</span>
+            <span class="n">String</span> <span class="n">fieldExpressionValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">fieldExpressionValidatorField</span> <span class="o">=</span> <span class="n">fieldExpressionValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">getUrlValidatorField</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">urlValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setUrlValidatorField</span><span class="o">(</span><span class="n">String</span> <span class="n">urlValidatorField</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">urlValidatorField</span> <span class="o">=</span> <span class="n">urlValidatorField</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</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>
diff --git a/content/plugins/cdi/index.html b/content/plugins/cdi/index.html
new file mode 100644
index 0000000..1257c4e
--- /dev/null
+++ b/content/plugins/cdi/index.html
@@ -0,0 +1,597 @@
+<!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>CDI Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/cdi/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 class="no_toc" id="cdi-plugin">CDI Plugin</h1>
+
+<ul id="markdown-toc">
+  <li><a href="#overview" id="markdown-toc-overview">Overview</a></li>
+  <li><a href="#setup" id="markdown-toc-setup">Setup</a>    <ul>
+      <li><a href="#maven-setup" id="markdown-toc-maven-setup">Maven Setup</a></li>
+      <li><a href="#manual-integration" id="markdown-toc-manual-integration">Manual Integration</a></li>
+      <li><a href="#configuration" id="markdown-toc-configuration">Configuration</a></li>
+    </ul>
+  </li>
+  <li><a href="#usage" id="markdown-toc-usage">Usage</a>    <ul>
+      <li><a href="#example-usage" id="markdown-toc-example-usage">Example Usage</a></li>
+    </ul>
+  </li>
+</ul>
+
+<h2 id="overview">Overview</h2>
+
+<p>CDI - short for Contexts and Dependency Injection - is the new standard for Java EE (though not limited to it) dependency injection frameworks. It was introduced as <a href="http://jcp.org/en/jsr/summary?id=299">JSR 299</a>, being a part of the <a href="http://jcp.org/en/jsr/detail?id=316">Java EE 6</a> umbrella specification. It is also important to note that it builds on top of JSR 330 (Dependency Injection for Java SE), often referenced as <a href="http://jcp.org/en/jsr/summary?id= [...]
+
+<p>It can be used as standalone solution packed with your web applications to run in lightweight servlet containers such as Apache Tomcat or Jetty, utilizing standalone CDI implementations such as <a href="http://seamframework.org/Weld">JBoss Weld</a> (the JSR 299 reference implementation) or <a href="http://openwebbeans.apache.org/">Apache OpenWebBeans</a>. On the other hand, each JEE 6 compliant application server such as <a href="http://glassfish.java.net/">Glassfish</a>, <a href="htt [...]
+
+<p>With the Struts 2 CDI plugin, your application is open to be embedded into this modern, comprehensive and type safe framework and take full use of it.</p>
+
+<h2 id="setup">Setup</h2>
+
+<p>As with all Struts 2 plugins, usage of the CDI plugin is as easy as delivering the right jars with your web application. The plugin then registers itself as the standard ObjectFactory for your Struts 2 application.</p>
+
+<blockquote>
+  <p>Don’t mess up Object Factory Providers</p>
+</blockquote>
+
+<p>Struts 2 delivers integration into all relevant dependency injection containers via plugins, such as the <a href="../spring">Spring Plugin</a> or the externally provided <a href="http://code.google.com/p/google-guice/wiki/Struts2Integration">Guice Struts 2 Plugin</a>. Be aware that the central feature of all those, as well as the CDI plugin, is to register itself as Struts 2 Object factory. Usually you will want to use <strong>exactly one of those plugins</strong> in your application, [...]
+
+<h3 id="maven-setup">Maven Setup</h3>
+
+<p>The most easy and recommended way use is to simply add a maven dependency for it, along with a dependency to the CDI API for development time usage:</p>
+
+<p><strong>pom.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;dependencies&gt;</span>
+    ...
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>struts2-cdi-plugin<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>${struts2.version}<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>javax.enterprise<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>cdi-api<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.0-SP1<span class="nt">&lt;/version&gt;</span>
+        <span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    ...
+<span class="nt">&lt;/dependencies&gt;</span>
+
+</code></pre>
+</div>
+
+<p>whereas <code class="highlighter-rouge">${struts2.version}</code> should be set either as a property in your pom (recommended) or substituted by a concrete version information, such as 2.3.2 by the time of writing of this document. If you want to use CDI without an application server providing it, you may also want to add a dependency to a CDI implementation of your choice, for example Weld:</p>
+
+<p><strong>pom.xml with CDI implementation</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;dependencies&gt;</span>
+    ...
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>struts2-cdi-plugin<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>${struts2.version}<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>javax.enterprise<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>cdi-api<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.0-SP1<span class="nt">&lt;/version&gt;</span>
+        <span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.jboss.weld<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>weld-core<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.0.1-Final<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.jboss.weld<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>weld-se<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.0.1-Final<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    ...
+<span class="nt">&lt;/dependencies&gt;</span>
+
+</code></pre>
+</div>
+
+<h3 id="manual-integration">Manual Integration</h3>
+
+<p>Ensure that the struts2-cdi-plugin jar matching your used Struts 2 framework version - it is part of the <a href="/download.html">Struts 2 distribution</a> - is packed within the application archive that will be delivered. If a CDI implementation is provided within your container, no other dependencies are needed. If the latter is not the case, you may want to install a CDI container into your container (as commmon installation or packed with your app) according to the installation in [...]
+
+<p>For IDE integration, be sure to add both the struts2-cdi-plugin-VERSION.jar as well as the cdi-api.jar to your project setup. Remember, the API jar should not be delivered with your application archive since you will have the API provided by the CDI container your application will be running with.</p>
+
+<h3 id="configuration">Configuration</h3>
+
+<p>Not much to see here. The CDI specification requires the CDI container to be exposed via JNDI context, and the CDI plugin will pick it up just there. Nevertheless, since there are different JNDI namespaces in use, the plugin will try to automatically find the right one among known references, that is</p>
+
+<ul>
+  <li>
+    <p>java:comp/BeanManager as the CDI docs point out</p>
+  </li>
+  <li>
+    <p>java:app/BeanManager as the Weld docs point out</p>
+  </li>
+  <li>
+    <p>java:comp/env/BeanManager for containers limited to that namespace, such as tomcat</p>
+  </li>
+</ul>
+
+<p>If your container of choice uses other naming references, the plugin has a single configuration option to point to the right name. Just add a constant like this to your struts.xml to be on the happy path again:</p>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.objectFactory.cdi.jndiKey"</span> <span class="na">value=</span><span class="s">"java:comp/some/weird/BeanManagerReference"</span> <span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="usage">Usage</h2>
+
+<p>CDI has an extremely rich feature set, and this section is not intended as a replacement for the CDI reference documentation or the excellent documentation found on the <a href="http://seamframework.org/Weld">JBoss Weld</a> homepage. The whole Struts 2 CDI integration works just as you would think it works, using JSR-299 and JSR-330 Annotations in your Struts 2 actions or interceptors. Be aware of the following, though:</p>
+
+<blockquote>
+  <p>Remember to provide beans.xml</p>
+</blockquote>
+
+<p>CDI is designed to act in a type safe and modern way, thus using annotations for all aspects of the framework. Nevertheless, you are allowed to eternalize configuration into a XML file called beans.xml to be placed in your WEB-INF directory. Even if you don’t intend to use such external configuration, it is an <strong>inevitable requirement to provide at least an empty beans.xml in WEB-INF !</strong></p>
+
+<h3 id="example-usage">Example Usage</h3>
+
+<p>Implement your Struts 2 actions or interceptors just as usual, enriched with CDI and @Inject annotations:</p>
+
+<p><strong>NumberGuess.java</strong></p>
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">cdi</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">javax.inject.Inject</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">NumberGuess</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+
+    <span class="nd">@Inject</span>
+    <span class="n">Game</span> <span class="n">game</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="n">Game</span> <span class="n">getGame</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">game</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Override</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</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">String</span> <span class="n">guess</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="kd">final</span> <span class="n">String</span> <span class="n">errorMessage</span> <span class="o">=</span> <span class="n">game</span><span class="o">.</span><span class="na">check</span><span class="o">();</span>
+        <span class="n">addActionError</span><span class="o">(</span><span class="n">errorMessage</span><span class="o">);</span>
+
+        <span class="k">if</span> <span class="o">(</span><span class="n">Game</span><span class="o">.</span><span class="na">CORRECT</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">errorMessage</span><span class="o">))</span> <span class="o">{</span>
+            <span class="n">game</span><span class="o">.</span><span class="na">reset</span><span class="o">();</span>
+        <span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">game</span><span class="o">.</span><span class="na">getRemainingGuesses</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">addActionError</span><span class="o">(</span><span class="s">"The correct guess was "</span> <span class="o">+</span> <span class="n">game</span><span class="o">.</span><span class="na">getGuess</span><span class="o">()</span> <span class="o">+</span> <span class="s">". Game is reset."</span><span class="o">);</span>
+            <span class="n">game</span><span class="o">.</span><span class="na">reset</span><span class="o">();</span>
+        <span class="o">}</span>
+
+
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
+
+
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>See the @Inject annotation from javax.inject.Inject? While you could use all the other nice stuff, we usually would - following the separation of concerns principle - use @Inject most of the time only in our actions, keeping the more fancy stuff in the business layer as shown below. Using @Inject brings us to the most common pitfall when using Struts 2 together with JSR-330 / CDI:</p>
+
+<blockquote>
+  <p>Use the right @Inject</p>
+</blockquote>
+
+<p>Struts 2 and it’s core component XWork use it’s own internal dependency injection container. Interestingly, you could name it JSR-330’s grandma, since it is an early pre-release version of <a href="http://code.google.com/p/google-guice/">Google Guice</a> once developed by <a href="http://blog.crazybob.org/">Crazybob Lee</a> - the same Bob Lee that, together with SpringSource’s Rod Johnson, lead the JSR-330 specification.</p>
+
+<p>That said, you will find the @Inject annotation both as com.opensymphony.xwork2.inject.Inject and javax.inject.Inject. <strong>Don’t mix up those two - javax.inject.Inject is the one you want to use with your Struts 2 CDI plugin and CDI integration in general!</strong> While you could use Struts’ internal annotation as well, the effect may be strange to undefined - so check your imports!</p>
+
+<p>Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour. Add a JSP view similar to this:</p>
+
+<pre><code class="language-jsp">
+&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;
+&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;title&gt;Numberguess&lt;/title&gt;
+&lt;/head&gt;
+
+&lt;body&gt;
+&lt;h2&gt;Numberguess Game - Struts 2 CDI Example&lt;/h2&gt;
+
+&lt;h3&gt;I've picked a number between &lt;s:property value="game.smallest"/&gt; and &lt;s:property value="game.biggest"/&gt;.
+    You have &lt;s:property value="game.remainingGuesses"/&gt;remaining guesses.&lt;/h3&gt;
+
+&lt;s:form action="guess"&gt;
+    &lt;s:textfield name="game.guess" label="Your Guess"/&gt;
+    &lt;s:submit/&gt;
+&lt;/s:form&gt;
+&lt;p/&gt;
+&lt;s:actionerror/&gt;
+
+&lt;/body&gt;
+&lt;/html&gt;
+
+</code></pre>
+
+<p>along - if not using the fabulous and recommended Struts 2 <a href="../convention">Convention Plugin</a> - with a struts.xml like this</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+<span class="cp">&lt;!DOCTYPE struts PUBLIC
+          "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"       
+          "http://struts.apache.org/dtds/struts-2.3.dtd"&gt;</span>
+<span class="nt">&lt;struts&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.enable.DynamicMethodInvocation"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.devMode"</span> <span class="na">value=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
+  
+    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"numberguess"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
+
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"NumberGuess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"guess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span> <span class="na">method=</span><span class="s">"guess"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+
+    <span class="nt">&lt;/package&gt;</span>
+
+<span class="nt">&lt;/struts&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Now you can add the business logic we want to be managed and injected by CDI. Start with two qualifier annotations:</p>
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">cdi</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">javax.inject.Qualifier</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Documented</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">ElementType</span><span class="o">.*;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Retention</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Target</span><span class="o">;</span>
+
+<span class="nd">@Target</span><span class="o">(</span> <span class="o">{</span> <span class="n">TYPE</span><span class="o">,</span> <span class="n">METHOD</span><span class="o">,</span> <span class="n">PARAMETER</span><span class="o">,</span> <span class="n">FIELD</span> <span class="o">})</span>
+<span class="nd">@Retention</span><span class="o">(</span><span class="n">RUNTIME</span><span class="o">)</span>
+<span class="nd">@Documented</span>
+<span class="nd">@Qualifier</span>
+<span class="kd">public</span> <span class="nd">@interface</span> <span class="n">Random</span> <span class="o">{}</span>
+
+</code></pre>
+</div>
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">cdi</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">javax.inject.Qualifier</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Documented</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">ElementType</span><span class="o">.*;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Retention</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">static</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">annotation</span><span class="o">.</span><span class="na">RetentionPolicy</span><span class="o">.</span><span class="na">RUNTIME</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.lang.annotation.Target</span><span class="o">;</span>
+
+<span class="nd">@Target</span><span class="o">(</span> <span class="o">{</span> <span class="n">TYPE</span><span class="o">,</span> <span class="n">METHOD</span><span class="o">,</span> <span class="n">PARAMETER</span><span class="o">,</span> <span class="n">FIELD</span> <span class="o">})</span>
+<span class="nd">@Retention</span><span class="o">(</span><span class="n">RUNTIME</span><span class="o">)</span>
+<span class="nd">@Documented</span>
+<span class="nd">@Qualifier</span>
+<span class="kd">public</span> <span class="nd">@interface</span> <span class="n">MaxNumber</span> <span class="o">{}</span>
+
+</code></pre>
+</div>
+
+<p>Now on to the actual business beans, the Game and the Generator bean:</p>
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">cdi</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">javax.annotation.PostConstruct</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.enterprise.context.SessionScoped</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.enterprise.inject.Instance</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.inject.Inject</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.inject.Named</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.io.Serializable</span><span class="o">;</span>
+
+<span class="nd">@Named</span>
+<span class="nd">@SessionScoped</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Game</span> <span class="kd">implements</span> <span class="n">Serializable</span> <span class="o">{</span>
+
+    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">CORRECT</span> <span class="o">=</span> <span class="s">"Correct !!!"</span><span class="o">;</span>
+    <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">WRONG</span> <span class="o">=</span> <span class="s">"Sorry, wrong number !!!"</span><span class="o">;</span>
+
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">number</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">guess</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">smallest</span><span class="o">;</span>
+
+    <span class="nd">@MaxNumber</span>
+    <span class="nd">@Inject</span>
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">maxNumber</span><span class="o">;</span>
+
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">biggest</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="kt">int</span> <span class="n">remainingGuesses</span><span class="o">;</span>
+
+    <span class="nd">@Random</span>
+    <span class="nd">@Inject</span>
+    <span class="n">Instance</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span> <span class="n">randomNumber</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="n">Game</span><span class="o">()</span> <span class="o">{</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">int</span> <span class="n">getNumber</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">number</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">int</span> <span class="n">getGuess</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">guess</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setGuess</span><span class="o">(</span> <span class="kt">int</span> <span class="n">guess</span> <span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">guess</span> <span class="o">=</span> <span class="n">guess</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">int</span> <span class="n">getSmallest</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">smallest</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">int</span> <span class="n">getBiggest</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">biggest</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">int</span> <span class="n">getRemainingGuesses</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">remainingGuesses</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">check</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">InterruptedException</span> <span class="o">{</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">&gt;</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">biggest</span> <span class="o">=</span> <span class="n">guess</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span>
+        <span class="o">}</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">&lt;</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">smallest</span> <span class="o">=</span> <span class="n">guess</span> <span class="o">+</span> <span class="mi">1</span><span class="o">;</span>
+        <span class="o">}</span>
+        <span class="k">if</span> <span class="o">(</span><span class="n">guess</span> <span class="o">==</span> <span class="n">number</span><span class="o">)</span> <span class="o">{</span>
+            <span class="k">return</span> <span class="n">CORRECT</span><span class="o">;</span>
+        <span class="o">}</span>
+        <span class="n">remainingGuesses</span><span class="o">--;</span>
+        <span class="k">return</span> <span class="n">WRONG</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@PostConstruct</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">reset</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">smallest</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">guess</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">remainingGuesses</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">biggest</span> <span class="o">=</span> <span class="n">maxNumber</span><span class="o">;</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">number</span> <span class="o">=</span> <span class="n">randomNumber</span><span class="o">.</span><span class="na">get</span><span class="o">();</span>
+    <span class="o">}</span>
+
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">example</span><span class="o">.</span><span class="na">cdi</span><span class="o">;</span>
+
+<span class="kn">import</span> <span class="nn">javax.enterprise.context.ApplicationScoped</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">javax.enterprise.inject.Produces</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.io.Serializable</span><span class="o">;</span>
+
+<span class="nd">@ApplicationScoped</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Generator</span> <span class="kd">implements</span> <span class="n">Serializable</span> <span class="o">{</span>
+   
+   <span class="kd">private</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span> <span class="n">random</span> <span class="o">=</span> <span class="k">new</span> <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span><span class="o">(</span> <span class="n">System</span><span class="o">.</span><span class="na">currentTimeMi [...]
+   
+   <span class="kd">private</span> <span class="kt">int</span> <span class="n">maxNumber</span> <span class="o">=</span> <span class="mi">100</span><span class="o">;</span>
+   
+   <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Random</span> <span class="n">getRandom</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">random</span><span class="o">;</span>
+   <span class="o">}</span>
+   
+   <span class="nd">@Produces</span> <span class="nd">@Random</span> <span class="kt">int</span> <span class="n">next</span><span class="o">()</span> <span class="o">{</span> 
+      <span class="k">return</span> <span class="n">getRandom</span><span class="o">().</span><span class="na">nextInt</span><span class="o">(</span><span class="n">maxNumber</span><span class="o">);</span> 
+   <span class="o">}</span>
+   
+   <span class="nd">@Produces</span> <span class="nd">@MaxNumber</span> <span class="kt">int</span> <span class="n">getMaxNumber</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">maxNumber</span><span class="o">;</span>
+   <span class="o">}</span>
+
+<span class="o">}</span> 
+
+</code></pre>
+</div>
+
+<p>If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural language oriented way the CDI stack works. If neither of this is the case, now it’s time to check the CDI and Weld documentation. Remember, this is a trivial example - there is much more to know about CDI.</p>
+
+<p>Ready you are now - use the Force!</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>
diff --git a/content/plugins/codebehind/index.html b/content/plugins/codebehind/index.html
new file mode 100644
index 0000000..40783a1
--- /dev/null
+++ b/content/plugins/codebehind/index.html
@@ -0,0 +1,301 @@
+<!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>Codebehind Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/codebehind/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="codebehind-plugin">Codebehind Plugin</h1>
+
+<blockquote>
+  <p>Deprecated Plugin</p>
+</blockquote>
+
+<p>Since 2.1 this plugin has been deprecated in favor of the <a href="../convention">Convention Plugin</a>. See <a href="../convention/converting.html">this page</a> for details on how to port your application to the Convention plugin.</p>
+
+<p>The Codebehind Plugin reduces mundane configuration by adding “Page Controller” conventions.</p>
+
+<p>There are two common situations where the plugin applies convention over configuration:</p>
+
+<ol>
+  <li>
+    <p><strong>Default mappings</strong> - (or “pages with no mappings”) These are cases where the page is mostly static and doesn’t require an Action class to execute logic.  Common examples are index pages and those that heavily use JSP tags or JSF components.</p>
+  </li>
+  <li>
+    <p><strong>Default results</strong> - The purpose of most Actions is to execute code to prepare the data for a specific page. The name of this page is often the same as the Action itself.</p>
+  </li>
+</ol>
+
+<p>To improve the first case, the plugin will detect the presence of a page with no corresponding Struts mapping and automatically substitute a mapping that uses the default Action class for the package, which is usually ActionSupport, a NO-OP Action.</p>
+
+<p>For the problem of default results, the plugin will make it unnecessary to define those results by detecting the presence of a page for that Action and creating the appropriate configuration on-the-fly.</p>
+
+<p>In these two ways, the plugin encourages a page-based development style, handling the linking of Struts actions with pages and pages with Results in a common way.</p>
+
+<blockquote>
+  <p>To see the plugin in action, review the “Person Manager” example in the Showcase application.</p>
+</blockquote>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Provides default mappings for pages that don’t have Actions</p>
+  </li>
+  <li>
+    <p>Provides default results by auto-discovering pages</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use this plugin, simply copy its jar into your application.  The plugin can be used to find default mappings and results.</p>
+
+<h3 id="default-mappings">Default Mappings</h3>
+
+<p>To better facilitate a code-behind development approach, the plugin will detect the case where the request has no defined Struts action mapping, yet there exists a corresponding page.  It will then create a dummy action mapping referencing the default Action class (usually ActionSupport), allowing the page to be displayed normally.  Additionally, the default interceptor stack for the configured package will be applied, bringing the workflow benefits of interceptor stacks to simple pages.</p>
+
+<p>When no explicitly configured Action can be found for a request, the plugin searches the web application for a likely page. Specifically, the following pattern is used to locate a page:<code class="highlighter-rouge">/NAMESPACE/ACTION.(jsp|vm|ftl)</code>For example, if the request is for <code class="highlighter-rouge">http://www.company.com/myapp/member/login.action</code>, the plugin will look for the following pages, in this order:</p>
+
+<ol>
+  <li><code class="highlighter-rouge">/member/login.jsp</code></li>
+  <li><code class="highlighter-rouge">/member/login.vm</code></li>
+  <li><code class="highlighter-rouge">/member/login.ftl</code></li>
+</ol>
+
+<p>If any of those pages are found, the plugin will construct an ActionConfig object on the fly, using the ActionSupport class for the Action and a single Result that points to the discovered page.  The ActionConfig will be put in the configured package, meaning that it will inherit the default Interceptor stack for that package.  The default package is <code class="highlighter-rouge">codebehind-default</code>, however, it can be configured in any <em>configuration file</em>  via the <co [...]
+
+<h3 id="default-results">Default Results</h3>
+
+<p>In many applications, a majority of Results could have the same root name as the action mapping.  To reduce this unnecessary configuration, the Struts plugin will try to guess the appropriate Result, if none is explicitly configured.  This technique works for any result code, including <code class="highlighter-rouge">success</code>. When combined with the <em>Zero Configuration</em>  style, the amount of configuration in an application dwindles to next to nothing.</p>
+
+<p>When no explicitly configured Result is found for an Action’s result code, the plugin, again, searches the web application for a matching page. Specifically, the following patterns, in the following order, are used to locate a page:</p>
+
+<ol>
+  <li><code class="highlighter-rouge">/NAMESPACE/ACTION-RESULT_CODE.(jsp|vm|ftl)</code></li>
+  <li><code class="highlighter-rouge">/NAMESPACE/ACTION.(jsp|vm|ftl)</code></li>
+</ol>
+
+<p>These two patterns are searched for each of the three default page extensions: jsp, vm, and ftl.  For example, if the request is for <code class="highlighter-rouge">http://www.company.com/myapp/member/login.action</code>, so that the action name is <code class="highlighter-rouge">login</code> and the namespace is <code class="highlighter-rouge">member</code>, and the Action class returned a code of <code class="highlighter-rouge">success</code>, the plugin will look for the following  [...]
+
+<ol>
+  <li><code class="highlighter-rouge">/member/login-success.jsp</code></li>
+  <li><code class="highlighter-rouge">/member/login.jsp</code></li>
+  <li><code class="highlighter-rouge">/member/login-success.vm</code></li>
+  <li><code class="highlighter-rouge">/member/login.vm</code></li>
+  <li><code class="highlighter-rouge">/member/login-success.ftl</code></li>
+  <li><code class="highlighter-rouge">/member/login.ftl</code></li>
+</ol>
+
+<p>If any of those pages are found, the appropriate Result will be constructed and processed.</p>
+
+<h3 id="settings">Settings</h3>
+
+<p>The following settings can be customized.  See the <a href="/core-developers/configuration-files.html">developer guide</a>.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.codebehind.defaultPackage</td>
+      <td>The default package to use for created Action mappings</td>
+      <td>codebehind-default</td>
+      <td>Any existing package name</td>
+    </tr>
+    <tr>
+      <td>struts.configuration.classpath.disableActionScanning</td>
+      <td>Whether to disable scanning the classpath for Action classes or not</td>
+      <td>false</td>
+      <td>true or false</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/config-browser/index.html b/content/plugins/config-browser/index.html
new file mode 100644
index 0000000..ece9578
--- /dev/null
+++ b/content/plugins/config-browser/index.html
@@ -0,0 +1,221 @@
+<!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>Config Browser Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/config-browser/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="config-browser-plugin">Config Browser Plugin</h1>
+
+<p>The Config Browser Plugin is a simple tool to help view an application’s configuration at runtime.</p>
+
+<p>This plugin should be used only during development phase and access to it should be strictly restricted!</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Browsable view of loaded configuration</p>
+  </li>
+  <li>
+    <p>Shows all accessible action URLs</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use the plugin, simply copy the jar into your application.  Once installed, you can access the tool by opening to the action named <em>index</em>  in the <em>config-browser</em>  namespace.</p>
+
+<blockquote>
+  <p>In most cases (if you are using the default <em>ActionMapper</em> ), the URL is something like http://localhost:8080/starter/config-browser/index.action or http://localhost:8080/starter/config-browser/index.</p>
+</blockquote>
+
+<h3 id="example">Example</h3>
+
+<p><img src="../attachments/att30966155_config-browser-example.png" alt="config-browser-example.png" /></p>
+
+<h3 id="settings">Settings</h3>
+
+<p>This plugin provides no customizable settings.</p>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/dwr/index.html b/content/plugins/dwr/index.html
new file mode 100644
index 0000000..53f1f1b
--- /dev/null
+++ b/content/plugins/dwr/index.html
@@ -0,0 +1,221 @@
+<!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>DWR Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/dwr/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="dwr-plugin">DWR Plugin</h1>
+
+<p>The DWR plugin provides integration with the Ajax framework <a href="http://getahead.org/dwr">Direct Web Remoting</a></p>
+
+<p>This plugin works by allowing DWR to execute a Struts 2 action and return any validation errors.</p>
+
+<p>This plugin is only available with Struts 2.1.1 or later.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>Expose Struts 2 validations via DWR</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To expose Struts 2 validations via DWR, add this to your DWR configuration:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+ <span class="ni">&amp;lt;</span>dwr<span class="ni">&amp;gt;</span>
+    <span class="ni">&amp;lt;</span>allow<span class="ni">&amp;gt;</span>
+      <span class="ni">&amp;lt;</span>create creator="new" javascript="validator" class="org.apache.struts2.validators.DWRValidator"/<span class="ni">&amp;gt;</span>
+      <span class="ni">&amp;lt;</span>convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/<span class="ni">&amp;gt;</span>
+    <span class="ni">&amp;lt;</span>/allow<span class="ni">&amp;gt;</span>
+ <span class="ni">&amp;lt;</span>/dwr<span class="ni">&amp;gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="settings">Settings</h2>
+
+<p>This plugin doesn’t support any global settings.</p>
+
+<h2 id="installation">Installation</h2>
+
+<p>To install, simply include the DWR Plugin in your <code class="highlighter-rouge">WEB-INF/lib</code> directory.  Ensure that DWR has been correctly installed and configured.</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>
diff --git a/content/plugins/embedded-jsp/index.html b/content/plugins/embedded-jsp/index.html
new file mode 100644
index 0000000..d44117f
--- /dev/null
+++ b/content/plugins/embedded-jsp/index.html
@@ -0,0 +1,255 @@
+<!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>Embedded JSP Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/embedded-jsp/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="embedded-jsp-plugin">Embedded JSP Plugin</h1>
+
+<p>The Embedded JSP plugin allows you to use JSPs from the classpath (from jar files).</p>
+
+<h2 id="introduction">Introduction</h2>
+
+<p>JSPs are usually served from the file system. Using this plugin you can deploy JSPs inside jar files, which is sometimes desired, like when writing a plugin.</p>
+
+<h3 id="waitwhat">Wait…what?</h3>
+
+<p>The plugin containes a modified version of Jasper 6, which reads JSPs from the classpath, and generates the java code in memory (no .java file is written). The Java Compiler API is then used to compile the java source code into bytecode (in memory, no .class file is generated), and it is turned into a Servlet, which is cached for future use.</p>
+
+<h3 id="about-includes">About includes</h3>
+
+<p>Because the JSP files are read from the classpath, “includes” work differently than they do from the file system. Assume you want to include “Hello.jsp”, when searching for that file in the classpath, multiple files might be found on different jars, like <code class="highlighter-rouge">somejar.jar!/Hello.jsp</code> and <code class="highlighter-rouge">otherjar.jar!/Hello.jsp</code>. That’s why relative paths do not work in this plugin. Instead, create directory structures for the JSPs. [...]
+
+<p>Who.jsp:</p>
+
+<pre><code class="language-jsp">Hello there, I am the Doctor.
+</code></pre>
+
+<p>Hello.jsp:</p>
+
+<pre><code class="language-jsp">&lt;jsp:include page="org/myexample/jsps/Who.jsp" /&gt;
+</code></pre>
+
+<p>Mapping:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"example"</span> <span class="na">namespace=</span><span class="s">"/example"</span> <span class="na">extends=</span><span class="s">"embeddedjsp-default"</span><span class="nt">&gt;</span>
+     <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"HelloWorld"</span> <span class="na">class=</span><span class="s">"example.HelloWorld"</span><span class="nt">&gt;</span>
+         <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"embeddedJsp"</span><span class="nt">&gt;</span>org/myexample/jsps/Hello.jsp<span class="nt">&lt;/result&gt;</span>
+     <span class="nt">&lt;/action&gt;</span>
+ <span class="nt">&lt;/package&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="requirements">Requirements</h2>
+
+<ol>
+  <li>Java 6 or later</li>
+</ol>
+
+<h3 id="tomcat">Tomcat</h3>
+
+<p>Tested with Tomcat 6.0.20.</p>
+
+<h3 id="jetty">Jetty</h3>
+
+<p>This plugin requires Jetty 7 to work. And the Tomcat libraries must be deployed with the application, adding this to your <code class="highlighter-rouge">pom.xml</code> should take care of that:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
+     <span class="nt">&lt;groupId&gt;</span>org.apache.tomcat<span class="nt">&lt;/groupId&gt;</span>
+     <span class="nt">&lt;artifactId&gt;</span>jasper<span class="nt">&lt;/artifactId&gt;</span>
+     <span class="nt">&lt;version&gt;</span>6.0.18<span class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+</code></pre>
+</div>
+
+<p>To use Jetty 7 with the maven plugin add this to your <code class="highlighter-rouge">pom.xml</code>:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;build&gt;</span>
+    <span class="nt">&lt;plugins&gt;</span>
+        <span class="nt">&lt;plugin&gt;</span>
+             <span class="nt">&lt;groupId&gt;</span>org.mortbay.jetty<span class="nt">&lt;/groupId&gt;</span>
+             <span class="nt">&lt;artifactId&gt;</span>jetty-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;/plugin&gt;</span>
+    <span class="nt">&lt;/plugins&gt;</span>
+<span class="nt">&lt;/build&gt;</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>
diff --git a/content/plugins/jasperreports/index.html b/content/plugins/jasperreports/index.html
new file mode 100644
index 0000000..8d35ca5
--- /dev/null
+++ b/content/plugins/jasperreports/index.html
@@ -0,0 +1,283 @@
+<!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>JasperReports Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/jasperreports/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="jasperreports-plugin">JasperReports Plugin</h1>
+
+<p><a href="http://jasperforge.org/sf/projects/jasperreports">JasperReports</a> is a powerful open source Java (LGPL) reporting tool that has the ability to deliver rich content onto the screen, to the printer or into PDF, HTML, XLS, CSV and XML files.</p>
+
+<p>The JasperReports plugin enables Actions to create high-quality reports as results.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>Allows Actions to be rendered through JasperReports</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use this plugin, have your packages that contain the target actions extend the provided <code class="highlighter-rouge">jasperreports-default</code> package, which contains the <code class="highlighter-rouge">jasper</code> result type.  Then, simply use the result type in the desired actions.  The result takes the following parameters:</p>
+
+<p>
+ Generates a JasperReports report using the specified format or PDF if no
+ format is specified.
+ </p>
+
+<ul>
+
+ <li><b>location (default)</b> - the location where the compiled jasper report
+ definition is (foo.jasper), relative from current URL.</li>
+ <li><b>dataSource (required)</b> - the EL expression used to retrieve the
+ datasource from the value stack (usually a List).</li>
+ <li><b>parse</b> - true by default. If set to false, the location param will
+ not be parsed for EL expressions.</li>
+ <li><b>format</b> - the format in which the report should be generated. Valid
+ values can be found in {@link JasperReportConstants}. If no format is
+ specified, PDF will be used.</li>
+ <li><b>contentDisposition</b> - disposition (defaults to "inline", values are
+ typically <i>filename="document.pdf"</i>).</li>
+ <li><b>documentName</b> - name of the document (will generate the http header
+ <code>Content-disposition = X; filename=X.[format]</code>).</li>
+ <li><b>delimiter</b> - the delimiter used when generating CSV reports. By
+ default, the character used is ",".</li>
+ <li><b>imageServletUrl</b> - name of the url that, when prefixed with the
+ context page, can return report images.</li>
+ <li>
+ <b>reportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
+ report parameters from the value stack. The parameters may be accessed
+ in the report via the usual JR mechanism and might include data not
+ part of the dataSource, such as the user name of the report creator, etc.
+ </li>
+ <li>
+ <b>exportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
+ JR exporter parameters from the value stack. The export parameters are
+ used to customize the JR export. For example, a PDF export might enable
+ encryption and set the user password to a string known to the report creator.
+ </li>
+ <li>
+ <b>connection</b> - (2.1.7+) JDBC Connection which can be passed to the
+ report instead of dataSource
+ </li>
+ <li><b>wrapField</b> - (2.3.18+) defines if fields should warp with ValueStackDataSource
+ see https://issues.apache.org/jira/browse/WW-3698 for more details
+ </li>
+ </ul>
+<p>
+ This result follows the same rules from {@link StrutsResultSupport}.
+ Specifically, all parameters will be parsed if the "parse" parameter
+ is not set to false.
+ </p>
+
+<h3 id="examples">Examples</h3>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> <span class="ni">&amp;lt;</span>result name="success" type="jasper"<span class="ni">&amp;gt;</span>
+   <span class="ni">&amp;lt;</span>param name="location"<span class="ni">&amp;gt;</span>foo.jasper<span class="ni">&amp;lt;</span>/param<span class="ni">&amp;gt;</span>
+   <span class="ni">&amp;lt;</span>param name="dataSource"<span class="ni">&amp;gt;</span>mySource<span class="ni">&amp;lt;</span>/param<span class="ni">&amp;gt;</span>
+   <span class="ni">&amp;lt;</span>param name="format"<span class="ni">&amp;gt;</span>CSV<span class="ni">&amp;lt;</span>/param<span class="ni">&amp;gt;</span>
+ <span class="ni">&amp;lt;</span>/result<span class="ni">&amp;gt;</span>
+</code></pre>
+</div>
+
+<p>or for pdf:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> <span class="ni">&amp;lt;</span>result name="success" type="jasper"<span class="ni">&amp;gt;</span>
+   <span class="ni">&amp;lt;</span>param name="location"<span class="ni">&amp;gt;</span>foo.jasper<span class="ni">&amp;lt;</span>/param<span class="ni">&amp;gt;</span>
+   <span class="ni">&amp;lt;</span>param name="dataSource"<span class="ni">&amp;gt;</span>mySource<span class="ni">&amp;lt;</span>/param<span class="ni">&amp;gt;</span>
+ <span class="ni">&amp;lt;</span>/result<span class="ni">&amp;gt;</span>
+</code></pre>
+</div>
+
+<h3 id="settings">Settings</h3>
+
+<p>This plugin doesn’t provide any global settings.</p>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+<hr />
+
+<blockquote>
+  <p>See also <a href="http://www.vitarara.org/cms/node/131http://www.vitarara.org/cms/node/131">Compiling JasperReports JRXML Files with Maven</a> (Mark Menard)</p>
+</blockquote>
+
+  </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>
diff --git a/content/plugins/java-8-support/index.html b/content/plugins/java-8-support/index.html
new file mode 100644
index 0000000..53e319c
--- /dev/null
+++ b/content/plugins/java-8-support/index.html
@@ -0,0 +1,219 @@
+<!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>Java 8 Support Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/java-8-support/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="java-8-support-plugin">Java 8 Support Plugin</h1>
+
+<p>This plugin was dropped in Struts 2.5.5 as Struts Core is using ASM5 now which supports Java8.</p>
+
+<p>Adds support for Java 8 - to allow use the latest features of the language with Struts actions.</p>
+
+<h2 id="usage">Usage</h2>
+
+<p>You must define it as a dependency in <code class="highlighter-rouge">pom.xml</code> and exclude the old version of ASM used with <code class="highlighter-rouge">xwork-core</code>, see a code snippet below:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
+    <span class="nt">&lt;groupId&gt;</span>org.apache.struts.xwork<span class="nt">&lt;/groupId&gt;</span>
+    <span class="nt">&lt;artifactId&gt;</span>xwork-core<span class="nt">&lt;/artifactId&gt;</span>
+    <span class="nt">&lt;exclusions&gt;</span>
+        <span class="nt">&lt;exclusion&gt;</span>
+            <span class="nt">&lt;groupId&gt;</span>asm<span class="nt">&lt;/groupId&gt;</span>
+            <span class="nt">&lt;artifactId&gt;</span>asm<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;/exclusion&gt;</span>
+        <span class="nt">&lt;exclusion&gt;</span>
+            <span class="nt">&lt;groupId&gt;</span>asm<span class="nt">&lt;/groupId&gt;</span>
+            <span class="nt">&lt;artifactId&gt;</span>asm-commons<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;/exclusion&gt;</span>
+    <span class="nt">&lt;/exclusions&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+</code></pre>
+</div>
+
+<p>If you don’t use Maven to manage the dependencies, please be sure to replace <code class="highlighter-rouge">asm.jar</code> and <code class="highlighter-rouge">asm-commons.jar</code> with appropriated ASM 5 versions.</p>
+
+<h2 id="supported-java-8-features">Supported Java 8 features</h2>
+
+<ul>
+  <li>Lambda Expressions in actions when using them with the Convention plugin</li>
+</ul>
+
+  </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>
diff --git a/content/plugins/javatemplates/index.html b/content/plugins/javatemplates/index.html
new file mode 100644
index 0000000..c5530cd
--- /dev/null
+++ b/content/plugins/javatemplates/index.html
@@ -0,0 +1,232 @@
+<!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>Javatemplates Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/javatemplates/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="javatemplates-plugin">Javatemplates Plugin</h1>
+
+<p>This plugin provides a faster Java implementation of tags in the “simple” theme.</p>
+
+<h2 id="installation">Installation</h2>
+
+<ol>
+  <li>This plugin can be installed by copying the plugin jar into your application’s /WEB-INF/lib directory. No other files need to be copied or created.</li>
+  <li>Set these properties in struts.xml:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.ui.templateSuffix"</span> <span class="na">value=</span><span class="s">"java"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.ui.theme"</span> <span class="na">value=</span><span class="s">"simple"</span> <span class="nt">/&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+</code></pre>
+</div>
+
+<p>The plugin is a drop in replacement for the supported tags in the simple theme, so no other configuration is required.</p>
+
+<h2 id="supported-tags">Supported tags</h2>
+
+<ul>
+  <li><em>a</em></li>
+  <li><em>actionerror</em></li>
+  <li><em>actionmessage</em></li>
+  <li><em>checkbox</em></li>
+  <li><em>datetextfield</em></li>
+  <li><em>div</em></li>
+  <li><em>fielderror</em></li>
+  <li><em>file</em></li>
+  <li><em>form</em></li>
+  <li><em>head</em></li>
+  <li><em>hidden</em></li>
+  <li><em>label</em></li>
+  <li><em>password</em></li>
+  <li><em>select</em></li>
+  <li><em>reset</em></li>
+  <li><em>submit</em></li>
+  <li><em>textfield</em></li>
+  <li><em>textarea</em></li>
+  <li><em>token</em></li>
+</ul>
+
+<h2 id="performance-benchmark">Performance benchmark</h2>
+
+<p>TODO</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>
diff --git a/content/plugins/jfreechart/index.html b/content/plugins/jfreechart/index.html
new file mode 100644
index 0000000..476843a
--- /dev/null
+++ b/content/plugins/jfreechart/index.html
@@ -0,0 +1,281 @@
+<!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>JFreeChart Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/jfreechart/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="jfreechart-plugin">JFreeChart Plugin</h1>
+
+<p><a href="http://www.jfree.org/jfreechart/">JFreeChart</a> is a free 100% Java (LGPL) chart library that makes it easy for developers to display professional quality charts in their applications.</p>
+
+<p>The JFreeChart plugin allows Actions to easily return generated charts and graphs.</p>
+
+<p>Instead of streaming a generated chart directly to the HTTP response, this plugin provides a ChartResult, which handles the generation for you.  This allows you to generate the chart in one class, and render it out in another class, effectively decoupling the view from the Actions. You can easily render it out to a file or some view other than a web HTTP response if you wish.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Handles rendering charts to the HTTP response</p>
+  </li>
+  <li>
+    <p>Can be used in other non-web contexts</p>
+  </li>
+</ul>
+
+<h3 id="future-work">Future Work</h3>
+
+<p>Currently the “chart” property is hardcoded. There should be a better way of transferring data from the Action to the Result, via some externally defined variable or something.</p>
+
+<p>As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used as the data, and the configuration of the chart details (font, axis, etc…) be done via the result properties in the xwork.xml.</p>
+
+<p>But hey, the above works for now. Any suggestions are welcome.</p>
+
+<p>You can also create charts via the CeWolf library directly.  See <a href="cewolf-charts-using-velocity-templates.html">CeWolf charts using Velocity templates</a>.</p>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use the plugin, have your Struts configuration package extend the <code class="highlighter-rouge">jfreechart-default</code> package, which provides the <code class="highlighter-rouge">chart</code> result type.  Next, use it as a result in an action:</p>
+
+<p><strong>Chart example in struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"viewModerationChart"</span> <span class="na">class=</span><span class="s">"myapp.actions.ViewModerationChartAction"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"chart"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"width"</span><span class="nt">&gt;</span>400<span class="nt">&lt;/param&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"height"</span><span class="nt">&gt;</span>300<span class="nt">&lt;/param&gt;</span> 
+  <span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+</code></pre>
+</div>
+
+<p>In your Action class, provide a <code class="highlighter-rouge">getChart()</code> method that returns the chart to be rendered.  This method will be called by the chart result.</p>
+
+<h3 id="example">Example</h3>
+
+<p><strong>Struts Action that provides a chart</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ViewModerationChartAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+
+	<span class="kd">private</span> <span class="n">JFreeChart</span> <span class="n">chart</span><span class="o">;</span>
+
+	<span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+		<span class="c1">// chart creation logic...</span>
+		<span class="n">XYSeries</span> <span class="n">dataSeries</span> <span class="o">=</span> <span class="k">new</span> <span class="n">XYSeries</span><span class="o">(</span><span class="k">new</span> <span class="n">Integer</span><span class="o">(</span><span class="mi">1</span><span class="o">));</span> <span class="c1">//pass a key for this serie</span>
+		<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
+			<span class="n">dataSeries</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">i</span><span class="o">,</span> <span class="n">RandomUtils</span><span class="o">.</span><span class="na">nextInt</span><span class="o">());</span>
+		<span class="o">}</span>
+		<span class="n">XYSeriesCollection</span> <span class="n">xyDataset</span> <span class="o">=</span> <span class="k">new</span> <span class="n">XYSeriesCollection</span><span class="o">(</span><span class="n">dataSeries</span><span class="o">);</span>
+
+		<span class="n">ValueAxis</span> <span class="n">xAxis</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NumberAxis</span><span class="o">(</span><span class="s">"Raw Marks"</span><span class="o">);</span>
+		<span class="n">ValueAxis</span> <span class="n">yAxis</span> <span class="o">=</span> <span class="k">new</span> <span class="n">NumberAxis</span><span class="o">(</span><span class="s">"Moderated Marks"</span><span class="o">);</span>
+
+		<span class="c1">// set my chart variable</span>
+		<span class="n">chart</span> <span class="o">=</span>
+			<span class="k">new</span> <span class="n">JFreeChart</span><span class="o">(</span>
+				<span class="s">"Moderation Function"</span><span class="o">,</span>
+				<span class="n">JFreeChart</span><span class="o">.</span><span class="na">DEFAULT_TITLE_FONT</span><span class="o">,</span>
+				<span class="k">new</span> <span class="n">XYPlot</span><span class="o">(</span>
+					<span class="n">xyDataset</span><span class="o">,</span>
+					<span class="n">xAxis</span><span class="o">,</span>
+					<span class="n">yAxis</span><span class="o">,</span>
+					<span class="k">new</span> <span class="n">StandardXYItemRenderer</span><span class="o">(</span><span class="n">StandardXYItemRenderer</span><span class="o">.</span><span class="na">LINES</span><span class="o">)),</span>
+				<span class="kc">false</span><span class="o">);</span>
+		<span class="n">chart</span><span class="o">.</span><span class="na">setBackgroundPaint</span><span class="o">(</span><span class="n">java</span><span class="o">.</span><span class="na">awt</span><span class="o">.</span><span class="na">Color</span><span class="o">.</span><span class="na">white</span><span class="o">);</span>
+
+		<span class="k">return</span> <span class="kd">super</span><span class="o">.</span><span class="na">SUCCESS</span><span class="o">;</span>
+	<span class="o">}</span>
+
+	<span class="kd">public</span> <span class="n">JFreeChart</span> <span class="n">getChart</span><span class="o">()</span> <span class="o">{</span>
+		<span class="k">return</span> <span class="n">chart</span><span class="o">;</span>
+	<span class="o">}</span>
+
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<h3 id="settings">Settings</h3>
+
+<p>This plugin doesn’t provides any global settings.</p>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  The JFreeChart library will need to be downloaded separately, as its LGPL license doesn’t allow it to be distributed with Struts.</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>
diff --git a/content/plugins/jsf/index.html b/content/plugins/jsf/index.html
new file mode 100644
index 0000000..37ae1ff
--- /dev/null
+++ b/content/plugins/jsf/index.html
@@ -0,0 +1,282 @@
+<!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>JSF Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/jsf/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="jsf-plugin">JSF Plugin</h1>
+
+<p><a href="http://java.sun.com/j2ee/javaserverfaces">JavaServer Faces</a> technology simplifies building user interfaces for JavaServer applications. Developers of various skill levels can quickly build web applications by: assembling reusable UI components in a page; connecting these components to an application data source; and wiring client-generated events to server-side event handlers.</p>
+
+<p>The JSF Plugin provides support for JavaServer Faces components with no additional configuration.</p>
+
+<p>The JSF support works by breaking up the JSF Licycle class into Struts Interceptors, one for each JSF phase.  When you include the <code class="highlighter-rouge">jsfStack</code> stack, you are ensuring the JSF page has its phases execute correctly.  At the end of the phases, the Struts Action itself is executed just like non-JSF pages.  The String return code of the Action is treated like any other Action as well.  Finally, the JSF “render” phase has been transformed into a Result.</p>
+
+<p>JavaServer Faces also has a concept of an “action”, which are generally executed in response to a button click.  The handling of the JSF action is preserved through the <code class="highlighter-rouge">jsfStack</code> Interceptor stack, but its String result code, rather than being applied against a JSF navigation rule, is treated as a Struts result code thereby keeping the navigation responsibility within Struts.</p>
+
+<p>The limitations of this approach include:</p>
+
+<ol>
+  <li>
+    <p>Any custom Lifecycle class is ignored</p>
+  </li>
+  <li>
+    <p>Any custom NavigationHandler is delegated to only when a Struts 2 navigation option cannot be found</p>
+  </li>
+</ol>
+
+<p>On the other hand, the rest of the JSF functionality, including PhaseListeners, components, multiple backing beans, etc. are preserved.  The Showcase example has a section demonstrating the JSF integration approach.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Allows JSF components on normal Struts pages</p>
+  </li>
+  <li>
+    <p>Requires no additional configuration</p>
+  </li>
+  <li>
+    <p>Allows the JSF lifecycle to be completely customized</p>
+  </li>
+  <li>
+    <p>Preserves most JSF framework features so even complex components should work out of the box</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>The JSF plugin splits the JSF lifecycle into an optional Interceptor stack and Result, yet retains the page’s Action and navigation. Therefore, to use a page with JSF components, you need to:</p>
+
+<ol>
+  <li>
+    <p>Add the <code class="highlighter-rouge">jsfStack</code> interceptor stack to your action definition.  This is easiest done by having your package extend <code class="highlighter-rouge">jsf-default</code>.</p>
+  </li>
+  <li>
+    <p>Add a <code class="highlighter-rouge">jsf</code> result associated with the name <code class="highlighter-rouge">success</code>You can still add additional interceptors and results, including those that don’t use JSF at all.  In fact, the recommended approach is to use regular Struts results to handle inter-page navigation to avoid a common problem of JSF applications where every page request is a HTTP POST.</p>
+  </li>
+</ol>
+
+<p>This approach brings an additional advantage to JSF - every page can have an Action to execute page setup code, and the same Action instance will be automatically available later in the JSF page’s expression language as <code class="highlighter-rouge">action</code>.  This means any common page logic such as retrieving data from a database can remain in your Action, and having that instance available later in your JSF components means the JSF configuration file is completely optional.  [...]
+
+<h3 id="example">Example</h3>
+
+<p>The following is an example of a regular Struts Action 2 page definition:</p>
+
+<p><strong>Regular JSF Action</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"employee"</span> <span class="na">class=</span><span class="s">"org.apache.struts.action2.showcase.jsf.EmployeeAction"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</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>employee.jsp<span class="nt">&lt;/result&gt;</span>
+    <span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">type=</span><span class="s">"redirect-action"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+</code></pre>
+</div>
+
+<p>This is the same action but as a JSF-enabled page:</p>
+
+<p><strong>JSF-enabled Action</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"employee"</span> <span class="na">class=</span><span class="s">"org.apache.struts.action2.showcase.jsf.EmployeeAction"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"jsfStack"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"jsf"</span> <span class="nt">/&gt;</span>
+    <span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">type=</span><span class="s">"redirect-action"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+</code></pre>
+</div>
+
+<p>Notice the Action-based navigation remains, but now you can use a page with JSF components and have complete access to the JSF lifecycle. This even supports JSF components that post back to themselves or add PhaseListeners to provide advanced AJAX support.</p>
+
+<h3 id="settings">Settings</h3>
+
+<p>This plugin does not have any customizable settings.</p>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+<h2 id="resources">Resources</h2>
+
+<ul>
+  <li><a href="http://raibledesigns.com/rd/entry/integrating_struts_2_jsf_facelets">Integrating Struts 2 + JSF + Facelets</a> (Matt Raible)</li>
+</ul>
+
+  </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>
diff --git a/content/plugins/osgi/index.html b/content/plugins/osgi/index.html
new file mode 100644
index 0000000..5e76b83
--- /dev/null
+++ b/content/plugins/osgi/index.html
@@ -0,0 +1,581 @@
+<!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>OSGi Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/osgi/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="osgi-plugin">OSGi Plugin</h1>
+
+<h2 id="overview">Overview</h2>
+
+<p>This plugin is only experimental and can change in the future.</p>
+
+<p>This plugin provides support for starting an instance of Apache Felix inside a web application, and scanning installed bundles for Struts configuration. An admin bundle is also provided. It can be used with Glassfish 3 as well (Glassfish 3 based on Apache Felix as well), but in such a way <code class="highlighter-rouge">struts.osgi.host</code> must be defined.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>GUI for bundle administration</p>
+  </li>
+  <li>
+    <p>Web access to Felix Shell</p>
+  </li>
+  <li>
+    <p>Application packages can be divided into bundles</p>
+  </li>
+  <li>
+    <p>Supports Velocity and FreeMarker templates</p>
+  </li>
+  <li>
+    <p>Supports Struts Spring integration</p>
+  </li>
+  <li>
+    <p>Supports integration with the Convention plugin</p>
+  </li>
+</ul>
+
+<h2 id="missing-features">Missing Features</h2>
+
+<ul>
+  <li>
+    <p>Probably can’t access application classes from bundles, including Spring classes</p>
+  </li>
+  <li>
+    <p><em>constant</em>  declarations in the bundled XML config files are ignored, these constants need to be set in the application XML config files (struts.xml)</p>
+  </li>
+</ul>
+
+<h2 id="about-run-levels">About Run levels</h2>
+
+<p>There are two ways of organizing bundles. If third party bundles will not be used, then the application bundles can just be placed under <code class="highlighter-rouge">/WEB-INF/classes/bundles</code>. Bundles in this dir will be started in run level 2, the Apache Felix framework’s bundles will be loaded in run level 1. If third parties bundles will be used, or you need to start bundles on different run level, create sub dirs under <code class="highlighter-rouge">/WEB-INF/classes/bund [...]
+
+<h2 id="simple-usage">Simple Usage</h2>
+
+<p>Add these lines to MANIFEST.MF:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>Struts2-Enabled: true
+Export-Package: com.mycompany.myapp.actions
+Bundle-Version: 1.0.0
+Bundle-SymbolicName: foo.actions
+Import-Package: com.opensymphony.xwork2
+</code></pre>
+</div>
+
+<p>Now the jar is ready to be deployed.  Drop the jar into the <code class="highlighter-rouge">/WEB-INF/classes/bundles</code> directory and it will automatically be installed when the application starts up.</p>
+
+<h2 id="using-spring">Using Spring</h2>
+
+<p>By default Spring OSGi loads its xml config files asynchronously, which causes the OSGi plugin to fail while starting. To fix this add this line to MANIFEST.MF:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>Spring-Context:*;create-asynchronously:=false
+</code></pre>
+</div>
+
+<p>Or if using The Apache Felix maven plugin (see below for details):</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;Spring-Context&gt;</span>*;create-asynchronously:=false<span class="nt">&lt;/Spring-Context&gt;</span>
+</code></pre>
+</div>
+
+<p>Please note that you <strong>do not</strong> need to have the Struts Spring plugin in your application, in order to use Spring with the OSGi plugin.</p>
+
+<p>If you want to use the Spring as the object factory for your actions, then follow these steps:</p>
+
+<ol>
+  <li>
+    <p>Place your Spring xml files under <code class="highlighter-rouge">/META-INF/spring</code> in the <strong>bundle</strong> jar file</p>
+  </li>
+  <li>
+    <p>Place your Spring xml files under <code class="highlighter-rouge">/spring</code> (they must be in the classpath, if you are using maven, put thme under /src/resources/spring) in the <strong>application</strong></p>
+  </li>
+  <li>
+    <p>Copy all the bundle jar files into <code class="highlighter-rouge">/WEB-INF/classes/bundles</code> in your <strong>application</strong></p>
+  </li>
+  <li>
+    <p>Make sure that the following properties are set in struts.xml or struts.properties in your <strong>application</strong>:</p>
+  </li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.objectFactory"</span> <span class="na">value=</span><span class="s">"osgi"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.objectFactory.delegate"</span> <span class="na">value=</span><span class="s">"springOsgi"</span> <span class="nt">/&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+</code></pre>
+</div>
+
+<ol start="5">
+  <li>Configure your <strong>web.xml</strong> like:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+<span class="nt">&lt;web-app</span> <span class="na">id=</span><span class="s">"WebApp_9"</span> <span class="na">version=</span><span class="s">"2.4"</span> <span class="na">xmlns=</span><span class="s">"http://java.sun.com/xml/ns/j2ee"</span>
+         <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
+         <span class="na">xsi:schemaLocation=</span><span class="s">"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span class="nt">&gt;</span>
+
+    <span class="nt">&lt;display-name&gt;</span>Struts Blank<span class="nt">&lt;/display-name&gt;</span>
+
+    <span class="nt">&lt;filter&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts2-prepare<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter<span class="nt">&lt;/filter-class&gt;</span>
+    <span class="nt">&lt;/filter&gt;</span>
+
+    <span class="nt">&lt;filter&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts2-execute<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter<span class="nt">&lt;/filter-class&gt;</span>
+    <span class="nt">&lt;/filter&gt;</span>
+
+     <span class="nt">&lt;filter-mapping&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts2-prepare<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;/filter-mapping&gt;</span>
+
+    <span class="nt">&lt;filter-mapping&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts2-execute<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;/filter-mapping&gt;</span>
+
+    <span class="nt">&lt;listener&gt;</span>
+        <span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.osgi.StrutsOsgiListener<span class="nt">&lt;/listener-class&gt;</span>
+    <span class="nt">&lt;/listener&gt;</span>
+
+    <span class="nt">&lt;listener&gt;</span>
+        <span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.dispatcher.ng.listener.StrutsListener<span class="nt">&lt;/listener-class&gt;</span>
+    <span class="nt">&lt;/listener&gt;</span>
+
+    <span class="nt">&lt;listener&gt;</span>
+        <span class="nt">&lt;listener-class&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="nt">&lt;/listener-class&gt;</span>
+    <span class="nt">&lt;/listener&gt;</span>
+
+    <span class="nt">&lt;context-param&gt;</span>
+        <span class="nt">&lt;param-name&gt;</span>contextClass<span class="nt">&lt;/param-name&gt;</span>
+        <span class="nt">&lt;param-value&gt;</span>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/context-param&gt;</span>
+    <span class="nt">&lt;context-param&gt;</span>
+        <span class="nt">&lt;param-name&gt;</span>contextConfigLocation<span class="nt">&lt;/param-name&gt;</span>
+        <span class="nt">&lt;param-value&gt;</span>osgibundle:/META-INF/spring/*.xml<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/context-param&gt;</span>
+    <span class="nt">&lt;context-param&gt;</span>
+        <span class="nt">&lt;param-name&gt;</span>parentContextKey<span class="nt">&lt;/param-name&gt;</span>
+        <span class="nt">&lt;param-value&gt;</span>parent-context-bean<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/context-param&gt;</span>
+<span class="nt">&lt;/web-app&gt;</span>
+</code></pre>
+</div>
+
+<ol start="6">
+  <li>Add the Spring OSGi, and Spring Web dependencies to your web app, if you are using maven:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependencies&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.springframework<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>spring-web<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>2.5.5<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>org.springframework.osgi<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>spring-osgi-web<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.1.2<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+<span class="nt">&lt;/dependencies&gt;</span>
+</code></pre>
+</div>
+
+<ol start="7">
+  <li>Download Spring OSGi and copy all the required bundles under <strong>/classes/bundles/2</strong>. For Struts OSGi 1.1.2, these are the required bundles:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>com.springsource.org.aopalliance-1.0.0.jar
+com.springsource.org.apache.commons.logging-1.1.1.jar
+org.springframework.aop-2.5.5.A.jar
+org.springframework.beans-2.5.5.A.jar
+org.springframework.context-2.5.5.A.jar
+org.springframework.core-2.5.5.A.jar
+org.springframework.osgi.core-1.1.2.A.jar
+org.springframework.osgi.extender-1.1.2.A.jar
+org.springframework.osgi.io-1.1.2.A.jar
+org.springframework.osgi.web-1.1.2.A.jar
+org.springframework.web-2.5.5.A.jar
+</code></pre>
+</div>
+
+<ol start="8">
+  <li>Put your bundles under <strong>/classes/bundles/3</strong></li>
+</ol>
+
+<h2 id="using-velocity">Using Velocity</h2>
+
+<p>If you are going to use Velocity results, then add Velocity and Common Digester jars to your application. Using maven:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;depndencies&gt;</span>
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>velocity<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>velocity<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.5<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>velocity-tools<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>velocity-tools<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.3<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+
+    <span class="nt">&lt;dependency&gt;</span>
+        <span class="nt">&lt;groupId&gt;</span>commons-digester<span class="nt">&lt;/groupId&gt;</span>
+        <span class="nt">&lt;artifactId&gt;</span>commons-digester<span class="nt">&lt;/artifactId&gt;</span>
+        <span class="nt">&lt;version&gt;</span>1.8<span class="nt">&lt;/version&gt;</span>
+    <span class="nt">&lt;/dependency&gt;</span>
+<span class="nt">&lt;/depndencies&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="using-the-convention-plugin">Using The Convention Plugin</h2>
+
+<p>The Convention plugin will discover actions in bundles in the same way that it discovers them in normal applications. The Convention plugin expects result templates to be (by default) stored under <em>/WEB-INF/content</em> . When packaging actions inside bundles, there won’t be a <em>WEB-INF</em>  folder, so you must let Convention know where the templates are located. There are two ways of doing so(assuming the templates are under <em>/content</em> ):</p>
+
+<ol>
+  <li>Set the templates location constant in struts.xml (in the application struts.xml, not a bundled struts.xml)</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.result.path"</span> <span class="na">value=</span><span class="s">"/content/"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+</code></pre>
+</div>
+
+<ol start="2">
+  <li>Using the ResultPath annotation</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nd">@ResultPath</span><span class="o">(</span><span class="s">"/content"</span><span class="o">)</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">HelloWorldAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+<span class="c1">//...</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<h2 id="the-osgi-interceptor">The OSGi interceptor</h2>
+
+<p>The OSGi plugins defines the <code class="highlighter-rouge">osgi</code> interceptor and <code class="highlighter-rouge">osgiStack</code>(<code class="highlighter-rouge">defaultStack</code> plus the <code class="highlighter-rouge">osgi</code> interceptor) in the package <code class="highlighter-rouge">osgi-default</code>. This interceptor will check the action and if it implements <code class="highlighter-rouge">org.apache.struts2.osgi.interceptor.BundleContextAware</code>, it will in [...]
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">BookPriceAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="kd">implements</span> <span class="n">ServiceAware</span><span class="o">&lt;</span><span class="n">BookPriceLookup</span><span class="o">&gt;</span> <span class="o">{</span>
+    <span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">BookPriceLookup</span><span class="o">&gt;</span> <span class="n">services</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">setServices</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">BookPriceLookup</span><span class="o">&gt;</span> <span class="n">services</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">services</span> <span class="o">=</span> <span class="n">services</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>Keep in mind that the interceptor is not defined in the default struts package, so when using Convention, you need to specify the parent package as “osgi-default”, either using annotations (@ParentPackage), or XML(<strong>this XML fragment must be in the struts XML config file in the application, not the bundle’s</strong>, this is a current limitation of the OSGi plugin):</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.default.parent.package"</span> <span class="na">value=</span><span class="s">"osgi-default"</span> <span class="nt">/&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="admin-bundle">Admin bundle</h2>
+
+<p>An admin bundle is distributed with struts, which provides a simple interface to list the installed bundles. Using this interface the bundles can be stopped, started and updated (reloaded from the file system). This interface also provides information on the installed bundles, like OSGi metadata, and a list of packages and actions loaded from each bundle. An interactive AJAX shell is also available, which is just a web interface to the Apache Felix Shell. To use this bundle, just copy [...]
+
+<h2 id="about-stoppingstarting-bundles">About stopping/starting bundles</h2>
+
+<p>When a bundle is started, the OSGi plugin will check for the header <code class="highlighter-rouge">Struts2-Enabled</code> in it. If it is set to “true”, the bundle will be scanned for XML config and Convention config. When a bundle is stopped, any actions that were loaded from it will be removed from the runtime configuration.</p>
+
+<h2 id="settings">Settings</h2>
+
+<p>The following settings can be customized.  See the <a href="/core-developers/configuration-files.html">developer guide</a>.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.objectFactory.delegate</td>
+      <td>The alias of the ObjectFactory to wrap</td>
+      <td>struts</td>
+      <td>Any configured alias</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>The following setting must be set as context parameters in <em>web.xml</em> , because they are used by the StrutsOsgiListener, for example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;context-param&gt;</span>
+    <span class="nt">&lt;param-name&gt;</span>struts.osgi.clearBundleCache<span class="nt">&lt;/param-name&gt;</span>
+    <span class="nt">&lt;param-value&gt;</span>false<span class="nt">&lt;/param-value&gt;</span>
+<span class="nt">&lt;/context-param&gt;</span>
+</code></pre>
+</div>
+
+<p>If you are running your application on Glassfish 3 (which already contains Apache Felix) you must specify <code class="highlighter-rouge">struts.osgi.host</code>, like below:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;context-param&gt;</span>
+    <span class="nt">&lt;param-name&gt;</span>struts.osgi.host<span class="nt">&lt;/param-name&gt;</span>
+    <span class="nt">&lt;param-value&gt;</span>Glassfish<span class="nt">&lt;/param-value&gt;</span>
+<span class="nt">&lt;/context-param&gt;</span>
+</code></pre>
+</div>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.osgi.clearBundleCache</td>
+      <td>Delete all installed bundles when the container starts</td>
+      <td>true</td>
+      <td>true or false</td>
+    </tr>
+    <tr>
+      <td>struts.osgi.runLevel</td>
+      <td>Run level to start the container</td>
+      <td>3</td>
+      <td>&gt;=3</td>
+    </tr>
+    <tr>
+      <td>struts.osgi.logLevel</td>
+      <td>Log level for Apache Felix</td>
+      <td>1 (Error)</td>
+      <td>1 = error, 2 = warning, 3 = information, and 4 = debug</td>
+    </tr>
+  </tbody>
+</table>
+
+<h2 id="building-bundles-with-maven">Building bundles with Maven</h2>
+
+<p>Jar files can be turned into bundles using the <a href="http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd.html">Maven Bundle Plugin</a> like:</p>
+
+<p><strong>Maven Bundle Plugin Example</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;build&gt;</span>
+    <span class="nt">&lt;plugins&gt;</span>
+        <span class="nt">&lt;plugin&gt;</span>
+            <span class="nt">&lt;groupId&gt;</span>org.apache.felix<span class="nt">&lt;/groupId&gt;</span>
+            <span class="nt">&lt;artifactId&gt;</span>maven-bundle-plugin<span class="nt">&lt;/artifactId&gt;</span>
+            <span class="nt">&lt;extensions&gt;</span>true<span class="nt">&lt;/extensions&gt;</span>
+            <span class="nt">&lt;version&gt;</span>2.0.0<span class="nt">&lt;/version&gt;</span>
+            <span class="nt">&lt;configuration&gt;</span>
+                <span class="nt">&lt;instructions&gt;</span>
+                    <span class="nt">&lt;manifestLocation&gt;</span>META-INF<span class="nt">&lt;/manifestLocation&gt;</span>
+                    <span class="nt">&lt;Struts2-Enabled&gt;</span>true<span class="nt">&lt;/Struts2-Enabled&gt;</span>
+                    <span class="nt">&lt;Export-Package&gt;</span>org.apache.struts2.osgi.demo<span class="nt">&lt;/Export-Package&gt;</span>
+                    <span class="nt">&lt;Import-Package&gt;</span>*,com.opensymphony.xwork2<span class="nt">&lt;/Import-Package&gt;</span>
+                    <span class="nt">&lt;Spring-Context&gt;</span>*;create-asynchronously:=false<span class="nt">&lt;/Spring-Context&gt;</span>
+                <span class="nt">&lt;/instructions&gt;</span>
+            <span class="nt">&lt;/configuration&gt;</span>
+        <span class="nt">&lt;/plugin&gt;</span>
+    <span class="nt">&lt;/plugins&gt;</span>
+<span class="nt">&lt;/build&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="struts-osgi--spring-osgi-diagram">Struts OSGi + Spring OSGi diagram</h2>
+
+<p><img src="../attachments/att10437_struts-osgi.jpg" alt="struts-osgi.jpg" /></p>
+
+<h2 id="resources">Resources</h2>
+
+<ul>
+  <li>
+    <p><a href="http://www.osgi.org">OSGi</a></p>
+  </li>
+  <li>
+    <p><a href="http://felix.apache.org">Apache Felix</a></p>
+  </li>
+  <li>
+    <p><a href="http://www.springsource.org/osgi">Spring OSGi </a></p>
+  </li>
+</ul>
+
+  </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>
diff --git a/content/plugins/oval/index.html b/content/plugins/oval/index.html
new file mode 100644
index 0000000..2091abb
--- /dev/null
+++ b/content/plugins/oval/index.html
@@ -0,0 +1,405 @@
+<!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>OVal Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/oval/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="oval-plugin">OVal Plugin</h1>
+
+<h2 id="overview">Overview</h2>
+
+<p><a href="http://oval.sourceforge.net/">OVal</a> is a pragmatic and extensible validation framework for any kind of Java objects (not only JavaBeans). Constraints can be declared with annotations (@NotNull, @MaxLength), POJOs or XML. Custom constraints can be expressed as custom Java classes or by using scripting languages such as JavaScript, Groovy, BeanShell, OGNL or MVEL.</p>
+
+<p>The OVal plugin provides support for using the <a href="http://oval.sourceforge.net/">OVal Validation Framework</a></p>
+
+<h2 id="interceptors">Interceptors</h2>
+
+<p>The plugin defines the interceptor “ovalValidation” and the interceptor stack “ovalValidationStack” in the “oval-default” package. To use this interceptor, extend the “oval-default” package and apply the interceptor to your action, like:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+   <span class="nt">&lt;package</span> <span class="na">namespace=</span><span class="s">"/myactions"</span> <span class="na">name=</span><span class="s">"myactions"</span> <span class="na">extends=</span><span class="s">"oval-default"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"simpleFieldsXMLChild"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.interceptor.SimpleFieldsXMLChild"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"ovalValidationStack"</span><span class="nt">/&gt;</span>
+            <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"void"</span><span class="nt">&gt;&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+   <span class="nt">&lt;/package&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="annotations">Annotations</h2>
+
+<p>OVal provides many annotations for validations that can be used out of the box (custom validators can also be defined). Once the “ovalValidation” interceptor is applied to an action, you can annotate it:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">SimpleField</span> <span class="kd">extends</span> <span class="n">ActionSupport</span><span class="o">{</span>
+    <span class="nd">@NotNull</span><span class="o">()</span>
+    <span class="nd">@NotEmpty</span>
+    <span class="nd">@Length</span><span class="o">(</span><span class="n">max</span> <span class="o">=</span> <span class="mi">3</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span>
+<span class="c1">//...</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>Use the @AssertValid annotation to validate nested objects, like</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MemberObject</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+    <span class="nd">@AssertValid</span>
+    <span class="kd">private</span> <span class="n">Person</span> <span class="n">person</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Person</span><span class="o">();</span>
+
+    <span class="kd">public</span> <span class="n">Person</span> <span class="n">getPerson</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">person</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<h2 id="xml-configuration">XML Configuration</h2>
+
+<p>OVal provides support for defining the validation via XML. Validation files must end in “-validation.xml” and the rules to find them, are the same rules used to find the validation XML files used by the regular validation mechanisms (default validation in xwork):</p>
+
+<ol>
+  <li>
+    <p>Per Action class: in a file named ActionName-validation.xml</p>
+  </li>
+  <li>
+    <p>Per Action alias: in a file named ActionName-alias-validation.xml</p>
+  </li>
+  <li>
+    <p>Inheritance hierarchy and interfaces implemented by Action class: The plugin searches up the inheritance tree of the action to find default validations for parent classes of the Action and interfaces implemented</p>
+  </li>
+</ol>
+
+<p>Here is an example of an XML validation file:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+<span class="nt">&lt;oval</span> <span class="na">xmlns=</span><span class="s">"http://oval.sf.net/oval-configuration"</span> <span class="na">xmlns:xsi=</span><span class="s">"http://http://www.w3.org/2001/XMLSchema-instance"</span>
+ <span class="na">xsi:schemaLocation=</span><span class="s">"http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration-1.3.xsd"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;class</span> <span class="na">type=</span><span class="s">"org.apache.struts2.interceptor.SimpleFieldsXML"</span> <span class="na">overwrite=</span><span class="s">"false"</span>
+           <span class="na">applyFieldConstraintsToSetters=</span><span class="s">"true"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">"firstName"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;notNull/&gt;</span>
+        <span class="nt">&lt;/field&gt;</span>
+    <span class="nt">&lt;/class&gt;</span>
+<span class="nt">&lt;/oval&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="profiles">Profiles</h2>
+
+<p>A profile is a set of validations, that can be enabled for a method in an action, for example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">org.apache.struts2.validation.Profiles</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">FieldsWithProfiles</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+    <span class="nd">@NotNull</span><span class="o">(</span><span class="n">profiles</span> <span class="o">=</span> <span class="s">"1"</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="nd">@NotNull</span><span class="o">(</span><span class="n">profiles</span> <span class="o">=</span> <span class="s">"2"</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">middleName</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span><span class="o">(</span><span class="n">profiles</span> <span class="o">=</span> <span class="s">"3"</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="nd">@Profiles</span><span class="o">({</span><span class="s">"1"</span><span class="o">,</span> <span class="s">"3"</span><span class="o">})</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">firstAndLast</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="nd">@Profiles</span><span class="o">({</span><span class="s">"2"</span><span class="o">})</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="n">middle</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>In this example, when <em>firstAndLast()</em>  is executed, the fields <em>firstName</em>  and <em>lastName</em>  will be validated. When <em>middle()</em>  is executed, only <em>middleName</em>  will be validated. When a method is annotated with the <em>Profiles</em>  annotation, only the validations in the specified profiles will be performed. If no profile is specified for an action method, all the validations in the class will be evaluated.</p>
+
+<h2 id="internationalization-of-messages">Internationalization of messages</h2>
+
+<p>The OVal annotations (and corresponding XML tags) have a <em>message</em>  attribute that can be used to specify either the error message, or the key of the error message. If a key is found in a property file, matching the value of the <em>massage</em>  attribute, it will be used as the message, otherwise the value will be used as a literal string. For example, given this property file:</p>
+
+<p><strong>BookAction.properties</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>notnull.field=${field.name} cannot be null
+
+field.too.long=${field.name} value is too long, allowed length is ${max}
+</code></pre>
+</div>
+
+<p>and this class:</p>
+
+<p><strong>BookAction.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">BookActionextends</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+    <span class="nd">@NotNull</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"notnull.field"</span><span class="o">)</span>
+    <span class="nd">@Length</span><span class="o">(</span><span class="n">max</span> <span class="o">=</span> <span class="mi">3</span><span class="o">,</span> <span class="n">message</span> <span class="o">=</span> <span class="s">"field.too.long"</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">title</span><span class="o">;</span>
+
+    <span class="nd">@NotNull</span><span class="o">(</span><span class="n">message</span> <span class="o">=</span> <span class="s">"You must enter a valid ISBN"</span><span class="o">)</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">isbn</span><span class="o">;</span>
+<span class="c1">//...</span>
+<span class="o">}</span>
+</code></pre>
+</div>
+
+<p>When that action is validated, the field errors would be:</p>
+
+<ul>
+  <li>
+    <p>“title cannot be null”</p>
+  </li>
+  <li>
+    <p>“You must enter a valid ISBN”</p>
+  </li>
+  <li>
+    <p>“title value is too long, allowed length is 3”</p>
+  </li>
+</ul>
+
+<p>The current OVal “context” object is pushed into the stack for each validator, so it can be accessed from the property file to build the error message. See the <a href="http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext.html">OVal javadoc</a> for more properties available in the FieldContext class.</p>
+
+<h2 id="the-oval-validation-interceptor">The OVal Validation Interceptor</h2>
+
+<p>This interceptor runs the action through the standard validation framework, which in turn checks the action against any validation rules (found in files such as ActionClass-validation.xml) and adds field-level and action-level error messages (provided that the action implements com.opensymphony.xwork2.ValidationAware). This interceptor is often one of the last (or second to last) interceptors applied in a stack, as it assumes that all values have already been set on the action.</p>
+
+<p>This interceptor does nothing if the name of the method being invoked is specified in the <em>excludeMethods</em>  parameter. <em>excludeMethods</em>  accepts a comma-delimited list of method names. For example, requests to foo!input.action and foo!back.action will be skipped by this interceptor if you set the excludeMethods parameter to “input, back”.</p>
+
+<p>Note that this has nothing to do with the com.opensymphony.xwork2.Validateable interface and simply adds error messages to the action. The workflow of the action request does not change due to this interceptor. Rather, this interceptor is often used in conjuction with the workflow interceptor.</p>
+
+<p>NOTE: As this method extends off MethodFilterInterceptor, it is capable of deciding if it is applicable only to selective methods in the action class. See MethodFilterInterceptor for more info.</p>
+
+<p>The param <em>alwaysInvokeValidate</em>  (default to <em>true</em> ), will make the interceptor invoke <em>validate()</em>  on the action, if the action implements <em>Validateable</em> .</p>
+
+<p>The param <em>programmatic</em>  (defaults to <em>true</em> ), will make the plugin call <em>validateX()</em>  where <em>X</em>  is the name of the method that will be invoked in the action. If this param is set to <em>false</em> , <em>alwaysInvokeValidate</em>  is ignored and <em>validate()</em>  won’t be invoked.</p>
+
+<h2 id="installation">Installation</h2>
+
+<p>The jar plugin needs to be added to the lib directory of your application as well as other dependencies. If you are using XML validation, XStream needs to be included. Here is the maven dependency example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
+    <span class="nt">&lt;groupId&gt;</span>com.thoughtworks.xstream<span class="nt">&lt;/groupId&gt;</span>
+    <span class="nt">&lt;artifactId&gt;</span>xstream<span class="nt">&lt;/artifactId&gt;</span>
+    <span class="nt">&lt;version&gt;</span>1.3.1<span class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+</code></pre>
+</div>
+
+<h2 id="configuration-reference">Configuration reference</h2>
+
+<p>Add a <em>constant</em>  element to your struts config file to change the value of a configuration setting, like:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.oval.validateJPAAnnotations"</span> <span class="na">value=</span><span class="s">"true"</span> <span class="nt">/&gt;</span>
+</code></pre>
+</div>
+
+<table>
+  <thead>
+    <tr>
+      <th>Name</th>
+      <th>Default Value</th>
+      <th>Description</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.oval.validateJPAAnnotations</td>
+      <td>false</td>
+      <td>Enables <a href="http://oval.sourceforge.net/userguide.html#d0e242">mapping of JPA annotations to Oval validators</a></td>
+    </tr>
+  </tbody>
+</table>
+
+<h2 id="resources">Resources</h2>
+
+<ul>
+  <li>
+    <p><a href="http://oval.sourceforge.net/userguide.html">OVal User Guide</a></p>
+  </li>
+  <li>
+    <p><a href="http://oval.sourceforge.net/userguide.html">OVal Javadoc</a></p>
+  </li>
+  <li>
+    <p><a href="http://oval.sourceforge.net/userguide.html#d0e1138">OVal Tutorials</a></p>
+  </li>
+</ul>
+
+  </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>
diff --git a/content/plugins/plexus/index.html b/content/plugins/plexus/index.html
new file mode 100644
index 0000000..a8a9b23
--- /dev/null
+++ b/content/plugins/plexus/index.html
@@ -0,0 +1,243 @@
+<!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>Plexus Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/plexus/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="plexus-plugin">Plexus Plugin</h1>
+
+<blockquote>
+  <p>The Plexus Plugin is experimental. Feedback is appreciated!</p>
+</blockquote>
+
+<p>While <a href="http://plexus.codehaus.org/">Plexus</a> is similar to other inversion-of-control (IoC) or dependency injection frameworks such as the Spring Framework, it’s fully-fledged container supports many more features.</p>
+
+<p>The Plexus plugin enables Struts Actions, Interceptors, and Results to be created and injected by <a href="http://plexus.codehaus.org/">Plexus</a>.</p>
+
+<p>This plugin provides an <a href="/core-developers/object-factory.html">ObjectFactory</a> implementation that tries to create Struts Action, Interceptor, and Result classes as Plexus objects.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>Allows Actions, Results, and Interceptors to be created and managed by Plexus</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use the plugin, when configuring Struts Actions, Interceptors, or Results in <code class="highlighter-rouge">struts.xml</code>, set the <code class="highlighter-rouge">class</code> attribute to contain the Plexus object id, rather than the actual Java class.  This will allow Plexus to create the object and inject any dependencies also managed by Plexus.</p>
+
+<h3 id="example">Example</h3>
+
+<p><strong>A simple Action using a Plexus id</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"myAction"</span> <span class="na">class=</span><span class="s">"myPlexusId"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;result&gt;</span>myAction.jsp<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+</code></pre>
+</div>
+
+<h3 id="settings">Settings</h3>
+
+<p>The following settings can be customized.  See the <a href="/core-developers/configuration-files.html">developer guide</a>.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.objectFactory</td>
+      <td>The name or class name of the ObjectFactory implementation to use</td>
+      <td>plexus</td>
+      <td>plexus, struts, or any class that extends ObjectFactory</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="installation">Installation</h3>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/plugin-developers.html b/content/plugins/plugin-developers.html
index 04f1b0f..185db2e 100644
--- a/content/plugins/plugin-developers.html
+++ b/content/plugins/plugin-developers.html
@@ -7,7 +7,7 @@
   <meta http-equiv="Content-Language" content="en"/>
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 
-  <title>Plugins Developers Guide (WIP)</title>
+  <title>Plugins Developers Guide</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">
@@ -125,8610 +125,37 @@
 
 <article class="container">
   <section class="col-md-12">
+    <a href="../" title="back to Plugins"><< back to Plugins</a>
     <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/plugin-developers.md" title="Edit this page on GitHub">Edit on GitHub</a>
-    
-    <p>#Plugin Developers Guide# {#PAGE_44163}</p>
+    <h1 id="plugin-developers-guide">Plugin Developers Guide</h1>
 
-<p>Apache Struts 2 provides a simple <a href="#PAGE_13868">plugin architecture</a> so that developers can extend the framework just by adding a JAR to the application’s classpath. Since plugins are contained in a JAR, they are easy to share with others. Several plugins are bundled with the framework, and others are available from third-party sources.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>+ <a href="#PAGE_13868">Plugins</a></td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>+ <em>Extending an Application with Custom Plugins</em></td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td><strong>Bundled Plugins</strong></td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>| |\
-\
-+ <a href="#PAGE_57904184">Bean Validation Plugin</a> (2.5+)\
-\
-+ <a href="#PAGE_27842284">CDI (JSR 299) Plugin</a> (2.3.1+)\
-\
-+ <a href="#PAGE_29637">Codebehind Plugin</a> (&lt; 2.5)\
-\
-+ <a href="#PAGE_44185">Config Browser Plugin</a>\
-\
-+ <a href="#PAGE_105613">Convention Plugin</a> (2.1.3+)\
-\
-+ <a href="#PAGE_82454">DWR Plugin</a>\
-\
-+ <a href="#PAGE_2852037">Embedded JSP Plugin</a> (2.1.7+)\
-\
-+ <a href="#PAGE_14258">JasperReports Plugin</a>\
-\
-+ <a href="#PAGE_50857342">Java 8 Support Plugin</a> (2.3.21 - 2.5.2)\
-\
-+ <a href="#PAGE_105841">Javatemplates Plugin</a> (2.1.3+)\
-\
-+ <a href="#PAGE_14300">JFreeChart Plugin</a>\
-\
-+ <a href="#PAGE_44198">JSF Plugin</a>( &lt; 2.5)\
-\
-+ <a href="#PAGE_2850922">JSON Plugin</a>  (2.1.7+)\
-\
-+ <a href="#PAGE_82304">JUnit Plugin</a>\
-|\
-\
-+ <a href="#PAGE_114997">OVal Plugin</a> (2.1.7+)\
-\
-+ <a href="#PAGE_114995">OSGi Plugin</a> (2.1.7+)\
-\
-+ <a href="#PAGE_44204">Plexus Plugin</a>\
-\
-+ <a href="#PAGE_74033">Portlet Plugin</a>\
-\
-+ <a href="#PAGE_30150178">Portlet Tiles Plugin</a> (2.3.5+)\
-\
-+ <a href="#PAGE_70699">REST Plugin</a> (2.1.1+)\
-\
-+ Deprecated: <a href="#PAGE_14137">SiteGraph Plugin</a>\
-\
-+ <a href="#PAGE_14142">SiteMesh Plugin</a>\
-\
-+ <a href="#PAGE_14281">Spring Plugin</a>\
-\
-+ <a href="#PAGE_44227">Struts 1 Plugin</a>( &lt; 2.5)\
-\
-+ <a href="#PAGE_82452">TestNG Plugin</a>\
-\
-+ <a href="#PAGE_27401">Tiles Plugin</a>\
-\
-+ <a href="#PAGE_30750969">Tiles 3 Plugin</a>  (&lt; 2.5)\
-|
-|————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————|———————————————————————————————————————————————————————————————————————————————————————————————————————————————
 ————————————————————————————————————————————————————————————————————–|</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>(ok)  For a complete list of bundled and third-party plugins, visit the <a href="http://cwiki\.apache\.org/S2PLUGINS/home\.html">Plugin Registry.</a>^[http://cwiki.apache.org/S2PLUGINS/home.html].</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>###Next:###</p>
-
-<p>##Bean Validation Plugin## {#PAGE_57904184}</p>
-
-<p>###Bean Validation###</p>
-
-<p>The Bean Validation plugin implements a bridge to use Bean Validation in struts actions. Bean Validation has been specified in JSR 303 and is part of the JavaEE platform. Full-fledged application servers already bring validation providers which can be leveraged by this plugin. The plugin integrates with other struts features like:</p>
-
-<ul>
-  <li>
-    <p>i18n</p>
-  </li>
-  <li>
-    <p>model driven</p>
-  </li>
-  <li>
-    <p>AJAX Validation</p>
-  </li>
-  <li>
-    <p>workflow</p>
-  </li>
-</ul>
-
-<p>###Setup###</p>
-
-<p>In order to use the Bean Validation plugin, you first need to add the JAR file to the </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/lib
-</code></pre>
-</div>
-<p> directory of your application or include the dependency in your project’s Maven POM file.</p>
-
-<p><strong>pom.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-    &lt;artifactId&gt;struts2-bean-validation-plugin&lt;/artifactId&gt;
-    &lt;version&gt;X.X.X&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>Where X.X.X is the current version of Struts 2. Please remember that the Bean Validation Plugin is available from version 2.5.</p>
-
-<p>###Configuration###</p>
-
-<p>This sample shows the configuration constants the plugin provides. It also shows how to enable bean-validation by extending your own application package from </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-bean-validation
-</code></pre>
-</div>
-<p>which comes along with the plugin.</p>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>    &lt;constant name="struts.beanValidation.providerClass" value="org.hibernate.validator.HibernateValidator"/&gt;
-    &lt;constant name="struts.beanValidation.ignoreXMLConfiguration" value="false"/&gt;
-    &lt;constant name="struts.beanValidation.convertMessageToUtf" value="false"/&gt;
-    &lt;constant name="struts.beanValidation.convertMessageFromEncoding" value="ISO-8859-1"/&gt;
- 
-	&lt;package name="my-bean-validation" extends="struts-bean-validation"&gt;
-	&lt;/package&gt;
-</code></pre>
-</div>
-
-<p>Here is another example that shows how you can combine bean-validation with other plugins by configuring your own Interceptor-Stack (note: this is just a very short example. In a real app you should take more care about your stack). You can combine bean validation with classic struts validation (or disable either) by putting the according interceptors in your stack (or by removing them from your stack).</p>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>	&lt;package name="my-app-package" extends="struts-default"&gt;
-		&lt;interceptors&gt;
-			&lt;interceptor
-				 name="beanValidation"
-				 class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor"/&gt;
-
-			&lt;interceptor-stack name="appDefaultStack"&gt;
-				&lt;interceptor-ref name="beanValidation"/&gt;
-				&lt;interceptor-ref name="defaultStack"/&gt;
-			&lt;/interceptor-stack&gt;
-		&lt;/interceptors&gt;
-	&lt;/package&gt;
-</code></pre>
-</div>
-
-<p> </p>
-
-<p>###Bean Validation Example###</p>
-
-<p>Here is an example Action that makes use of bean validation. Note that some of the validation annotations are taken from</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>javax
-</code></pre>
-</div>
-<p>package (which is defined in the JSR) while others are taken from the validaton provider (in this case:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>hibernate
-</code></pre>
-</div>
-<p>). You can specifiy own text keys in the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>message
-</code></pre>
-</div>
-<p>attribute of the annotations. If you do that the whole struts i18n mechanism kicks in to resolve those text keys.</p>
-
-<p><strong>com.example.actions.BeanValidationAction</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts.beanvalidation.constraints.FieldMatch;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Namespace;
-import org.apache.struts2.convention.annotation.ParentPackage;
-import org.apache.struts2.convention.annotation.Result;
-import org.apache.struts2.interceptor.validation.SkipValidation;
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotBlank;
-import org.hibernate.validator.constraints.ScriptAssert;
-import org.hibernate.validator.constraints.URL;
-import javax.validation.constraints.*;
-import java.util.Date;
-
-
-@Namespace("/bean-validation")
-@ParentPackage("my-bean-validation")
-@Action(results = {
-        @Result(name = "input", location = "bean-validation.jsp"),
-        @Result(name = "success", location = "/WEB-INF/validation/successFieldValidatorsExample.jsp")
-})
-@FieldMatch(first = "fieldExpressionValidatorField", second = "requiredValidatorField", message = "requiredValidatorField and fieldExpressionValidatorField are not matching")
-@ScriptAssert(lang = "javascript", script = "_this.dateValidatorField != null &amp;&amp; _this.dateValidatorField.before(new java.util.Date())", message = "Date need to before now")
-public class BeanValidationExampleAction extends ActionSupport {
-    @NotNull
-    private String requiredValidatorField = null;
-
-    @NotBlank
-    private String requiredStringValidatorField = null;
-
-    @NotNull(message="your.text.key.here")
-    @Min(1)
-    @Max(10)
-    private Integer integerValidatorField = null;
-
-    @NotNull
-    private Date dateValidatorField = null;
-
-    @NotNull
-    @Size(min = 4, max = 64)
-    @Email
-
-    private String emailValidatorField = null;
-
-    @NotNull
-    @Size(min = 4, max = 64)
-    @URL
-    private String urlValidatorField = null;
-
-    @NotNull
-    @Size(min = 2, max = 4)
-    private String stringLengthValidatorField = null;
-
-    @Pattern(regexp = "[^&lt;&gt;]+")
-    private String regexValidatorField = null;
-
-    private String fieldExpressionValidatorField = null;
-
-
- public Date getDateValidatorField() {
-
-        return dateValidatorField;
-    }
-    public void setDateValidatorField(Date dateValidatorField) {
-        this.dateValidatorField = dateValidatorField;
-    }
-    public String getEmailValidatorField() {
-        return emailValidatorField;
-    }
-    public void setEmailValidatorField(String emailValidatorField) {
-        this.emailValidatorField = emailValidatorField;
-    }
-    public Integer getIntegerValidatorField() {
-        return integerValidatorField;
-    }
-    public void setIntegerValidatorField(Integer integerValidatorField) {
-        this.integerValidatorField = integerValidatorField;
-    }
-    public String getRegexValidatorField() {
-        return regexValidatorField;
-    }
-    public void setRegexValidatorField(String regexValidatorField) {
-        this.regexValidatorField = regexValidatorField;
-    }
-    public String getRequiredStringValidatorField() {
-        return requiredStringValidatorField;
-    }
-    public void setRequiredStringValidatorField(String requiredStringValidatorField) {
-        this.requiredStringValidatorField = requiredStringValidatorField;
-    }
-    public String getRequiredValidatorField() {
-        return requiredValidatorField;
-    }
-    public void setRequiredValidatorField(String requiredValidatorField) {
-        this.requiredValidatorField = requiredValidatorField;
-    }
-    public String getStringLengthValidatorField() {
-        return stringLengthValidatorField;
-    }
-    public void setStringLengthValidatorField(String stringLengthValidatorField) {
-        this.stringLengthValidatorField = stringLengthValidatorField;
-    }
-    public String getFieldExpressionValidatorField() {
-        return fieldExpressionValidatorField;
-    }
-    public void setFieldExpressionValidatorField(
-            String fieldExpressionValidatorField) {
-        this.fieldExpressionValidatorField = fieldExpressionValidatorField;
-    }
-    public String getUrlValidatorField() {
-        return urlValidatorField;
-    }
-    public void setUrlValidatorField(String urlValidatorField) {
-        this.urlValidatorField = urlValidatorField;
-    }
-}
-</code></pre>
-</div>
-
-<p>##CDI Plugin## {#PAGE_27842284}</p>
-
-<p>###Overview###</p>
-
-<p>CDI - short for Contexts and Dependency Injection - is the new standard for Java EE (though not limited to it) dependency injection frameworks. It was introduced as <a href="http://jcp\.org/en/jsr/summary?id=299">JSR 299</a>^[http://jcp.org/en/jsr/summary?id=299], being a part of the <a href="http://jcp\.org/en/jsr/detail?id=316">Java EE 6</a>^[http://jcp.org/en/jsr/detail?id=316] umbrella specification. It is also important to note that it builds on top of JSR 330 (Dependency Injecti [...]
-
-<p>It can be used as standalone solution packed with your web applications to run in lightweight servlet containers such as Apache Tomcat or Jetty, utilizing standalone CDI implementations such as <a href="http://seamframework\.org/Weld">JBoss Weld</a>^[http://seamframework.org/Weld] (the JSR 299 reference implementation) or <a href="http://openwebbeans\.apache\.org/">Apache OpenWebBeans</a>^[http://openwebbeans.apache.org/]. On the other hand, each JEE 6 compliant application server suc [...]
-
-<p>With the Struts 2 CDI plugin, your application is open to be embedded into this modern, comprehensive and type safe framework and take full use of it.</p>
-
-<p>###Setup###</p>
-
-<p>As with all Struts 2 plugins, usage of the CDI plugin is as easy as delivering the right jars with your web application. The plugin then registers itself as the standard ObjectFactory for your Struts 2 application.</p>
-
-<p><strong>(i) Don’t mess up Object Factory Providers</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Struts 2 delivers integration into all relevant dependency injection containers via plugins, such as the <a href="#PAGE_14281">Spring Plugin</a> or the externally provided <a href="http://code\.google\.com/p/google\-guice/wiki/Struts2Integration">Guice Struts 2 Plugin</a>^[http://code.google.com/p/google-guice/wiki/Struts2Integration]. Be aware that the central feature of all those, as well as the CDI plugin, is to register itself as Struts 2 Object factory. Usually you will want to [...]
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Maven Setup####</p>
-
-<p>The most easy and recommended way use is to simply add a maven dependency for it, along with a dependency to the CDI API for development time usage:</p>
-
-<p><strong>pom.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependencies&gt;
-    ...
-    &lt;dependency&gt;
-        &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-        &lt;artifactId&gt;struts2-cdi-plugin&lt;/artifactId&gt;
-        &lt;version&gt;${struts2.version}&lt;/version&gt;
-    &lt;/dependency&gt;
-    &lt;dependency&gt;
-        &lt;groupId&gt;javax.enterprise&lt;/groupId&gt;
-        &lt;artifactId&gt;cdi-api&lt;/artifactId&gt;
-        &lt;version&gt;1.0-SP1&lt;/version&gt;
-        &lt;scope&gt;provided&lt;/scope&gt;
-    &lt;/dependency&gt;
-    ...
-&lt;/dependencies&gt;
-
-</code></pre>
-</div>
-
-<p>whereas</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>${struts2.version}
-</code></pre>
-</div>
-
-<p>should be set either as a property in your pom (recommended) or substituted by a concrete version information, such as 2.3.2 by the time of writing of this document. If you want to use CDI without an application server providing it, you may also want to add a dependency to a CDI implementation of your choice, for example Weld:</p>
-
-<p><strong>pom.xml with CDI implementation</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependencies&gt;
-    ...
-    &lt;dependency&gt;
-        &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-        &lt;artifactId&gt;struts2-cdi-plugin&lt;/artifactId&gt;
-        &lt;version&gt;${struts2.version}&lt;/version&gt;
-    &lt;/dependency&gt;
-    &lt;dependency&gt;
-        &lt;groupId&gt;javax.enterprise&lt;/groupId&gt;
-        &lt;artifactId&gt;cdi-api&lt;/artifactId&gt;
-        &lt;version&gt;1.0-SP1&lt;/version&gt;
-        &lt;scope&gt;provided&lt;/scope&gt;
-    &lt;/dependency&gt;
-    &lt;dependency&gt;
-        &lt;groupId&gt;org.jboss.weld&lt;/groupId&gt;
-        &lt;artifactId&gt;weld-core&lt;/artifactId&gt;
-        &lt;version&gt;1.0.1-Final&lt;/version&gt;
-    &lt;/dependency&gt;
-    &lt;dependency&gt;
-        &lt;groupId&gt;org.jboss.weld&lt;/groupId&gt;
-        &lt;artifactId&gt;weld-se&lt;/artifactId&gt;
-        &lt;version&gt;1.0.1-Final&lt;/version&gt;
-    &lt;/dependency&gt;
-    ...
-&lt;/dependencies&gt;
-
-</code></pre>
-</div>
-
-<p>####Manual Integration####</p>
-
-<p>Ensure that the struts2-cdi-plugin jar matching your used Struts 2 framework version - it is part of the <a href="http://struts\.apache\.org/download\.cgi">Struts 2 distribution</a>^[http://struts.apache.org/download.cgi] - is packed within the application archive that will be delivered. If a CDI implementation is provided within your container, no other dependencies are needed. If the latter is not the case, you may want to install a CDI container into your container (as commmon inst [...]
-
-<p>For IDE integration, be sure to add both the struts2-cdi-plugin-VERSION.jar as well as the cdi-api.jar to your project setup. Remember, the API jar should not be delivered with your application archive since you will have the API provided by the CDI container your application will be running with.</p>
-
-<p>####Configuration####</p>
-
-<p>Not much to see here. The CDI specification requires the CDI container to be exposed via JNDI context, and the CDI plugin will pick it up just there. Nevertheless, since there are different JNDI namespaces in use, the plugin will try to automatically find the right one among known references, that is</p>
-
-<ul>
-  <li>
-    <p>java:comp/BeanManager as the CDI docs point out</p>
-  </li>
-  <li>
-    <p>java:app/BeanManager as the Weld docs point out</p>
-  </li>
-  <li>
-    <p>java:comp/env/BeanManager for containers limited to that namespace, such as tomcat</p>
-  </li>
-</ul>
-
-<p>If your container of choice uses other naming references, the plugin has a single configuration option to point to the right name. Just add a constant like this to your struts.xml to be on the happy path again:</p>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-    &lt;constant name="struts.objectFactory.cdi.jndiKey" value="java:comp/some/weird/BeanManagerReference" /&gt;
-
-</code></pre>
-</div>
-
-<p>###Usage###</p>
-
-<p>CDI has an extremely rich feature set, and this section is not intended as a replacement for the CDI reference documentation or the excellent documentation found on the <a href="http://seamframework\.org/Weld">JBoss Weld</a>^[http://seamframework.org/Weld] homepage. The whole Struts 2 CDI integration works just as you would think it works, using JSR-299 and JSR-330 Annotations in your Struts 2 actions or interceptors. Be aware of the following, though:</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>CDI is designed to act in a type safe and modern way, thus using annotations for all aspects of the framework. Nevertheless, you are allowed to eternalize configuration into a XML file called beans.xml to be placed in your WEB-INF directory. Even if you don’t intend to use such external configuration, it is an <strong>inevitable requirement to provide at least an empty beans.xml in WEB-INF !</strong></td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Example Usage####</p>
-
-<p>Implement your Struts 2 actions or interceptors just as usual, enriched with CDI and @Inject annotations:</p>
-
-<p><strong>NumberGuess.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package org.apache.struts2.example.cdi;
-
-import com.opensymphony.xwork2.ActionSupport;
-import javax.inject.Inject;
-
-public class NumberGuess extends ActionSupport {
-
-    @Inject
-    Game game;
-
-    public Game getGame() {
-        return game;
-    }
-
-    @Override
-    public String execute() throws Exception {
-        return SUCCESS;
-    }
-
-    public String guess() throws Exception {
-        final String errorMessage = game.check();
-        addActionError(errorMessage);
-
-        if (Game.CORRECT.equals(errorMessage)) {
-            game.reset();
-        } else if (game.getRemainingGuesses() == 0) {
-            addActionError("The correct guess was " + game.getGuess() + ". Game is reset.");
-            game.reset();
-        }
-
-
-        return SUCCESS;
-    }
-
-
-}
-
-</code></pre>
-</div>
-
-<p>See the @Inject annotation from javax.inject.Inject? While you could use all the other nice stuff, we usually would - following the separation of concerns principle - use @Inject most of the time only in our actions, keeping the more fancy stuff in the business layer as shown below. Using @Inject brings us to the most common pitfall when using Struts 2 together with JSR-330 / CDI:</p>
-
-<p><strong>(i) Use the right @Inject</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Struts 2 and it’s core component XWork use it’s own internal dependency injection container. Interestingly, you could name it JSR-330’s grandma, since it is an early pre-release version of <a href="http://code\.google\.com/p/google\-guice/">Google Guice</a>^[http://code.google.com/p/google-guice/] once developed by <a href="http://blog\.crazybob\.org/">Crazybob Lee</a>^[http://blog.crazybob.org/] - the same Bob Lee that, together with SpringSource’s Rod Johnson, lead the JSR-330 spe [...]
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>That said, you will find the @Inject annotation both as com.opensymphony.xwork2.inject.Inject and javax.inject.Inject. <strong>Don’t mix up those two - javax.inject.Inject is the one you want to use with your Struts 2 CDI plugin and CDI integration in general!</strong> While you could use Struts’ internal annotation as well, the effect may be strange to undefined - so check your imports!</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour. Add a JSP view similar to this:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-<span class="err">&lt;</span>%@ page contentType="text/html; charset=UTF-8" %&gt;
-<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>Numberguess<span class="nt">&lt;/title&gt;</span>
-<span class="nt">&lt;/head&gt;</span>
-
-<span class="nt">&lt;body&gt;</span>
-<span class="nt">&lt;h2&gt;</span>Numberguess Game - Struts 2 CDI Example<span class="nt">&lt;/h2&gt;</span>
-
-<span class="nt">&lt;h3&gt;</span>I've picked a number between <span class="nt">&lt;s:property</span> <span class="na">value=</span><span class="s">"game.smallest"</span><span class="nt">/&gt;</span> and <span class="nt">&lt;s:property</span> <span class="na">value=</span><span class="s">"game.biggest"</span><span class="nt">/&gt;</span>.
-    You have <span class="nt">&lt;s:property</span> <span class="na">value=</span><span class="s">"game.remainingGuesses"</span><span class="nt">/&gt;</span>remaining guesses.<span class="nt">&lt;/h3&gt;</span>
-
-<span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"guess"</span><span class="nt">&gt;</span>
-    <span class="nt">&lt;s:textfield</span> <span class="na">name=</span><span class="s">"game.guess"</span> <span class="na">label=</span><span class="s">"Your Guess"</span><span class="nt">/&gt;</span>
-    <span class="nt">&lt;s:submit/&gt;</span>
-<span class="nt">&lt;/s:form&gt;</span>
-<span class="nt">&lt;p/&gt;</span>
-<span class="nt">&lt;s:actionerror/&gt;</span>
-
-<span class="nt">&lt;/body&gt;</span>
-<span class="nt">&lt;/html&gt;</span>
-
-</code></pre>
-</div>
-
-<p>along - if not using the fabulous and recommended Struts 2 <a href="#PAGE_105613">Convention Plugin</a> - with a struts.xml like this</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-<span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-<span class="cp">&lt;!DOCTYPE struts PUBLIC
-          "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"       
-          "http://struts.apache.org/dtds/struts-2.3.dtd"&gt;</span>
-<span class="nt">&lt;struts&gt;</span>
-  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.enable.DynamicMethodInvocation"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
-  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.devMode"</span> <span class="na">value=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
-  
-    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"numberguess"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
-
-        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"NumberGuess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span><span class="nt">&gt;</span>
-            <span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
-        <span class="nt">&lt;/action&gt;</span>
-
-        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"guess"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.example.cdi.NumberGuess"</span> <span class="na">method=</span><span class="s">"guess"</span><span class="nt">&gt;</span>
-            <span class="nt">&lt;result&gt;</span>/WEB-INF/pages/NumberGuess.jsp<span class="nt">&lt;/result&gt;</span>
-        <span class="nt">&lt;/action&gt;</span>
-
-    <span class="nt">&lt;/package&gt;</span>
-
-<span class="nt">&lt;/struts&gt;</span>
-
-</code></pre>
-</div>
-
-<p>Now you can add the business logic we want to be managed and injected by CDI. Start with two qualifier annotations:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package org.apache.struts2.example.cdi;
-
-import javax.inject.Qualifier;
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-@Target( { TYPE, METHOD, PARAMETER, FIELD })
-@Retention(RUNTIME)
-@Documented
-@Qualifier
-public @interface Random {}
-
-</code></pre>
-</div>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package org.apache.struts2.example.cdi;
-
-import javax.inject.Qualifier;
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-@Target( { TYPE, METHOD, PARAMETER, FIELD })
-@Retention(RUNTIME)
-@Documented
-@Qualifier
-public @interface MaxNumber {}
-
-</code></pre>
-</div>
-
-<p>Now on to the actual business beans, the Game and the Generator bean:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package org.apache.struts2.example.cdi;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.inject.Instance;
-import javax.inject.Inject;
-import javax.inject.Named;
-import java.io.Serializable;
-
-@Named
-@SessionScoped
-public class Game implements Serializable {
-
-    public static final String CORRECT = "Correct !!!";
-    public static final String WRONG = "Sorry, wrong number !!!";
-
-    private int number;
-    private int guess;
-    private int smallest;
-
-    @MaxNumber
-    @Inject
-    private int maxNumber;
-
-    private int biggest;
-    private int remainingGuesses;
-
-    @Random
-    @Inject
-    Instance&lt;Integer&gt; randomNumber;
-
-    public Game() {
-    }
-
-    public int getNumber() {
-        return number;
-    }
-
-    public int getGuess() {
-        return guess;
-    }
-
-    public void setGuess( int guess ) {
-        this.guess = guess;
-    }
-
-    public int getSmallest() {
-        return smallest;
-    }
-
-    public int getBiggest() {
-        return biggest;
-    }
-
-    public int getRemainingGuesses() {
-        return remainingGuesses;
-    }
-
-    public String check() throws InterruptedException {
-        if (guess &gt; number) {
-            biggest = guess - 1;
-        }
-        if (guess &lt; number) {
-            smallest = guess + 1;
-        }
-        if (guess == number) {
-            return CORRECT;
-        }
-        remainingGuesses--;
-        return WRONG;
-    }
-
-    @PostConstruct
-    public void reset() {
-        this.smallest = 0;
-        this.guess = 0;
-        this.remainingGuesses = 10;
-        this.biggest = maxNumber;
-        this.number = randomNumber.get();
-    }
-
-}
-
-</code></pre>
-</div>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package org.apache.struts2.example.cdi;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import java.io.Serializable;
-
-@ApplicationScoped
-public class Generator implements Serializable {
-   
-   private java.util.Random random = new java.util.Random( System.currentTimeMillis() );
-   
-   private int maxNumber = 100;
-   
-   java.util.Random getRandom() {
-      return random;
-   }
-   
-   @Produces @Random int next() { 
-      return getRandom().nextInt(maxNumber); 
-   }
-   
-   @Produces @MaxNumber int getMaxNumber() {
-      return maxNumber;
-   }
-
-} 
-
-</code></pre>
-</div>
-
-<p>If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural language oriented way the CDI stack works. If neither of this is the case, now it’s time to check the CDI and Weld documentation. Remember, this is a trivial example - there is much more to know about CDI.</p>
-
-<p>Ready you are now - use the Force!</p>
-
-<p>##Codebehind Plugin## {#PAGE_29637}</p>
-
-<p><strong>(!) Deprecated Plugin</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Since 2.1 this plugin has been deprecated in favor of the <a href="#PAGE_105613">Convention Plugin</a>. See <a href="#PAGE_106500">this page</a> for details on how to port your application to the Convention plugin.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>The Codebehind Plugin</p>
-
-<p>reduces mundane configuration by adding “Page Controller” conventions</p>
-
-<p>There are two common situations where the plugin applies convention over configuration:</p>
-
-<ol>
-  <li>
-    <p><strong>Default mappings</strong> - (or “pages with no mappings”) These are cases where the page is mostly static and doesn’t require an Action class to execute logic.  Common examples are index pages and those that heavily use JSP tags or JSF components.</p>
-  </li>
-  <li>
-    <p><strong>Default results</strong> - The purpose of most Actions is to execute code to prepare the data for a specific page. The name of this page is often the same as the Action itself.</p>
-  </li>
-</ol>
-
-<p>To improve the first case, the plugin will detect the presence of a page with no corresponding Struts mapping and automatically substitute a mapping that uses the default Action class for the package, which is usually ActionSupport, a NO-OP Action.</p>
-
-<p>For the problem of default results, the plugin will make it unnecessary to define those results by detecting the presence of a page for that Action and creating the appropriate configuration on-the-fly.</p>
-
-<p>In these two ways, the plugin encourages a page-based development style, handling the linking of Struts actions with pages and pages with Results in a common way.</p>
-
-<p>(ok)  To see the plugin in action, review the “Person Manager” example in the Showcase application.</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Provides default mappings for pages that don’t have Actions</p>
-  </li>
-  <li>
-    <p>Provides default results by auto-discovering pages</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To use this plugin, simply copy its jar into your application.  The plugin can be used to find default mappings and results.</p>
-
-<p>#####Default Mappings#####</p>
-
-<p>To better facilitate a code-behind development approach, the plugin will detect the case where the request has no defined Struts action mapping, yet there exists a corresponding page.  It will then create a dummy action mapping referencing the default Action class (usually ActionSupport), allowing the page to be displayed normally.  Additionally, the default interceptor stack for the configured package will be applied, bringing the workflow benefits of interceptor stacks to simple pages.</p>
-
-<p>When no explicitly configured Action can be found for a request, the plugin searches the web application for a likely page. Specifically, the following pattern is used to locate a page:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/NAMESPACE/ACTION.(jsp|vm|ftl)
-</code></pre>
-</div>
-
-<p>For example, if the request is for</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>http://www.company.com/myapp/member/login.action
-</code></pre>
-</div>
-<p>, the plugin will look for the following pages, in this order:</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.jsp
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.vm
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.ftl
-</code></pre>
-</div>
-
-<p>If any of those pages are found, the plugin will construct an ActionConfig object on the fly, using the ActionSupport class for the Action and a single Result that points to the discovered page.  The ActionConfig will be put in the configured package, meaning that it will inherit the default Interceptor stack for that package.  The default package is</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>codebehind-default
-</code></pre>
-</div>
-<p>, however, it can be configured in any <em>configuration file</em>  via the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.codebehind.defaultPackage
-</code></pre>
-</div>
-<p>constant.</p>
-
-<p>#####Default Results#####</p>
-
-<p>In many applications, a majority of Results could have the same root name as the action mapping.  To reduce this unnecessary configuration, the Struts plugin will try to guess the appropriate Result, if none is explicitly configured.  This technique works for any result code, including</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>success
-</code></pre>
-</div>
-<p>. When combined with the <em>Zero Configuration</em>  style, the amount of configuration in an application dwindles to next to nothing.</p>
-
-<p>When no explicitly configured Result is found for an Action’s result code, the plugin, again, searches the web application for a matching page. Specifically, the following patterns, in the following order, are used to locate a page:</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/NAMESPACE/ACTION-RESULT_CODE.(jsp|vm|ftl)
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/NAMESPACE/ACTION.(jsp|vm|ftl)
-</code></pre>
-</div>
-
-<p>These two patterns are searched for each of the three default page extensions: jsp, vm, and ftl.  For example, if the request is for</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>http://www.company.com/myapp/member/login.action
-</code></pre>
-</div>
-<p>, so that the action name is</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>login
-</code></pre>
-</div>
-<p>and the namespace is</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>member
-</code></pre>
-</div>
-<p>, and the Action class returned a code of</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>success
-</code></pre>
-</div>
-<p>, the plugin will look for the following pages, in this order:</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login-success.jsp
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.jsp
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login-success.vm
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.vm
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login-success.ftl
-</code></pre>
-</div>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/member/login.ftl
-</code></pre>
-</div>
-
-<p>If any of those pages are found, the appropriate Result will be constructed and processed.</p>
-
-<p>#####Settings#####</p>
-
-<p>The following settings can be customized.  See the <a href="http://cwiki\.apache\.org/confluence/display/WW/Configuration\+Files">developer guide</a>^[http://cwiki.apache.org/confluence/display/WW/Configuration+Files].</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.codebehind.defaultPackage</td>
-      <td>The default package to use for created Action mappings</td>
-      <td>codebehind-default</td>
-      <td>Any existing package name</td>
-    </tr>
-    <tr>
-      <td>struts.configuration.classpath.disableActionScanning</td>
-      <td>Whether to disable scanning the classpath for Action classes or not</td>
-      <td>false</td>
-      <td>true or false</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>##Config Browser Plugin## {#PAGE_44185}</p>
-
-<p>The Config Browser Plugin is</p>
-
-<p>a simple tool to help view an application’s configuration at runtime</p>
-
-<p>This plugin should be used only during development phase and access to it should be strictly restricted!</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Browsable view of loaded configuration</p>
-  </li>
-  <li>
-    <p>Shows all accessible action URLs</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To use the plugin, simply copy the jar into your application.  Once installed, you can access the tool by opening to the action named <em>index</em>  in the <em>config-browser</em>  namespace.</p>
-
-<p>(information) In most cases (if you are using the default <em>ActionMapper</em> ), the URL is something like <a href="http://localhost:8080/starter/config\-browser/index\.action">http://localhost:8080/starter/config-browser/index.action</a> or <a href="http://localhost:8080/starter/config\-browser/index">http://localhost:8080/starter/config-browser/index</a>.</p>
-
-<p>#####Example#####</p>
-
-<p><img src="/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att30966155\_config\-browser\-example\.png" alt="config-browser-example.png" /></p>
-
-<p>#####Settings#####</p>
-
-<p>This plugin provides no customizable settings.</p>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>##Convention Plugin## {#PAGE_105613}</p>
-
-<p>This page is DEPRECATED, please refer to the new source <a href="http://struts\.apache\.org/plugins/convention/">http://struts.apache.org/plugins/convention/</a></p>
-
-<blockquote>
-
-</blockquote>
-
-<p>###Introduction###</p>
-
-<p>The Convention Plugin is bundled with Struts since 2.1 and replaces the <a href="#PAGE_29637">Codebehind Plugin</a> and Zero Config plugins. It provides the following features:</p>
-
-<ul>
-  <li>
-    <p>Action location by package naming conventions</p>
-  </li>
-  <li>
-    <p>Result (JSP, FreeMarker, etc) location by naming conventions</p>
-  </li>
-  <li>
-    <p>Class name to URL naming convention</p>
-  </li>
-  <li>
-    <p>Package name to namespace convention</p>
-  </li>
-  <li>
-    <p>SEO compliant URLs (i.e. my-action rather than MyAction)</p>
-  </li>
-  <li>
-    <p>Action name overrides using annotations</p>
-  </li>
-  <li>
-    <p>Interceptor overrides using annotations</p>
-  </li>
-  <li>
-    <p>Namespace overrides using annotations</p>
-  </li>
-  <li>
-    <p>XWork package overrides using annotations</p>
-  </li>
-  <li>
-    <p>Default action and result handling (i.e. /products will try com.example.actions.Products as well as com.example.actions.products.Index)</p>
-  </li>
-</ul>
-
-<p>The Convention Plugin should require no configuration to use. Many of the conventions can be controlled using configuration properties and many of the classes can be extended or overridden.</p>
-
-<p>###Setup###</p>
-
-<p>In order to use the Convention plugin, you first need to add the JAR file to the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/lib
-</code></pre>
-</div>
-<p>directory of your application or include the dependency in your project’s Maven POM file.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-    &lt;artifactId&gt;struts2-convention-plugin&lt;/artifactId&gt;
-    &lt;version&gt;X.X.X&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>Where X.X.X is the current version of Struts 2. Please remember that the Convention Plugin is available from version 2.1.6.</p>
-
-<p>###Converting a Codebehind based application to Convention###</p>
-
-<p>See <a href="#PAGE_106500">this page</a> for the required changes and tips.</p>
-
-<p>If you are using REST with the Convention plugin, make sure you set these constants in struts.xml:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.action.suffix" value="Controller"/&gt;
-&lt;constant name="struts.convention.action.mapAllMatches" value="true"/&gt;
-&lt;constant name="struts.convention.default.parent.package" value="rest-default"/&gt;
-
-</code></pre>
-</div>
-
-<p>###Hello world###</p>
-
-<p>Now that the Convention plugin has been added to your application, let’s start with a very simple example. This example will use an actionless result that is identified by the URL. By default, the Convention plugin assumes that all of the results are stored in <strong>WEB-INF/content</strong>. This can be changed by setting the property</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.result.path
-</code></pre>
-</div>
-<p>in the Struts properties file to the new location. Don’t worry about trailing slashes, the Convention plugin handles this for you. Here is our hello world JSP:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;html&gt;</span>
-<span class="nt">&lt;body&gt;</span>
-Hello world!
-<span class="nt">&lt;/body&gt;</span>
-<span class="nt">&lt;/html&gt;</span>
-
-</code></pre>
-</div>
-
-<p>If you start Tomcat (or whichever J2EE container you are using) and type in <a href="http://localhost:8080/hello\-world">http://localhost:8080/hello-world</a> (assuming that your context path is “</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/
-</code></pre>
-</div>
-<p>”, ie. starting application from Eclipse) into your browser you should get this result:</p>
-
-<p><strong>WEB-INF/content/hello-world.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>Hello world!
-
-</code></pre>
-</div>
-
-<p>This illustrates that the Convention plugin will find results even when no action exists and it is all based on the URL passed to Struts.</p>
-
-<p>###Code behind hello world###</p>
-
-<p>Let’s expand on this example and add a code behind class. In order to do this we need to ensure that the Convention plugin is able to find our action classes. By default, the Convention plugin will find all action classes that implement</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.opensymphony.xwork2.Action
-</code></pre>
-</div>
-<p>or whose name ends with the word <strong>Action</strong> in specific packages.</p>
-
-<p>These packages are located by the Convention plugin using a search methodology. First the Convention plugin finds packages named</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts
-</code></pre>
-</div>
-<p>,</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts2
-</code></pre>
-</div>
-<p>,</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>action
-</code></pre>
-</div>
-<p>or</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>actions
-</code></pre>
-</div>
-<p>. Any packages that match those names are considered the root packages for the Convention plugin. Next, the plugin looks at all of the classes in those packages as well as sub-packages and determines if the classes implement</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.opensymphony.xwork2.Action
-</code></pre>
-</div>
-<p>or if their name ends with <strong>Action</strong> (i.e. FooAction). Here’s an example of a few classes that the Convention plugin will find:</p>
-
-<p><strong>Classes</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.example.actions.MainAction
-com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)
-com.example.struts.company.details.ShowCompanyDetailsAction
-
-</code></pre>
-</div>
-
-<p>Each of the action classes that the plugin finds will be configured to respond to specific URLs. The URL is based on the package name that the class is defined in and the class name itself. First the plugin determines the namespace of the URL using the package names between the root package and the package the class is defined in. For our examples above, the namespaces would be:</p>
-
-<p><strong>Namespaces</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.example.actions.MainAction -&gt; /
-com.example.actions.products.Display -&gt; /products
-com.example.struts.company.details.ShowCompanyDetailsAction -&gt; /company/details
-
-</code></pre>
-</div>
-
-<p>Next, the plugin determines the URL of the resource using the class name. It first removes the word <strong>Action</strong> from the end of the class name and then converts camel case names to dashes. In our example the full URLs would be:</p>
-
-<p><strong>Full URLs</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.example.actions.MainAction -&gt; /main
-com.example.actions.products.Display -&gt; /products/display
-com.example.struts.company.details.ShowCompanyDetailsAction -&gt; /company/details/show-company-details
-
-</code></pre>
-</div>
-
-<p>You can tell the Convention plugin to ignore certain packages using the property</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.exclude.packages
-</code></pre>
-</div>
-<p>. You can also tell the plugin to use different strings to locate root packages using the property</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.package.locators
-</code></pre>
-</div>
-<p>. Finally, you can tell the plugin to search specific root packages using the property</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.action.packages
-</code></pre>
-</div>
-<p>.</p>
-
-<p>Here is our code behind action class:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-
-public class HelloWorld extends ActionSupport {
-  private String message;
-
-  public String getMessage() {
-    return message;
-  }
-
-  public String execute() {
-    message = "Hello World!";
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>If you compile this class and place it into your application in the WEB-INF/classes, the Convention plugin will find the class and map the URL <strong>/hello-world</strong> to it. Next, we need to update our JSP to print out the message we setup in the action class. Here is the new JSP:</p>
-
-<p><strong>WEB-INF/content/hello-world.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;html&gt;</span>
-<span class="nt">&lt;body&gt;</span>
-The message is ${message}
-<span class="nt">&lt;/body&gt;</span>
-<span class="nt">&lt;/html&gt;</span>
-
-</code></pre>
-</div>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Please notice that the expression ${message}  will work without adding JSP directive isELIgnored=”false”.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p> </p>
-
-<p>If start up the application server and open up <a href="http://localhost:8080/hello\-world">http://localhost:8080/hello-world</a> in our browser, we should get this result:</p>
-
-<p><strong>Result</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>The message is Hello World!
-
-</code></pre>
-</div>
-
-<p>###Results and result codes###</p>
-
-<p>The Convention Plugin will pre-configure all of you action classes when Struts is started. By default, this configuration will also contain results for any JSPs that it can find within the application. The JSPs have an additional feature that allows different JSPs to be used based on the result code of the action. Since action methods return Strings and these Strings are traditionally used to locate results for the action, the Convention plugin allows you to define different results b [...]
-
-<p>Building on our example from above, let’s say we want to provide a different result if the result code from our action is the String</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>zero
-</code></pre>
-</div>
-<p>rather than</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>success
-</code></pre>
-</div>
-<p>. First, we update the action class to return different result codes:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-
-public class HelloWorld extends ActionSupport {
-  private String message;
-
-  public String getMessage() {
-    return message;
-  }
-
-  public String execute() {
-    if (System.currentTimeMillis() % 2 == 0) {
-      message = "It's 0";
-      return "zero";
-    }
-
-    message = "It's 1";
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>Next, we add a new JSP to the application named</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/content/hello-world-zero.jsp
-</code></pre>
-</div>
-<p>. Notice that the first part of the file name is the same as the URL of the action and the last part of the name is the result code. This is the convention that the plugin uses to determine which results to render. Here is our new JSP:</p>
-
-<p><strong>WEB-INF/content/hello-world.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;html&gt;</span>
-<span class="nt">&lt;body&gt;</span>
-The error message is ${message}
-<span class="nt">&lt;/body&gt;</span>
-<span class="nt">&lt;/html&gt;</span>
-
-</code></pre>
-</div>
-
-<p>Now, if you compile the action and restart the application, based on the current time, you’ll either see the result from</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/content/hello-world.jsp
-</code></pre>
-</div>
-<p>or</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/content/hello-world-zero.jsp
-</code></pre>
-</div>
-<p>.</p>
-
-<p>The result type is based on the extension of the file. The supported extensions are: jsp,ftl,vm,html,html. Examples of Action and Result to Template mapping:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>URL</th>
-      <th>Result</th>
-      <th>File that could match</th>
-      <th>Result Type</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>/hello</td>
-      <td>success</td>
-      <td>/WEB-INF/content/hello.jsp</td>
-      <td>Dispatcher</td>
-    </tr>
-    <tr>
-      <td>/hello</td>
-      <td>success</td>
-      <td>/WEB-INF/content/hello-success.htm</td>
-      <td>Dispatcher</td>
-    </tr>
-    <tr>
-      <td>/hello</td>
-      <td>success</td>
-      <td>/WEB-INF/content/hello.ftl</td>
-      <td>FreeMarker</td>
-    </tr>
-    <tr>
-      <td>/hello-world</td>
-      <td>input</td>
-      <td>/WEB-INF/content/hello-world-input.vm</td>
-      <td>Velocity</td>
-    </tr>
-    <tr>
-      <td>/test1/test2/hello</td>
-      <td>error</td>
-      <td>/WEB-INF/content/test/test2/hello-error.html</td>
-      <td>Dispatcher</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Multiple names#####</p>
-
-<p>It is possible to define multiple names for the same result:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@Action(results = {
-    @Result(name={"error", "input"}, location="input-form.jsp"),
-    @Result(name="success", location="success.jsp")
-})
-</code></pre>
-</div>
-
-<p>Such functionality was added in Struts 2.5</p>
-
-<p>###Chaining###</p>
-
-<p>If one action returns the name of another action in the same package, they will be chained together, if the first action doesn’t have any result defined for that code. In the following example:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.Action;
-import com.opensymphony.xwork2.ActionSupport;
-
-public class HelloAction extends ActionSupport {
-    @Action("foo")
-    public String foo() {
-        return "bar";
-    }
-
-    @Action("foo-bar")
-    public String bar() {
-        return SUCCESS;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>The “foo” action will be executed, because no result is found, the Convention plugin tries to find an action named “foo-bar” on the same package where “foo” is defined. If such an action is found, it will be invoked using the “chain” result.</p>
-
-<p>###XWork packages###</p>
-
-<p>Actions are placed on a custom XWork package which prevents conflicts. The name of this package is based on the Java package the action is defined in, the namespace part of the URL for the action and the parent XWork package for the action. The parent XWork package is determined based on the property named</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.default.parent.package
-</code></pre>
-</div>
-<p>(defaults to</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>convention-default
-</code></pre>
-</div>
-<p>), which is a custom XWork package that extends</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-default
-</code></pre>
-</div>
-<p>.</p>
-
-<p>Therefore the naming for XWork packages used by the Convention plugin are in the form:</p>
-
-<p><strong>XWork package naming</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;java-package&gt;#&lt;namespace&gt;#&lt;parent-package&gt;
-
-</code></pre>
-</div>
-
-<p>Using our example from above, the XWork package for our action would be:</p>
-
-<p><strong>XWork package naming</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.example.actions#/#conventionDefault
-
-</code></pre>
-</div>
-
-<p>###Annotation reference###</p>
-
-<p>The Convention plugin uses a number of different annotations to override the default conventions that are used to map actions to URLs and locate results. In addition, you can modify the parent XWork package that actions are configured with.</p>
-
-<p>####Action annotation####</p>
-
-<p>The Convention plugin allows action classes to change the URL that they are mapped to using the <strong>Action</strong> annotation. This annotation can also be used inside the <strong>Actions</strong> annotation to allow multiple URLs to map to a single action class. This annotation must be defined on action methods like this:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-
-public class HelloWorld extends ActionSupport {
-  @Action("/different/url")
-  public String execute() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>Our action class will now map to the URL</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/different/url
-</code></pre>
-</div>
-<p>rather than</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/hello-world
-</code></pre>
-</div>
-<p>. If no</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@Result
-</code></pre>
-</div>
-<p>(see next section) is specified, then the namespace of the action will be used as the path to the result, on our last example it would be</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/content/different/url.jsp
-</code></pre>
-</div>
-<p>.</p>
-
-<p>A single method within an action class can also map to multiple URLs using the <strong>Actions</strong> annotation like this:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-
-public class HelloWorld extends ActionSupport {
-  @Actions({
-    @Action("/different/url"),
-    @Action("/another/url")
-  })
-  public String execute() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>Another usage of the <strong>Action</strong> or <strong>Actions</strong> annotation is to define multiple action methods within a single action class, each of which respond to a different URL. Here is an example of multiple action methods:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-
-public class HelloWorld extends ActionSupport {
-  @Action("/different/url")
-  public String execute() {
-    return SUCCESS;
-
-
-  }
-
-  @Action("url")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>The previous example defines a second URL that is not fully qualified. This means that the namespace for the URL is determined using the Java package name rather than the Action annotation.</p>
-
-<p>Interceptor and interceptor stacks can be specified using the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>interceptorRefs
-</code></pre>
-</div>
-<p>attribute. The following example applies the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>validation
-</code></pre>
-</div>
-<p>interceptor and the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>defaultStack
-</code></pre>
-</div>
-<p>interceptor stack to the action:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-
-public class HelloWorld extends ActionSupport {
-  @Action(interceptorRefs={@InterceptorRef("validation"), @InterceptorRef("defaultStack")})
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action("url")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>Parameters can be passed to results using the <strong>params</strong> attribute. The value of this attribute is a string array with an even number of elements in the form {“key0”, “value0, “key1”, “value1” ... “keyN”, “valueN”}. For example:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-
-public class HelloWorld extends ActionSupport {
-  @Action(interceptorRefs=@InterceptorRef(value="validation",params={"programmatic", "false", "declarative", "true}))
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action("url")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>If interceptors are not specified, the default stack is applied.</p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>You can specify className parameter which can be especially useful when Spring Framework is used to instantiate actions.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>#####Applying @Action and @Actions at the class level#####</p>
-
-<p>There are circumstances when this is desired, like when using <em>Dynamic Method Invocation</em> . If an</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>execute
-</code></pre>
-</div>
-<p>method is defined in the class, then it will be used for the action mapping, otherwise the method to be used will be determined when a request is made (by Dynamic Method Invocation for example)</p>
-
-<p>####InterceptorRef annotation####</p>
-
-<p>Interceptors can be specified at the method level, using the <strong>Action</strong> annotation or at the class level using the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>InterceptorRefs
-</code></pre>
-</div>
-<p>annotation. Interceptors specified at the class level will be applied to all actions defined on that class. In the following example:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-
-@InterceptorRefs({
-    @InterceptorRef("interceptor-1"),
-    @InterceptorRef("defaultStack")
-})
-public class HelloWorld extends ActionSupport {
-  @Action(value="action1", interceptorRefs=@InterceptorRef("validation"))
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action(value="action2")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>The following interceptors will be applied to “action1”:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>interceptor-1
-</code></pre>
-</div>
-<p>, all interceptors from</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>defaultStack
-</code></pre>
-</div>
-<p>,</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>validation
-</code></pre>
-</div>
-<p>.
- All interceptors from</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>defaultStack
-</code></pre>
-</div>
-<p>will be applied to “action2”.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>If you get errors like “Unable to find interceptor class referenced by ref-name XYZ”. This means that the package where Convention is placing your actions, does not extend the package where the interceptor is defined. To fix this problem either 1)Use @ParentPackage annotation(or struts.convention.default.parent.package) passing the name of the package that defines the interceptor, or 2) Create a package in XML that extends the package that defines the interceptor, and use @Pare [...]
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Result annotation####</p>
-
-<p>The Convention plugin allows action classes to define different results for an action. Results fall into two categories, global and local. Global results are shared across all actions defined within the action class. These results are defined as annotations on the action class. Local results apply only to the action method they are defined on. Here is an example of the different types of result annotations:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-import org.apache.struts2.convention.annotation.Result;
-import org.apache.struts2.convention.annotation.Results;
-
-@Results({
-  @Result(name="failure", location="fail.jsp")
-})
-public class HelloWorld extends ActionSupport {
-  @Action(value="/different/url",
-    results={@Result(name="success", location="http://struts.apache.org", type="redirect")}
-  )
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action("/another/url")
-
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>Parameters can be passed to results using the <strong>params</strong> attribute. The value of this attribute is a string array with an even number of elements in the form {“key0”, “value0, “key1”, “value1” ... “keyN”, “valueN”}. For example:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Actions;
-import org.apache.struts2.convention.annotation.Result;
-import org.apache.struts2.convention.annotation.Results;
-
-public class HelloWorld extends ActionSupport {
-  @Action(value="/different/url",
-    results={@Result(name="success", type="httpheader", params={"status", "500", "errorMessage", "Internal Error"})}
-  )
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action("/another/url")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>From 2.1.7 on, global results (defined on the class level) defined using annotations will be inherited. Child classes can override the inherited result(s) by redefining it. Also, results defined at the method level take precedence (overwrite), over results with the same name at the action level.</p>
-
-<p>####Namespace annotation####</p>
-
-<p>The namespace annotation allows the namespace for action classes to be changed instead of using the convention of the Java package name. This annotation can be placed on an action class or within the package-info.java class that allows annotations to be placed on Java packages. When this annotation is put on an action class, it applies to all actions defined in the class, that are not fully qualified action URLs. When this annotation is place in the package-info.java file, it changes  [...]
-
-<p><strong>com.example.actions.HelloWorl</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.Namespace;
-
-@Namespace("/custom")
-public class HelloWorld extends ActionSupport {
-  @Action("/different/url")
-  public String execute() {
-    return SUCCESS;
-  }
-
-  @Action("url")
-  public String doSomething() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>In this example, the action will respond to two different URLs</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/different/url
-</code></pre>
-</div>
-<p>and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/custom/url
-</code></pre>
-</div>
-<p>.</p>
-
-<p>Here is an example of using this annotation in the package-info.java file:</p>
-
-<p><strong>com/example/actions/package-info.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@org.apache.struts2.convention.annotation.Namespace("/custom")
-package com.example.actions;
-
-</code></pre>
-</div>
-
-<p>This changes the default namespace for all actions defined in the package</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.example.actions
-</code></pre>
-</div>
-<p>. This annotation however doesn’t apply to sub-packages.</p>
-
-<p>####ResultPath annotation####</p>
-
-<p>The ResultPath annotation allows applications to change the location where results are stored. This annotation can be placed on an action class and also in the package-info.java file. Here is an example of using this annotation:</p>
-
-<p><strong>com.example.actions.HelloWorl</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.ResultPath;
-
-@ResultPath("/WEB-INF/jsps")
-public class HelloWorld extends ActionSupport {
-  public String execute() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>The result for this class will be located in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/jsps
-</code></pre>
-</div>
-<p>rather than the default of</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/content
-</code></pre>
-</div>
-<p>.</p>
-
-<p>####ParentPackage annotation####</p>
-
-<p>The ParentPackage annotation allows applications to define different parent Struts package for specific action classes or Java packages. Here is an example of using the annotation on an action class:</p>
-
-<p><strong>com.example.actions.HelloWorld</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package com.example.actions;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Action;
-import org.apache.struts2.convention.annotation.ParentPackage;
-
-@ParentPackage("customXWorkPackage")
-public class HelloWorld extends ActionSupport {
-  public String execute() {
-    return SUCCESS;
-  }
-}
-
-</code></pre>
-</div>
-
-<p>To apply this annotation to all actions in a package (and subpackages), add it to package-info.java. An alternative to this annotation is to set</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.default.parent.package
-</code></pre>
-</div>
-<p>in XML.</p>
-
-<p>####ExceptionMapping Annotation####</p>
-
-<p>This annotation can be used to define exception mappings to actions. See the <em>exception mapping documentation</em>  for more details. These mappings can be applied to the class level, in which case they will be applied to all actions defined on that class:</p>
-
-<p><strong>ExceptionsActionLevelAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@ExceptionMappings({
-    @ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
-})
-public class ExceptionsActionLevelAction {
-
-    public String execute() throws Exception {
-        return null;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>The parameters defined by</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>params
-</code></pre>
-</div>
-<p>are passed to the result. Exception mappings can also be applied to the action level:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>public class ExceptionsMethodLevelAction {
-    @Action(value = "exception1", exceptionMappings = {
-            @ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
-    })
-    public String run1() throws Exception {
-        return null;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>###Actions in jar files###</p>
-
-<p>By default the Convention plugin will <strong>not</strong> scan jar files for actions. For a jar to be scanned, its URL needs to match at least one of the regular expressions in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.action.includeJars
-</code></pre>
-</div>
-<p>. In this example</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>myjar1.jar
-</code></pre>
-</div>
-<p>and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>myjar2.jar
-</code></pre>
-</div>
-<p>will be scanned:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.action.includeJars" value=".*?/myjar1.*?jar(!/)?,.*?/myjar2*?jar(!/)?"
-
-</code></pre>
-</div>
-
-<p>Note that <strong>the regular expression will be evaluated against the URL of the jar, and not the file name</strong>, the jar URL can contain a path to the jar file and a trailing “!/”.</p>
-
-<p>###Automatic configuration reloading###</p>
-
-<p>The Convention plugin can automatically reload configuration changes, made in classes the contain actions, without restarting the container. This is a similar behavior to the automatic xml configuration reloading. To enable this feature, add this to your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>file:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.devMode" value="true"/&gt;
-&lt;constant name="struts.convention.classes.reload" value="true" /&gt;
-
-</code></pre>
-</div>
-
-<p>This feature is experimental and has not been tested on all container, and it is <strong>strongly</strong> advised not to use it in production environments.</p>
-
-<p>###JBoss###</p>
-
-<p>When using this plugin with JBoss, you need to set the following constants:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.exclude.parentClassLoader" value="true" /&gt;
-&lt;constant name="struts.convention.action.fileProtocols" value="jar,vfsfile,vfszip" /&gt;
-
-</code></pre>
-</div>
-
-<p>You can also check the <em>JBoss 5</em>  page for more details.</p>
-
-<p>###Jetty (embedded)###</p>
-
-<p>When using this plugin with Jetty in embedded mode, you need to set the following constants:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.exclude.parentClassLoader" value="false" /&gt;
-&lt;constant name="struts.convention.action.fileProtocols" value="jar,code-source" /&gt;
-
-</code></pre>
-</div>
-
-<p>###Troubleshooting###</p>
-
-<p>####Tips####</p>
-
-<p>Make sure the namespace of the action is matched by one of the locators. The rest of the namespace after the locator, will be the namespace of the action, and will be used to find the results. For example, a class called “ViewAction” in the package “my.example.actions.orders” will be mapped to the URL /orders/view.action, and the results must be under /WEB-INF/content/orders, like /WEB-INF/content/orders/view-success.jsp.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>Add the <a href="#PAGE_44185">Config Browser Plugin</a> plugin to the lib folder or maven dependencies, and then visit: <a href="http://localhost:8080/CONTEXT/config\-browser/index\.action">http://localhost:8080/CONTEXT/config-browser/index.action</a>, to see the current action mappings.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>The Convention plugin can generate a rather verbose output when set to debug mode for logging. Use “Trace” logging level if you are using the JDK logger. If you are using Log4J, you can do something like:</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>log4j.logger.org.apache.struts2.convention=DEBUG</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Common Errors####</p>
-
-<ol>
-  <li>I get an error like “There is no Action mapped for namespace /orders and action name view.”. This means that the URL</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/orders/view.action
-</code></pre>
-</div>
-<p>is not mapping to any action class. Check the namespace and the name of the action.</p>
-
-<ol>
-  <li>I get an error like “No result defined for action my.example.actions.orders.ViewAction and result success”. This means that the action was mapped to the right URL, but the Convention plugin was unable to find a</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>success
-</code></pre>
-</div>
-<p>result for it. Check that the result file exists, like</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/content/orders/view-success.jsp
-</code></pre>
-</div>
-<p>.</p>
-
-<ol>
-  <li>I get lots of errors like “java.lang.Exception: Could not load org/apache/velocity/runtime/resource/loader/ClasspathResourceLoader.class”. This happens when</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.action.includeJars
-</code></pre>
-</div>
-<p>is matching jar URLs from external jars.</p>
-
-<ol>
-  <li>I am using a custom interceptor stack and I get an error like “Unable to find interceptor class referenced by ref-name XYZ”. This means that the package where Convention is placing your actions, does not extend the package where the interceptor is defined. To fix this problem either 1)Use @ParentPackage annotation(or</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.default.parent.package
-</code></pre>
-</div>
-<p>) passing the name of the package that defines the interceptor, or 2) Create a package in XML that extends the package that defines the interceptor, and use @ParentPackage(or</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.convention.default.parent.package
-</code></pre>
-</div>
-<p>) to point to it.</p>
-
-<p>###Overwriting plugin classes###</p>
-
-<p>The Convention plugin can be extended in the same fashion that Struts does. The following beans are defined by default:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="org.apache.struts2.convention.PackageBasedActionConfigBuilder"/&gt;
-This interface defines how the action configurations for the current web application can be constructed. This must find all actions that are not specifically defined in the struts XML files or any plugins. Furthermore, it must make every effort to locate all action results as well.
-
-&lt;bean type="org.apache.struts2.convention.ActionNameBuilder" name="convention" class="org.apache.struts2.convention.SEOActionNameBuilder"/&gt;
-This interface defines the method that is used to create action names based on the name of a class.
-
-&lt;bean type="org.apache.struts2.convention.ResultMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultResultMapBuilder"/&gt;
-This interface defines how results are constructed for an Action. The action information is supplied and the result is a mapping of ResultConfig instances to the result name.
-
-&lt;bean type="org.apache.struts2.convention.InterceptorMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/&gt;
-This interface defines how interceptors are built from annotations.
-
-&lt;bean type="org.apache.struts2.convention.ConventionsService" name="convention" class="org.apache.struts2.convention.ConventionsServiceImpl"/&gt;
-This interface defines the conventions that are used by the convention plugin. In most cases the methods on this class will provide the best default for any values and also handle locating overrides of the default via the annotations that are part of the plugin.
-
-&lt;constant name="struts.convention.actionConfigBuilder" value="convention"/&gt;
-&lt;constant name="struts.convention.actionNameBuilder" value="convention"/&gt;
-&lt;constant name="struts.convention.resultMapBuilder" value="convention"/&gt;
-&lt;constant name="struts.convention.interceptorMapBuilder" value="convention"/&gt;
-&lt;constant name="struts.convention.conventionsService" value="convention"/&gt;
-
-</code></pre>
-</div>
-
-<p>To plugin a different implementation for one of these classes, implement the interface, define a bean for it, and set the appropriate constant’s value with the name of the new bean, for example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;bean type="org.apache.struts2.convention.ActionNameBuilder" name="MyActionNameBuilder" class="example.SultansOfSwingNameBuilder"/&gt;
-&lt;constant name="struts.convention.actionNameBuilder" value="MyActionNameBuilder"/&gt;
-
-</code></pre>
-</div>
-
-<p>###Configuration reference###</p>
-
-<p>Add a <strong>constant</strong> element to your struts config file to change the value of a configuration setting, like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.result.path" value="/WEB-INF/mytemplates/"/&gt;
-
-</code></pre>
-</div>
-
-<p>|Name|Default Value|Description|
-|—-|————-|———–|
-|struts.convention.action.alwaysMapExecute|true|Set to false, to prevent Convention from creating a default mapping to “execute” when there are other methods annotated as actions in the class|
-|struts.convention.action.includeJars| |Comma separated list of regular expressions of jar URLs to be scanned. eg. “.<strong>myJar-0\.2.</strong>,.<strong>thirdparty-0\.1.</strong>”|
-|struts.convention.action.packages| |An optional list of action packages that this should create configuration for (they don’t need to match a locator pattern)|
-|struts.convention.result.path|/WEB-INF/content/|Directory where templates are located|
-|struts.convention.result.flatLayout|true|If set to false, the result can be put in its own directory: resultsRoot/namespace/actionName/result.extension|
-|struts.convention.action.suffix|Action|Suffix used to find actions based on class names|
-|struts.convention.action.disableScanning|false|Scan packages for actions|
-|struts.convention.action.mapAllMatches|false|Create action mappings, even if no @Action is found|
-|struts.convention.action.checkImplementsAction|true|Check if an action implements com.opensymphony.xwork2.Action to create an action mapping|
-|struts.convention.default.parent.package|convention-default|Default parent package for action mappins|
-|struts.convention.action.name.lowercase|true|Convert action name to lowercase|
-|struts.convention.action.name.separator|-|Separator used to build the action name, MyAction -&gt; my-action. This character is also used as the separator between the action name and the result in templates, like action-result.jsp|
-|struts.convention.package.locators|action,actions,struts,struts2|Packages whose name end with one of these strings will be scanned for actions|
-|struts.convention.package.locators.disable|false|Disable the scanning of packages based on package locators|
-|struts.convention.exclude.packages|org.apache.struts.*, \
- org.apache.struts2.*, \
- org.springframework.web.struts.*, \
- org.springframework.web.struts2.*, \
- org.hibernate.*|Packages excluded from the action scanning, packages already excluded cannot be included in other way, eg. org.demo.actions.exclude is specified as a part of the struts.convention.exclude.packages so all packages below are also excluded, eg. org.demo.actions.exclude.include even if <strong>include</strong> is specified as a struts.convention.package.locators or struts.convention.action.packages|
-|struts.convention.package.locators.basePackage| |If set, only packages that start with its value will be scanned for actions|
-|struts.convention.relative.result.types|dispatcher,velocity,freemarker|The list of result types that can have locations that are relative and the result location (which is the resultPath plus the namespace) prepended to them|
-|struts.convention.redirect.to.slash|true|A boolean parameter that controls whether or not this will handle unknown actions in the same manner as Apache, Tomcat and other web servers. This handling will send back a redirect for URLs such as /foo to /foo/ if there doesn’t exist an action that responds to /foo|
-|struts.convention.classLoader.excludeParent|true|Exclude URLs found by the parent class loader from the list of URLs scanned to find actions (needs to be set to false for JBoss 5)|
-|struts.convention.action.eagerLoading|false|If set, found action classes will be instantiated by the ObjectFactory to accelerate future use, setting it up can clash with Spring managed beans|</p>
-
-<p>###Converting application from Codebehind to Convention Plugin### {#PAGE_106500}</p>
-
-<p><strong>Changes required</strong></p>
-
-<ul>
-  <li>
-    <p>Replace org.apache.struts2.config.Namespace with org.apache.struts2.convention.annotation.Namespace</p>
-  </li>
-  <li>
-    <p>Replace org.apache.struts2.config.Results with org.apache.struts2.convention.annotation.Results</p>
-  </li>
-  <li>
-    <p>Replace org.apache.struts2.config.Result with org.apache.struts2.convention.annotation.Result</p>
-  </li>
-  <li>
-    <p>Update @Result uses to use result <strong>name</strong> instead of Class&lt;Result&gt;</p>
-  </li>
-  <li>
-    <p>Update @Result uses to use <strong>location</strong> instead of value attribute</p>
-  </li>
-  <li>
-    <p>Update web.xml and remove Codebehind params from filter</p>
-  </li>
-  <li>
-    <p>Update CamelCase action results and references to match Convention. For example:</p>
-  </li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-Previously in Codebehind:
-Given an action named AnExampleAction, a request to /anExample -&gt; AnExampleAction.execute() -&gt; &gt; anExample-index.ftl
-
-Now in Convention:
-Given an action named AnExampleAction, a request to /an-example -&gt; AnExampleAction.execute() -&gt; an-example-index.ftl
-
-</code></pre>
-</div>
-
-<p><strong>When REST plugin is used</strong></p>
-
-<p>Add these constants to struts.xml</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;constant name="struts.convention.action.suffix" value="Controller"/&gt;
-&lt;constant name="struts.convention.action.mapAllMatches" value="true"/&gt;
-&lt;constant name="struts.convention.default.parent.package" value="rest-default"/&gt;
-&lt;constant name="struts.convention.package.locators" value="example"/&gt;
-
-</code></pre>
-</div>
-
-<p>##DWR Plugin## {#PAGE_82454}</p>
-
-<p>The DWR plugin</p>
-
-<p>provides integration with the Ajax framework <a href="http://getahead\.org/dwr">Direct Web Remoting</a>^[http://getahead.org/dwr]</p>
-
-<p>This plugin works by allowing DWR to execute a Struts 2 action and return any validation errors.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>This plugin is only available with Struts 2.1.1 or later</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Features####</p>
-
-<ul>
-  <li>Expose Struts 2 validations via DWR</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To expose Struts 2 validations via DWR, add this to your DWR configuration:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=dwrConfiguration|javadoc=true|lang=xml|url=struts2/plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>####Settings####</p>
-
-<p>This plugin doesn’t support any global settings.</p>
-
-<p>####Installation####</p>
-
-<p>To install, simply include the DWR Plugin in your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  Ensure that DWR has been correctly installed and configured.</p>
-
-<p>##Embedded JSP Plugin## {#PAGE_2852037}</p>
-
-<p>The Embedded JSP plugin</p>
-
-<p>allows you to use JSPs from the classpath (from jar files)</p>
-
-<p>###Introduction###</p>
-
-<p>JSPs are usually served from the file system. Using this plugin you can deploy JSPs inside jar files, which is sometimes desired, like when writing a plugin.</p>
-
-<p>####Wait...what?####</p>
-
-<p>The plugin containes a modified version of Jasper 6, which reads JSPs from the classpath, and generates the java code in memory (no .java file is written). The Java Compiler API is then used to compile the java source code into bytecode (in memory, no .class file is generated), and it is turned into a Servlet, which is cached for future use.</p>
-
-<p>####About includes####</p>
-
-<p>Because the JSP files are read from the classpath, “includes” work differently than they do from the file system. Assume you want to include “Hello.jsp”, when searching for that file in the classpath, multiple files might be found on different jars, like</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>somejar.jar!/Hello.jsp
-</code></pre>
-</div>
-<p>and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>otherjar.jar!/Hello.jsp
-</code></pre>
-</div>
-<p>. That’s why relative paths do not work in this plugin. Instead, create directory structures for the JSPs. For example, given 2 jsps under</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org/myexample/jsps
-</code></pre>
-</div>
-<p>in a jar file:</p>
-
-<p>Who.jsp:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-Hello there, I am the Doctor.
-
-</code></pre>
-</div>
-
-<p>Hello.jsp:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;jsp:include page="org/myexample/jsps/Who.jsp" /&gt;
-
-</code></pre>
-</div>
-
-<p>Mapping:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
- &lt;package name="example" namespace="/example" extends="embeddedjsp-default"&gt;
-     &lt;action name="HelloWorld" class="example.HelloWorld"&gt;
-         &lt;result type="embeddedJsp"&gt;org/myexample/jsps/Hello.jsp&lt;/result&gt;
-     &lt;/action&gt;
- &lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>####Requirements####</p>
-
-<ol>
-  <li>Java 6 or later</li>
-</ol>
-
-<p>#####Tomcat#####</p>
-
-<p>Tested with Tomcat 6.0.20.</p>
-
-<p>#####Jetty#####</p>
-
-<p>This plugin requires Jetty 7 to work. And the Tomcat libraries must be deployed with the application, adding this to your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>pom.xml
-</code></pre>
-</div>
-<p>should take care of that:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-     &lt;groupId&gt;org.apache.tomcat&lt;/groupId&gt;
-     &lt;artifactId&gt;jasper&lt;/artifactId&gt;
-     &lt;version&gt;6.0.18&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>To use Jetty 7 with the maven plugin add this to your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>pom.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;build&gt;
-    &lt;plugins&gt;
-        &lt;plugin&gt;
-             &lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
-             &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
-        &lt;/plugin&gt;
-    &lt;/plugins&gt;
-&lt;/build&gt;
-
-</code></pre>
-</div>
-
-<p>##JFreeChart Plugin## {#PAGE_14300}</p>
-
-<p><a href="http://www\.jfree\.org/jfreechart/">JFreeChart</a>^[http://www.jfree.org/jfreechart/] is a free 100% Java (LGPL) chart library that makes it easy for developers to display professional quality charts in their applications.</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>The JFreeChart plugin</p>
-
-<p>allows Actions to easily return generated charts and graphs</p>
-
-<p>Instead of streaming a generated chart directly to the HTTP response, this plugin provides a ChartResult, which handles the generation for you.  This allows you to generate the chart in one class, and render it out in another class, effectively decoupling the view from the Actions. You can easily render it out to a file or some view other than a web HTTP response if you wish.</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Handles rendering charts to the HTTP response</p>
-  </li>
-  <li>
-    <p>Can be used in other non-web contexts</p>
-  </li>
-</ul>
-
-<p>#####Future Work#####</p>
-
-<p>Currently the “chart” property is hardcoded. There should be a better way of transferring data from the Action to the Result, via some externally defined variable or something.</p>
-
-<p>As mentioned by John Patterson (mailing list), the Action is still dependant on a JFreeChart Chart class. This can be improved. The seperation between Action and View can be made cleaner. A chart-agonistic List or Array can be used as the data, and the configuration of the chart details (font, axis, etc...) be done via the result properties in the xwork.xml.</p>
-
-<p>But hey, the above works for now. Any suggestions are welcome.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>You can also create charts via the CeWolf library directly.  See <em>CeWolf charts using Velocity templates</em> .</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Usage####</p>
-
-<p>To use the plugin, have your Struts configuration package extend the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jfreechart-default
-</code></pre>
-</div>
-<p>package, which provides the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>chart
-</code></pre>
-</div>
-<p>result type.  Next, use it as a result in an action:</p>
-
-<p><strong>Chart example in struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="viewModerationChart" class="myapp.actions.ViewModerationChartAction"&gt;
-  &lt;result name="success" type="chart"&gt;
-    &lt;param name="width"&gt;400&lt;/param&gt;
-    &lt;param name="height"&gt;300&lt;/param&gt; 
-  &lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>In your Action class, provide a</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>getChart()
-</code></pre>
-</div>
-<p>method that returns the chart to be rendered.  This method will be called by the chart result.</p>
-
-<p>#####Example#####</p>
-
-<p><strong>Struts Action that provides a chart</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class ViewModerationChartAction extends ActionSupport {
-
-	private JFreeChart chart;
-
-	public String execute() throws Exception {
-		// chart creation logic...
-		XYSeries dataSeries = new XYSeries(new Integer(1)); //pass a key for this serie
-		for (int i = 0; i &lt;= 100; i++) {
-			dataSeries.add(i, RandomUtils.nextInt());
-		}
-		XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);
-
-		ValueAxis xAxis = new NumberAxis("Raw Marks");
-		ValueAxis yAxis = new NumberAxis("Moderated Marks");
-
-		// set my chart variable
-		chart =
-			new JFreeChart(
-				"Moderation Function",
-				JFreeChart.DEFAULT_TITLE_FONT,
-				new XYPlot(
-					xyDataset,
-					xAxis,
-					yAxis,
-					new StandardXYItemRenderer(StandardXYItemRenderer.LINES)),
-				false);
-		chart.setBackgroundPaint(java.awt.Color.white);
-
-		return super.SUCCESS;
-	}
-
-	public JFreeChart getChart() {
-		return chart;
-	}
-
-}
-
-</code></pre>
-</div>
-
-<p>#####Settings#####</p>
-
-<p>This plugin doesn’t provides any global settings.</p>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  The JFreeChart library will need to be downloaded separately, as its LGPL license doesn’t allow it to be distributed with Struts.</p>
-
-<p>##JSF Plugin## {#PAGE_44198}</p>
-
-<p><a href="http://java\.sun\.com/j2ee/javaserverfaces">JavaServer Faces</a>^[http://java.sun.com/j2ee/javaserverfaces] technology simplifies building user interfaces for JavaServer applications. Developers of various skill levels can quickly build web applications by: assembling reusable UI components in a page; connecting these components to an application data source; and wiring client-generated events to server-side event handlers.</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>The JSF Plugin</p>
-
-<p>provides support for JavaServer Faces components with no additional configuration</p>
-
-<p>The JSF support works by breaking up the JSF Licycle class into Struts Interceptors, one for each JSF phase.  When you include the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsfStack
-</code></pre>
-</div>
-<p>stack, you are ensuring the JSF page has its phases execute correctly.  At the end of the phases, the Struts Action itself is executed just like non-JSF pages.  The String return code of the Action is treated like any other Action as well.  Finally, the JSF “render” phase has been transformed into a Result.</p>
-
-<p>JavaServer Faces also has a concept of an “action”, which are generally executed in response to a button click.  The handling of the JSF action is preserved through the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsfStack
-</code></pre>
-</div>
-<p>Interceptor stack, but its String result code, rather than being applied against a JSF navigation rule, is treated as a Struts result code thereby keeping the navigation responsibility within Struts.</p>
-
-<p>The limitations of this approach include:</p>
-
-<ol>
-  <li>
-    <p>Any custom Lifecycle class is ignored</p>
-  </li>
-  <li>
-    <p>Any custom NavigationHandler is delegated to only when a Struts 2 navigation option cannot be found</p>
-  </li>
-</ol>
-
-<p>On the other hand, the rest of the JSF functionality, including PhaseListeners, components, multiple backing beans, etc. are preserved.  The Showcase example has a section demonstrating the JSF integration approach.</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Allows JSF components on normal Struts pages</p>
-  </li>
-  <li>
-    <p>Requires no additional configuration</p>
-  </li>
-  <li>
-    <p>Allows the JSF lifecycle to be completely customized</p>
-  </li>
-  <li>
-    <p>Preserves most JSF framework features so even complex components should work out of the box</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>The JSF plugin splits the JSF lifecycle into an optional Interceptor stack and Result, yet retains the page’s Action and navigation. Therefore, to use a page with JSF components, you need to:</p>
-
-<ol>
-  <li>Add the</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsfStack
-</code></pre>
-</div>
-<p>interceptor stack to your action definition.  This is easiest done by having your package extend</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsf-default
-</code></pre>
-</div>
-<p>.</p>
-
-<ol>
-  <li>Add a</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsf
-</code></pre>
-</div>
-<p>result associated with the name</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>success
-</code></pre>
-</div>
-
-<p>You can still add additional interceptors and results, including those that don’t use JSF at all.  In fact, the recommended approach is to use regular Struts results to handle inter-page navigation to avoid a common problem of JSF applications where every page request is a HTTP POST.</p>
-
-<p>This approach brings an additional advantage to JSF - every page can have an Action to execute page setup code, and the same Action instance will be automatically available later in the JSF page’s expression language as</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>action
-</code></pre>
-</div>
-<p>.  This means any common page logic such as retrieving data from a database can remain in your Action, and having that instance available later in your JSF components means the JSF configuration file is completely optional.  The JSF configuration file,</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>faces-config.xml
-</code></pre>
-</div>
-<p>, generally contains backing bean definitions and navigation rules, both of which can be solely handled by Struts.</p>
-
-<p>#####Example#####</p>
-
-<p>The following is an example of a regular Struts Action 2 page definition:</p>
-
-<p><strong>Regular JSF Action</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="employee" class="org.apache.struts.action2.showcase.jsf.EmployeeAction"&gt;
-    &lt;interceptor-ref name="basicStack"/&gt;
-    &lt;result name="success"&gt;employee.jsp&lt;/result&gt;
-    &lt;result name="index" type="redirect-action"&gt;index&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>This is the same action but as a JSF-enabled page:</p>
-
-<p><strong>JSF-enabled Action</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="employee" class="org.apache.struts.action2.showcase.jsf.EmployeeAction"&gt;
-    &lt;interceptor-ref name="basicStack"/&gt;
-    &lt;interceptor-ref name="jsfStack"/&gt;
-    &lt;result name="success" type="jsf" /&gt;
-    &lt;result name="index" type="redirect-action"&gt;index&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>Notice the Action-based navigation remains, but now you can use a page with JSF components and have complete access to the JSF lifecycle. This even supports JSF components that post back to themselves or add PhaseListeners to provide advanced AJAX support.</p>
-
-<p>#####Settings#####</p>
-
-<p>This plugin does not have any customizable settings.</p>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>####Resources####</p>
-
-<ul>
-  <li><a href="http://raibledesigns\.com/rd/entry/integrating\_struts\_2\_jsf\_facelets">Integrating Struts 2 + JSF + Facelets</a>^[http://raibledesigns.com/rd/entry/integrating_struts_2_jsf_facelets] (Matt Raible)</li>
-</ul>
-
-<p>##JSON Plugin## {#PAGE_2850922}</p>
-
-<p>This page is DEPRECATED, please refer to the new source <a href="http://struts\.apache\.org/plugins/json/">http://struts.apache.org/plugins/json/</a></p>
-
-<blockquote>
-
-</blockquote>
-
-<p> </p>
-
-<p>The JSON plugin</p>
-
-<p>provides a “json” result type that serializes actions into JSON</p>
-
-<ol>
-  <li>
-    <p>The “content-type” must be “application/json”</p>
-  </li>
-  <li>
-    <p>The JSON content must be well formed, see <a href="http://www.json.org">json.org</a>^[http://www.json.org] for grammar.</p>
-  </li>
-  <li>
-    <p>Action must have a public “setter” method for fields that must be populated.</p>
-  </li>
-  <li>
-    <p>Supported types for population are: Primitives (int,long…String), Date, List, Map, Primitive Arrays, Other class (more on this later), and Array of Other class.</p>
-  </li>
-  <li>
-    <p>Any object in JSON, that is to be populated inside a list, or a map, will be of type Map (mapping from properties to values), any whole number will be of type Long, any decimal number will be of type Double, and any array of type List.</p>
-  </li>
-</ol>
-
-<p>Given this JSON string:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w">
-   </span><span class="nt">"doubleValue"</span><span class="p">:</span><span class="w"> </span><span class="mf">10.10</span><span class="p">,</span><span class="w">
-   </span><span class="nt">"nestedBean"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
-      </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Mr Bean"</span><span class="w">
-   </span><span class="p">},</span><span class="w">
-   </span><span class="nt">"list"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mf">20.20</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w">
-      </span><span class="nt">"firstName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"El Zorro"</span><span class="w">
-   </span><span class="p">}],</span><span class="w">
-   </span><span class="nt">"array"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">]</span><span class="w"> 
-</span><span class="p">}</span><span class="w">
-
-</span></code></pre>
-</div>
-
-<p>The action must have a “setDoubleValue” method, taking either a “float” or a “double” argument (the interceptor will convert the value to the right one). There must be a “setNestedBean” whose argument type can be any class, that has a “setName” method taking as argument an “String”. There must be a “setList” method that takes a “List” as argument, that list will contain: “A” (String), 10 (Long), 20.20 (Double), Map (“firstName” -&gt; “El Zorro”). The “setArray” method can take as para [...]
-
-<table>
-  <tbody>
-    <tr>
-      <td>So serialize your objects to JSON in javascript see <a href="http://json\.org/json2\.js">json2</a>^[http://json.org/json2.js].</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>root attribute must be set on the JSONInterceptor when dealing with JSON array.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>This plugin also provides <em>AJAX Validation</em> .</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory. No other files need to be copied or created.</p>
-
-<p>To use maven, add this to your pom:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependencies&gt;
-   ...
-   &lt;dependency&gt;
-       &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-       &lt;artifactId&gt;struts2-json-plugin&lt;/artifactId&gt;
-       &lt;version&gt;STRUTS_VERSION&lt;/version&gt;
-   &lt;/dependency&gt;
-   ...
-&lt;/dependencies&gt;
-
-</code></pre>
-</div>
-
-<p>####Customizing Serialization and Deserialization####</p>
-
-<p>Use the JSON annotation to customize the serialization/deserialization process. Available JSON annotation fields:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Name</th>
-      <th>Description</th>
-      <th>Default Value</th>
-      <th>Serialization</th>
-      <th>Deserialization</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>name</td>
-      <td>Customize field name</td>
-      <td>empty</td>
-      <td>yes</td>
-      <td>no</td>
-    </tr>
-    <tr>
-      <td>serialize</td>
-      <td>Include in serialization</td>
-      <td>true</td>
-      <td>yes</td>
-      <td>no</td>
-    </tr>
-    <tr>
-      <td>deserialize</td>
-      <td>Include in deserialization</td>
-      <td>true</td>
-      <td>no</td>
-      <td>yes</td>
-    </tr>
-    <tr>
-      <td>format</td>
-      <td>Format used to format/parse a Date field</td>
-      <td>“yyyy-MM-dd’T’HH:mm:ss”</td>
-      <td>yes</td>
-      <td>yes</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Excluding properties#####</p>
-
-<p>A comma-delimited list of regular expressions can be passed to the JSON Result and Interceptor, properties matching any of these regular expressions will be ignored on the serialization process:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;!-- Result fragment --&gt;
-&lt;result type="json"&gt;
-  &lt;param name="excludeProperties"&gt;
-    login.password,
-    studentList.*\.sin
-  &lt;/param&gt;
-&lt;/result&gt;
-
-&lt;!-- Interceptor fragment --&gt;
-&lt;interceptor-ref name="json"&gt;
-  &lt;param name="enableSMD"&gt;true&lt;/param&gt;
-  &lt;param name="excludeProperties"&gt;
-    login.password,
-    studentList.*\.sin
-  &lt;/param&gt;
-&lt;/interceptor-ref&gt;
-
-</code></pre>
-</div>
-
-<p>#####Including properties#####</p>
-
-<p>A comma-delimited list of regular expressions can be passed to the JSON Result to restrict which properties will be serialized. ONLY properties matching any of these regular expressions will be included in the serialized output.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Exclude property expressions take precedence over include property expressions. That is, if you use include and exclude property expressions on the same result, include property expressions will not be applied if an exclude exclude property expression matches a property first.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;!-- Result fragment --&gt;
-&lt;result type="json"&gt;
-  &lt;param name="includeProperties"&gt;
-    ^entries\[\d+\]\.clientNumber,
-    ^entries\[\d+\]\.scheduleNumber,
-    ^entries\[\d+\]\.createUserId
-  &lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Root Object#####</p>
-
-<p>Use the “root” attribute(OGNL expression) to specify the root object to be serialized.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="root"&gt;
-    person.job
-  &lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>The “root” attribute(OGNL expression) can also be used on the interceptor to specify the object that must be populated, <strong>make sure this object is not null</strong>.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;interceptor-ref name="json"&gt;
-  &lt;param name="root"&gt;bean1.bean2&lt;/param&gt;
-&lt;/interceptor-ref&gt;
-
-</code></pre>
-</div>
-
-<p>#####Wrapping#####</p>
-
-<p>For several reasons you might want to wrap the JSON output with some text, like wrapping with comments, adding a prefix, or to use file uploads which require the result to be wrapped in a textarea. Use <em>wrapPrefix</em>  to add content in the beginning and <em>wrapPostfix</em>  to add content at the end. This settings take precedence over “wrapWithComments” and “prefix” which are deprecated from 0.34 on. Examples:
- Wrap with comments:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="wrapPrefix"&gt;/*&lt;/param&gt;
-  &lt;param name="wrapSuffix"&gt;*/&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>Add a prefix:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="wrapPrefix"&gt;{}&amp;&amp;&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>Wrap for file upload:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"json"</span><span class="nt">&gt;</span>
-  <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"wrapPrefix"</span><span class="nt">&gt;</span><span class="cp">&lt;![CDATA[&lt;html&gt;&lt;body&gt;&lt;textarea&gt;]]&gt;</span><span class="nt">&lt;/param&gt;</span>
-  <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"wrapSuffix"</span><span class="nt">&gt;</span><span class="cp">&lt;![CDATA[&lt;/textarea&gt;&lt;/body&gt;&lt;/html&gt;]]&gt;</span><span class="nt">&lt;/param&gt;</span>
-<span class="nt">&lt;/result&gt;</span>
-
-</code></pre>
-</div>
-
-<p>#####Wrap with Comments#####</p>
-
-<p><em>wrapWithComments</em>  is deprecated from 0.34, use <em>wrapPrefix</em>  and <em>wrapSuffix</em>  instead.</p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p><em>wrapWithComments</em>  can turn safe JSON text into dangerous text. For example,</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p><em>”*/ alert(‘XSS’); /*“</em></p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Thanks to Douglas Crockford for the tip!. Consider using <strong>prefix</strong> instead.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>If the serialized JSON is <em>{name: ‘El Zorro’}</em> . Then the output will be: <em>{}&amp;&amp; ({name: ‘El Zorro’}</em></p>
-
-<p>If the “wrapWithComments” (false by default) attribute is set to true, the generated JSON is wrapped with comments like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/* {
-   "doubleVal": 10.10,
-   "nestedBean": {
-      "name": "Mr Bean"
-   },
-   "list": ["A", 10, 20.20, {
-      "firstName": "El Zorro"
-   }],
-   "array": [10, 20] 
-} */
-
-</code></pre>
-</div>
-
-<p>To strip those comments use:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>var responseObject = eval("("+data.substring(data.indexOf("\/\*")+2, data.lastIndexOf("\*\/"))+")");
-
-</code></pre>
-</div>
-
-<p>#####Prefix#####</p>
-
-<p><em>prefix</em>  is deprecated from 0.34, use <em>wrapPrefix</em>  and <em>wrapSuffix</em>  instead.</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>If the parameter <em>prefix</em>  is set to true, the generated JSON will be prefixed with “{}&amp;&amp; “. This will help prevent hijacking. See <a href="http://trac\.dojotoolkit\.org/ticket/6380">this Dojo Ticket</a>^[http://trac.dojotoolkit.org/ticket/6380] for details:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="prefix"&gt;true&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Base Classes#####</p>
-
-<p>By default properties defined on base classes of the “root” object won’t be serialized, to serialize properties in all base classes (up to Object) set “ignoreHierarchy” to false in the JSON result:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="ignoreHierarchy"&gt;false&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Enumerations#####</p>
-
-<p>By default, an Enum is serialized as a name=value pair where value = name().</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>  public enum AnEnum {
-     ValueA,
-     ValueB
-  }
-
-  JSON:  "myEnum":"ValueA"
-
-</code></pre>
-</div>
-
-<p>Use the “enumAsBean” result parameter to serialize Enum’s as a bean with a special property _name with value name(). All properties of the enum are also serialized.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>  public enum AnEnum {
-     ValueA("A"),
-     ValueB("B");
-
-     private String val;
-     
-     public AnEnum(val) {
-        this.val = val;
-     }
-     public getVal() {
-        return val;
-     }
-   }
-
-  JSON:  myEnum: { "_name": "ValueA", "val": "A" }
-
-</code></pre>
-</div>
-
-<p>Enable this parameter through struts.xml:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="enumAsBean"&gt;true&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Compressing the output.#####</p>
-
-<p>Set the <em>enableGZIP</em>  attribute to true to gzip the generated json response. The request <strong>must</strong> include “gzip” in the “Accept-Encoding” header for this to work.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="enableGZIP"&gt;true&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Preventing the browser from caching the response#####</p>
-
-<p>Set <em>noCache</em>  to true(false by default) to set the following headers in the response:</p>
-
-<ul>
-  <li>
-    <p>Cache-Control: no-cache</p>
-  </li>
-  <li>
-    <p>Expires: 0</p>
-  </li>
-  <li>
-    <p>Pragma: No-cache</p>
-  </li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="noCache"&gt;true&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Excluding properties with null values#####</p>
-
-<p>By default fields with null values are serialized like {property_name: null}. This can be prevented by setting <em>excludeNullProperties</em>  to true.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="excludeNullProperties"&gt;true&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Status and Error code#####</p>
-
-<p>Use <em>statusCode</em>  to set the status of the response:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="statusCode"&gt;304&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>And <em>errorCode</em>  to send an error(the server might end up sending something to the client which is not the serialized JSON):</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="errorCode"&gt;404&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####JSONP#####</p>
-
-<p>To enable JSONP, set the parameter <em>callbackParameter</em>  in either the JSON Result or the Interceptor. A parameter with that name will be read from the request, and it value will be used as the JSONP function. Assuming that a request is made with the parameter “callback”=”exec”:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="callbackParameter"&gt;callback&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>And that the serialized JSON is <em>{name: ‘El Zorro’}</em> . Then the output will be: <em>exec({name: ‘El Zorro’})</em></p>
-
-<p>#####Content Type#####</p>
-
-<p>Content type will be set to <em>application/json-rpc</em>  by default if SMD is being used, or <em>application/json</em>  otherwise. Sometimes it is necessary to set the content type to something else, like when uploading files with Dojo and YUI. Use the <em>contentType</em>  parameter in those cases.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="contentType"&gt;text/html&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>#####Encoding#####</p>
-
-<p>User can define encoding per result or base on default assigned to struts.i18n.encoding. To define encoding for given result add encoding param as below:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="json"&gt;
-  &lt;param name="encoding"&gt;UTF-8&lt;/param&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>####Example####</p>
-
-<p>#####Setup Action#####</p>
-
-<p>This simple action has some fields:</p>
-
-<p>Example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>import java.util.HashMap;
-import java.util.Map;
-
-import com.opensymphony.xwork2.Action;
-
-public class JSONExample {
-    private String field1 = "str";
-    private int[] ints = {10, 20};
-    private Map map = new HashMap();
-    private String customName = "custom";
-
-    //'transient' fields are not serialized
-    private transient String field2;
-
-    //fields without getter method are not serialized
-    private String field3;
-
-    public String execute() {
-        map.put("John", "Galt");
-        return Action.SUCCESS;
-    }
-
-    public String getField1() {
-        return field1;
-    }
-
-    public void setField1(String field1) {
-        this.field1 = field1;
-    }
-
-    public int[] getInts() {
-        return ints;
-    }
-
-    public void setInts(int[] ints) {
-        this.ints = ints;
-    }
-
-    public Map getMap() {
-        return map;
-    }
-
-    public void setMap(Map map) {
-        this.map = map;
-    }
-
-    @JSON(name="newName")
-    public String getCustomName() {
-        return this.customName;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>#####Write the mapping for the action#####</p>
-
-<ol>
-  <li>
-    <p>Add the map inside a package that extends “json-default”</p>
-  </li>
-  <li>
-    <p>Add a result of type “json”</p>
-  </li>
-</ol>
-
-<p>Example with Convention Plugin Configuration:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>import java.util.HashMap;
-import java.util.Map;
-
-import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.convention.annotation.Result;
-
-@Result(type = "json")
-public class JSONExample extends ActionSupport {
-// action code
-}
-
-</code></pre>
-</div>
-
-<p>Example with XML Configuration:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
-<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</span> <span class="na">name=</span><span class="s">"example"</span>  <span class="na">extends=</span><span class="s">"json-default"</span><span class="nt">&gt;</span>
-     <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"JSONExample"</span> <span class="na">class=</span><span class="s">"example.JSONExample"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"json"</span><span class="nt">/&gt;</span>
-     <span class="nt">&lt;/action&gt;</span>
-  <span class="nt">&lt;/package&gt;</span>
-
-<span class="nt">&lt;/struts&gt;</span>
-
-</code></pre>
-</div>
-
-<p><strong>JSON example output</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w">  
-   </span><span class="nt">"field1"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"str"</span><span class="p">,</span><span class="w"> 
-   </span><span class="nt">"ints"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">],</span><span class="w">
-   </span><span class="nt">"map"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
-       </span><span class="nt">"John"</span><span class="p">:</span><span class="s2">"Galt"</span><span class="w">
-   </span><span class="p">},</span><span class="w">
-   </span><span class="nt">"newName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"custom"</span><span class="w">
-</span><span class="p">}</span><span class="w">
-
-</span></code></pre>
-</div>
-
-<p><strong>Accepting JSON</strong></p>
-
-<p>Your actions can accept incoming JSON if they are in package which uses </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>json
-</code></pre>
-</div>
-<p>interceptor or by adding reference to it as follow:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@InterceptorRef(value="json")
-</code></pre>
-</div>
-
-<p>By default</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>Content-Type
-</code></pre>
-</div>
-<p> of value</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>application/json
-</code></pre>
-</div>
-<p> is recognised to be used for de-serialisation and </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>application/json-rpc
-</code></pre>
-</div>
-<p>to execute SMD processing. You can override those settings be defining </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsonContentType
-</code></pre>
-</div>
-<p>and </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jsonRpcContentType
-</code></pre>
-</div>
-<p>params, see example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;interceptor-ref name="json"&gt;
-  &lt;param name="jsonContentType"&gt;text/json&lt;/param&gt;
-  &lt;param name="jsonRpcContentType"&gt;text/json-rpc&lt;/param&gt;
-&lt;/interceptor-ref&gt;
-</code></pre>
-</div>
-
-<p>Please be aware that those are scoped params per stack, which means, once set it will be used by actions in scope of this stack.</p>
-
-<p>####JSON RPC####</p>
-
-<p>The json plugin can be used to execute action methods from javascript and return the output. This feature was developed with Dojo in mind, so it uses <a href="http://manual\.dojotoolkit\.org/WikiHome/DojoDotBook/Book9">Simple Method Definition</a>^[http://manual.dojotoolkit.org/WikiHome/DojoDotBook/Book9] to advertise the remote service. Let’s work it out with an example(useless as most examples).</p>
-
-<p>First write the action:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package smd;
-
-import com.googlecode.jsonplugin.annotations.SMDMethod;
-import com.opensymphony.xwork2.Action;
-
-public class SMDAction {
-    public String smd() {
-        return Action.SUCCESS;
-    }
-    
-    @SMDMethod
-    public Bean doSomething(Bean bean, int quantity) {
-        bean.setPrice(quantity * 10);
-        return bean;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>Methods that will be called remotely <strong>must</strong> be annotated with the <em>SMDMethod</em>  annotation, for security reasons. The method will take a bean object, modify its price and return it. The action can be annotated with the <em>SMD</em>  annotation to customize the generated SMD (more on that soon), and parameters can be annotated with <em>SMDMethodParameter</em> . As you can see, we have a “dummy”, <em>smd</em>  method. This method will be used to generate the Simple  [...]
-
-<p>The bean class:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package smd;
-
-public class Bean {
-    private String type;
-    private int price;
-    
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public int getPrice() {
-        return price;
-    }
-
-    public void setPrice(int price) {
-        this.price = price;
-    }
-
-}
-
-</code></pre>
-</div>
-
-<p>The mapping:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;package name="RPC" namespace="/nodecorate" extends="json-default"&gt;
-    &lt;action name="SMDAction" class="smd.SMDAction" method="smd"&gt;
-        &lt;interceptor-ref name="json"&gt;
-            &lt;param name="enableSMD"&gt;true&lt;/param&gt;
-        &lt;/interceptor-ref&gt;
-        &lt;result type="json"&gt;
-             &lt;param name="enableSMD"&gt;true&lt;/param&gt;
-        &lt;/result&gt;
-    &lt;/action&gt;
-&lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>Nothing special here, except that <strong>both</strong> the interceptor and the result must be applied to the action, and “enableSMD” must be enabled for both.</p>
-
-<p>Now the javascript code:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;s:url id="smdUrl" namespace="/nodecorate" action="SMDAction" /&gt;
-&lt;script type="text/javascript"&gt;
-    //load dojo RPC
-    dojo.require("dojo.rpc.*");
-    
-    //create service object(proxy) using SMD (generated by the json result)
-    var service = new dojo.rpc.JsonService("${smdUrl}");
-    
-    //function called when remote method returns
-    var callback = function(bean) {
-        alert("Price for " + bean.type + " is " + bean.price);
-    };
-    
-    //parameter
-    var bean = {type: "Mocca"};
-    
-    //execute remote method
-    var defered = service.doSomething(bean, 5);
-
-    //attach callback to defered object
-    defered.addCallback(callback);
-&lt;/script&gt;
-
-</code></pre>
-</div>
-
-<p>Dojo’s JsonService will make a request to the action to load the SMD, which will return a JSON object with the definition of the available remote methods, using that information Dojo creates a “proxy” for those methods. Because of the asynchronous nature of the request, when the method is executed, a deferred object is returned, to which a callback function can be attached. The callback function will receive as a parameter the object returned from your action. That’s it.</p>
-
-<p>####Proxied objects####</p>
-
-<p>As annotations are not inherited in Java, some user might experience problems while trying to serialize objects that are proxied. eg. when you have attached AOP interceptors to your action.</p>
-
-<p>In this situation, the plugin will not detect the annotations on methods in your action.</p>
-
-<p>To overcome this, set the “ignoreInterfaces” result parameter to false (true by default) to request that the plugin inspects all interfaces and superclasses of the action for annotations on the action’s methods.</p>
-
-<p>NOTE: This parameter should only be set to false if your action could be a proxy as there is a performance cost caused by recursion through the interfaces.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;action name="contact" class="package.ContactAction" method="smd"&gt;
-   &lt;interceptor-ref name="json"&gt;
-      &lt;param name="enableSMD"&gt;true&lt;/param&gt;
-      &lt;param name="ignoreSMDMethodInterfaces"&gt;false&lt;/param&gt;
-   &lt;/interceptor-ref&gt;
-   &lt;result type="json"&gt;
-      &lt;param name="enableSMD"&gt;true&lt;/param&gt;
-      &lt;param name="ignoreInterfaces"&gt;false&lt;/param&gt;
-   &lt;/result&gt;
-   &lt;interceptor-ref name="default"/&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>##JUnit Plugin## {#PAGE_82304}</p>
-
-<p>This page is DEPRECATED, please refer to the new source <a href="http://struts\.apache\.org/plugins/junit/">http://struts.apache.org/plugins/junit/</a></p>
-
-<blockquote>
-
-</blockquote>
-
-<p>The JUnit plugin</p>
-
-<p>provides integration with the popular <a href="http://junit\.org">JUnit</a>^[http://junit.org] unit testing framework</p>
-
-<p>This plugin provides a base</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>class that can subclassed for tests that work on Struts 2 components. It is used within Struts 2 itself to test core framework components and many bundled plugins. The class</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsSpringTestCase
-</code></pre>
-</div>
-<p>is also provided, to support testing of actions that use Spring as the object factory.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>See <a href="#PAGE_2330106">Testing Actions</a> for more details</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>This plugin is only available with Struts 2.1.1 or later</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Base test class that starts up a full Struts 2 instance</p>
-  </li>
-  <li>
-    <p>Great for testing how configuration is loaded and Struts 2 components are used</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>First, include the plugin your POM (if using Maven 2) under the test scope:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-  &lt;artifactId&gt;struts2-junit-plugin&lt;/artifactId&gt;
-  &lt;version&gt;STRUTS_2_VERSION&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>if you are using Spring, also add:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-    &lt;artifactId&gt;struts2-spring-plugin&lt;/artifactId&gt;
-    &lt;version&gt;STRUTS_2_VERSION&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-    &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
-    &lt;artifactId&gt;jsp-api&lt;/artifactId&gt;
-    &lt;version&gt;2.0&lt;/version&gt;
-    &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>If you are not using Maven 2 to build and test your code, ensure the plugin jar and its dependencies (spring-mock and junit) are in the testing classpath.</p>
-
-<p>Now, your JUnit tests can subclass the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>class, which handles starting and stopping the Struts 2 framework:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>public class MyTest extends StrutsTestCase {
- // testing code
-}
-
-</code></pre>
-</div>
-
-<p>####Settings####</p>
-
-<p>This plugin doesn’t support any global settings.</p>
-
-<p>####Installation####</p>
-
-<p>This plugin is meant to be used during unit testing, and not during runtime. Therefore, include it in your build’s classpath, but do not deploy it to</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/lib
-</code></pre>
-</div>
-<p>in your Struts 2 application.</p>
-
-<p>###Testing Actions### {#PAGE_2330106}</p>
-
-<p>The recommended way to test actions is to instantiate the action classes and test them. The <a href="#PAGE_82304">JUnit Plugin</a> supports testing actions within a Struts invocation, meaning that a full request is simulated, and the output of the action can be tested.</p>
-
-<p><strong>Struts actions (without Spring)</strong></p>
-
-<p>To test actions that do not use Spring, extend</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>. The following example shows different ways of testing an action:
- Mapping:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;struts&gt;
-    &lt;constant name="struts.objectFactory" value="spring"/&gt;
-    &lt;package name="test" namespace="/test" extends="struts-default"&gt;
-        &lt;action name="testAction" class="org.apache.struts2.TestAction"&gt;
-            &lt;result type="freemarker"&gt;/template.ftl&lt;/result&gt;
-        &lt;/action&gt;
-    &lt;/package&gt;
-&lt;/struts&gt;
-
-</code></pre>
-</div>
-
-<p>Action:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>public class TestAction extends ActionSupport {
-    private String name;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>JUnit:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package org.apache.struts2;
-
-import org.apache.struts2.dispatcher.mapper.ActionMapping;
-
-import java.util.HashMap;
-import java.io.UnsupportedEncodingException;
-
-import com.opensymphony.xwork2.ActionProxy;
-import com.opensymphony.xwork2.Action;
-
-import javax.servlet.ServletException;
-
-public class StrutsTestCaseTest extends StrutsTestCase {
-    public void testGetActionMapping() {
-        ActionMapping mapping = getActionMapping("/test/testAction.action");
-        assertNotNull(mapping);
-        assertEquals("/test", mapping.getNamespace());
-        assertEquals("testAction", mapping.getName());
-    }
-
-    public void testGetActionProxy() throws Exception {
-        //set parameters before calling getActionProxy
-        request.setParameter("name", "FD");
-        
-        ActionProxy proxy = getActionProxy("/test/testAction.action");
-        assertNotNull(proxy);
-
-        TestAction action = (TestAction) proxy.getAction();
-        assertNotNull(action);
-
-        String result = proxy.execute();
-        assertEquals(Action.SUCCESS, result);
-        assertEquals("FD", action.getName());
-    }
-
-    public void testExecuteAction() throws ServletException, UnsupportedEncodingException {
-        String output = executeAction("/test/testAction.action");
-        assertEquals("Hello", output);
-    }
-
-    public void testGetValueFromStack() throws ServletException, UnsupportedEncodingException {
-        request.setParameter("name", "FD");
-        executeAction("/test/testAction.action");
-        String name = (String) findValueAfterExecute("name");
-        assertEquals("FD", name);
-    }
-}
-
-</code></pre>
-</div>
-
-<p><strong>The template</strong></p>
-
-<p>If you use JSPs as the template engine you won’t be able to test the action output outside the container. The <a href="#PAGE_2852037">Embedded JSP Plugin</a> can be used to overcome this limitation and be able to use JSPs from the classpath and outside the container.</p>
-
-<p>There are several utility methods and mock objects defined in StrutsTestCase which can be used to facilitate the testing:
- Methods:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Method Name</th>
-      <th>Description</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>executeAction(String)</td>
-      <td>Pass the url for the action, and it will return the output of the action. This output <strong>is not</strong> the action result, like “success”, but what would be written to the result stream. To use this the actions must be using a result type that can be read from the classpath, like FreeMarker, velocity, etc (if you are using the experimental Embedded JSP Plugin, you can use JSPs also)</td>
-    </tr>
-    <tr>
-      <td>getActionProxy(String)</td>
-      <td>Builds an action proxy that can be used to invoke an action, by calling execute() on the returned proxy object. The return value of execute() is the action result, like “success”</td>
-    </tr>
-    <tr>
-      <td>getActionMapping(String)</td>
-      <td>Gets an ActionMapping for the url</td>
-    </tr>
-    <tr>
-      <td>injectStrutsDependencies(object)</td>
-      <td>Injects Struts dependencies into an object (dependencies are marked with Inject)</td>
-    </tr>
-    <tr>
-      <td>findValueAfterExecute(String)</td>
-      <td>Finds an object in the value stack, after an action has been executed</td>
-    </tr>
-    <tr>
-      <td>applyAdditionalParams(ActionContext)</td>
-      <td>Can be overwritten in subclass to provide additional params and settings used during action invocation</td>
-    </tr>
-    <tr>
-      <td>createAction(Class)</td>
-      <td>Can be used to instantiate an action which requires framework’s dependencies to be injected (e.g. extending ActionSupport requires inject some internal dependencies)</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <thead>
-    <tr>
-      <th>Field</th>
-      <th>Description</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>MockHttpServletRequest request</td>
-      <td>The request that will be passed to Struts. Make sure to set parameters in this object before calling methods like getActionProxy</td>
-    </tr>
-    <tr>
-      <td>MockHttpServletResponse response</td>
-      <td>The response object passed to Struts, you can use this class to test the output, response headers, etc</td>
-    </tr>
-    <tr>
-      <td>MockServletContext servletContext</td>
-      <td>The servlet context object passed to Struts</td>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>Struts Actions using Spring</strong></p>
-
-<p>Make sure to add a dependency to the <a href="#PAGE_14281">Spring Plugin</a> to your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>pom.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-    &lt;artifactId&gt;struts2-spring-plugin&lt;/artifactId&gt;
-    &lt;version&gt;STRUTS_VERSION&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>If you use Spring as the object factory, the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsSpringTestCase
-</code></pre>
-</div>
-<p>class can be used to write your JUnits. This class extends</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>and has a</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>applicationContext
-</code></pre>
-</div>
-<p>field of type</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ApplicationContext
-</code></pre>
-</div>
-<p>.</p>
-
-<p>The Spring context is loaded from “classpath*:applicationContext.xml” by default. To provide a different location, overwrite</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>getContextLocations
-</code></pre>
-</div>
-<p>.</p>
-
-<p>##JasperReports Plugin## {#PAGE_14258}</p>
-
-<p><a href="http://jasperforge\.org/sf/projects/jasperreports">JasperReports</a>^[http://jasperforge.org/sf/projects/jasperreports] is a powerful open source Java (LGPL) reporting tool that has the ability to deliver rich content onto the screen, to the printer or into PDF, HTML, XLS, CSV and XML files.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>The JasperReports plugin</p>
-
-<p>enables Actions to create high-quality reports as results</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>Allows Actions to be rendered through JasperReports</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To use this plugin, have your packages that contain the target actions extend the provided</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jasperreports-default
-</code></pre>
-</div>
-<p>package, which contains the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>jasper
-</code></pre>
-</div>
-<p>result type.  Then, simply use the result type in the desired actions.  The result takes the following parameters:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=description|javadoc=true|url=struts2/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=params|javadoc=true|url=struts2/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java</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=example1|lang=xml|javadoc=true|url=struts2/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>or for pdf:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=example2|lang=xml|javadoc=true|url=struts2/plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>#####Settings#####</p>
-
-<p>This plugin doesn’t provide any global settings.</p>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<hr />
-
-<p>(ok)  See also <a href="http://www\.vitarara\.org/cms/node/131http://www\.vitarara\.org/cms/node/131">Compiling JasperReports JRXML Files with Maven</a>^[http://www.vitarara.org/cms/node/131http://www.vitarara.org/cms/node/131] (Mark Menard)</p>
-
-<p>##Java 8 Support Plugin## {#PAGE_50857342}</p>
-
-<p>This plugin was dropped in Struts 2.5.5 as Struts Core is using ASM5 now which supports Java8.</p>
-
-<blockquote>
-
-</blockquote>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Adds support for Java 8 - to allow use the latest features of the language with Struts actions.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Usage####</p>
-
-<p>You must define it as a dependency in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>pom.xml
-</code></pre>
-</div>
-<p> and exclude the old version of ASM used with</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>xwork-core
-</code></pre>
-</div>
-<p>, see a code snippet below:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.apache.struts.xwork&lt;/groupId&gt;
-    &lt;artifactId&gt;xwork-core&lt;/artifactId&gt;
-    &lt;exclusions&gt;
-        &lt;exclusion&gt;
-            &lt;groupId&gt;asm&lt;/groupId&gt;
-            &lt;artifactId&gt;asm&lt;/artifactId&gt;
-        &lt;/exclusion&gt;
-        &lt;exclusion&gt;
-            &lt;groupId&gt;asm&lt;/groupId&gt;
-            &lt;artifactId&gt;asm-commons&lt;/artifactId&gt;
-        &lt;/exclusion&gt;
-    &lt;/exclusions&gt;
-&lt;/dependency&gt;
-</code></pre>
-</div>
-
-<p>If you don’t use Maven to manage the dependencies, please be sure to replace </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>asm.jar
-</code></pre>
-</div>
-<p> and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>asm-commons.jar
-</code></pre>
-</div>
-<p> with appropriated ASM 5 versions.</p>
-
-<p>####Supported Java 8 features####</p>
-
-<ul>
-  <li>Lambda Expressions in actions when using them with the Convention plugin</li>
-</ul>
-
-<p> </p>
-
-<p>##Javatemplates Plugin## {#PAGE_105841}</p>
-
-<p>This plugin provides a</p>
-
-<p>faster Java implementation of tags in the “simple” theme</p>
-
-<p>####Installation####</p>
-
-<p>1. This plugin can be installed by copying the plugin jar into your application’s /WEB-INF/lib directory. No other files need to be copied or created.
- 2. Set these properties in struts.xml:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.ui.templateSuffix" value="java" /&gt;
-&lt;constant name="struts.ui.theme" value="simple" /&gt;
-
-</code></pre>
-</div>
-
-<p>The plugin is a drop in replacement for the supported tags in the simple theme, so no other configuration is required.</p>
-
-<p>####Supported tags####</p>
-
-<ul>
-  <li>
-    <p><em>a</em></p>
-  </li>
-  <li>
-    <p><em>actionerror</em></p>
-  </li>
-  <li>
-    <p><em>actionmessage</em></p>
-  </li>
-  <li>
-    <p><em>checkbox</em></p>
-  </li>
-  <li>
-    <p><em>datetextfield</em></p>
-  </li>
-  <li>
-    <p><em>div</em></p>
-  </li>
-  <li>
-    <p><em>fielderror</em></p>
-  </li>
-  <li>
-    <p><em>file</em></p>
-  </li>
-  <li>
-    <p><em>form</em></p>
-  </li>
-  <li>
-    <p><em>head</em></p>
-  </li>
-  <li>
-    <p><em>hidden</em></p>
-  </li>
-  <li>
-    <p><em>label</em></p>
-  </li>
-  <li>
-    <p><em>password</em></p>
-  </li>
-  <li>
-    <p><em>select</em></p>
-  </li>
-  <li>
-    <p><em>reset</em></p>
-  </li>
-  <li>
-    <p><em>submit</em></p>
-  </li>
-  <li>
-    <p><em>textfield</em></p>
-  </li>
-  <li>
-    <p><em>textarea</em></p>
-  </li>
-  <li>
-    <p><em>token</em></p>
-  </li>
-</ul>
-
-<p>####Performance benchmark####</p>
-
-<p>TODO</p>
-
-<p>##OSGi Plugin## {#PAGE_114995}</p>
-
-<p>####Overview####</p>
-
-<p>This plugin is only experimental and can change in the future.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>This plugin provides support for starting an instance of Apache Felix inside a web application, and scanning installed bundles for Struts configuration. An admin bundle is also provided. It can be used with Glassfish 3 as well (Glassfish 3 based on Apache Felix as well), but in such a way</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.osgi.host
-</code></pre>
-</div>
-<p>must be defined.</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>GUI for bundle administration</p>
-  </li>
-  <li>
-    <p>Web access to Felix Shell</p>
-  </li>
-  <li>
-    <p>Application packages can be divided into bundles</p>
-  </li>
-  <li>
-    <p>Supports Velocity and FreeMarker templates</p>
-  </li>
-  <li>
-    <p>Supports Struts Spring integration</p>
-  </li>
-  <li>
-    <p>Supports integration with the Convention plugin</p>
-  </li>
-</ul>
-
-<p>####Missing Features####</p>
-
-<ul>
-  <li>
-    <p>Probably can’t access application classes from bundles, including Spring classes</p>
-  </li>
-  <li>
-    <p><em>constant</em>  declarations in the bundled XML config files are ignored, these constants need to be set in the application XML config files (struts.xml)</p>
-  </li>
-</ul>
-
-<p>####About Run levels####</p>
-
-<p>There are two ways of organizing bundles. If third party bundles will not be used, then the application bundles can just be placed under</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles
-</code></pre>
-</div>
-<p>. Bundles in this dir will be started in run level 2, the Apache Felix framework’s bundles will be loaded in run level 1. If third parties bundles will be used, or you need to start bundles on different run level, create sub dirs under</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles
-</code></pre>
-</div>
-<p>with numeric names (starting from “2” because “1” is reserved for Felix), which correspond to the run level number. For example bundles under</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles/2
-</code></pre>
-</div>
-<p>will be started in run level 2, and bundles under</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles/3
-</code></pre>
-</div>
-<p>will be started in run level 3.</p>
-
-<p>####Simple Usage####</p>
-
-<p>Add these lines to MANIFEST.MF:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-Struts2-Enabled: true
-Export-Package: com.mycompany.myapp.actions
-Bundle-Version: 1.0.0
-Bundle-SymbolicName: foo.actions
-Import-Package: com.opensymphony.xwork2
-
-</code></pre>
-</div>
-
-<p>Now the jar is ready to be deployed.  Drop the jar into the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles
-</code></pre>
-</div>
-<p>directory and it will automatically be installed when the application starts up.</p>
-
-<p>####Using Spring####</p>
-
-<p>By default Spring OSGi loads its xml config files asynchronously, which causes the OSGi plugin to fail while starting. To fix this add this line to MANIFEST.MF:</p>
-
-<blockquote>
-
-  <p>Spring-Context:*;create-asynchronously:=false</p>
-
-</blockquote>
-
-<blockquote>
-  <p>Or if using The Apache Felix maven plugin (see below for details):</p>
-</blockquote>
-
-<blockquote>
-
-  <p>&lt;Spring-Context&gt;*;create-asynchronously:=false&lt;/Spring-Context&gt;</p>
-
-</blockquote>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Please note that you <strong>do not</strong> need to have the Struts Spring plugin in your application, in order to use Spring with the OSGi plugin.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>If you want to use the Spring as the object factory for your actions, then follow these steps:</p>
-
-<ol>
-  <li>Place your Spring xml files under</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/META-INF/spring
-</code></pre>
-</div>
-<p>in the <strong>bundle</strong> jar file</p>
-
-<ol>
-  <li>Place your Spring xml files under</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/spring
-</code></pre>
-</div>
-<p>(they must be in the classpath, if you are using maven, put thme under /src/resources/spring) in the <strong>application</strong></p>
-
-<ol>
-  <li>Copy all the bundle jar files into</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/classes/bundles
-</code></pre>
-</div>
-<p>in your <strong>application</strong></p>
-
-<ol>
-  <li>Make sure that the following properties are set in struts.xml or struts.properties in your <strong>application</strong>:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;constant name="struts.objectFactory" value="osgi" /&gt;
-&lt;constant name="struts.objectFactory.delegate" value="springOsgi" /&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Configure your <strong>web.xml</strong> like:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
-
-    &lt;display-name&gt;Struts Blank&lt;/display-name&gt;
-
-    &lt;filter&gt;
-        &lt;filter-name&gt;struts2-prepare&lt;/filter-name&gt;
-        &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;
-    &lt;/filter&gt;
-
-    &lt;filter&gt;
-        &lt;filter-name&gt;struts2-execute&lt;/filter-name&gt;
-        &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;
-    &lt;/filter&gt;
-
-     &lt;filter-mapping&gt;
-        &lt;filter-name&gt;struts2-prepare&lt;/filter-name&gt;
-        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-    &lt;/filter-mapping&gt;
-
-    &lt;filter-mapping&gt;
-        &lt;filter-name&gt;struts2-execute&lt;/filter-name&gt;
-        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-    &lt;/filter-mapping&gt;
-
-    &lt;listener&gt;
-        &lt;listener-class&gt;org.apache.struts2.osgi.StrutsOsgiListener&lt;/listener-class&gt;
-    &lt;/listener&gt;
-
-    &lt;listener&gt;
-        &lt;listener-class&gt;org.apache.struts2.dispatcher.ng.listener.StrutsListener&lt;/listener-class&gt;
-    &lt;/listener&gt;
-
-    &lt;listener&gt;
-        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
-    &lt;/listener&gt;
-
-    &lt;context-param&gt;
-        &lt;param-name&gt;contextClass&lt;/param-name&gt;
-        &lt;param-value&gt;org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext&lt;/param-value&gt;
-    &lt;/context-param&gt;
-    &lt;context-param&gt;
-        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
-        &lt;param-value&gt;osgibundle:/META-INF/spring/*.xml&lt;/param-value&gt;
-    &lt;/context-param&gt;
-    &lt;context-param&gt;
-        &lt;param-name&gt;parentContextKey&lt;/param-name&gt;
-        &lt;param-value&gt;parent-context-bean&lt;/param-value&gt;
-    &lt;/context-param&gt;
-&lt;/web-app&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Add the Spring OSGi, and Spring Web dependencies to your web app, if you are using maven:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-    &lt;groupId&gt;org.springframework&lt;/groupId&gt;
-    &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
-    &lt;version&gt;2.5.5&lt;/version&gt;
-&lt;/dependency&gt;
-&lt;dependency&gt;
-     &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;
-     &lt;artifactId&gt;spring-osgi-web&lt;/artifactId&gt;
-     &lt;version&gt;1.1.2&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Download Spring OSGi and copy all the required bundles under <strong>/classes/bundles/2</strong>. For Struts OSGi 1.1.2, these are the required bundles:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-com.springsource.org.aopalliance-1.0.0.jar
-com.springsource.org.apache.commons.logging-1.1.1.jar
-org.springframework.aop-2.5.5.A.jar
-org.springframework.beans-2.5.5.A.jar
-org.springframework.context-2.5.5.A.jar
-org.springframework.core-2.5.5.A.jar
-org.springframework.osgi.core-1.1.2.A.jar
-org.springframework.osgi.extender-1.1.2.A.jar
-org.springframework.osgi.io-1.1.2.A.jar
-org.springframework.osgi.web-1.1.2.A.jar
-org.springframework.web-2.5.5.A.jar
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Put your bundles under <strong>/classes/bundles/3</strong></li>
-</ol>
-
-<p>####Using Velocity####</p>
-
-<p>If you are going to use Velocity results, then add Velocity and Common Digester jars to your application. Using maven:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-    &lt;groupId&gt;velocity&lt;/groupId&gt;
-    &lt;artifactId&gt;velocity&lt;/artifactId&gt;
-    &lt;version&gt;1.5&lt;/version&gt;
-&lt;/dependency&gt;
-
-&lt;dependency&gt;
-    &lt;groupId&gt;velocity-tools&lt;/groupId&gt;
-    &lt;artifactId&gt;velocity-tools&lt;/artifactId&gt;
-    &lt;version&gt;1.3&lt;/version&gt;
-&lt;/dependency&gt;
-
-&lt;dependency&gt;
-    &lt;groupId&gt;commons-digester&lt;/groupId&gt;
-    &lt;artifactId&gt;commons-digester&lt;/artifactId&gt;
-    &lt;version&gt;1.8&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>####Using The Convention Plugin####</p>
-
-<p>The Convention plugin will discover actions in bundles in the same way that it discovers them in normal applications. The Convention plugin expects result templates to be (by default) stored under <em>/WEB-INF/content</em> . When packaging actions inside bundles, there won’t be a <em>WEB-INF</em>  folder, so you must let Convention know where the templates are located. There are two ways of doing so(assuming the templates are under <em>/content</em> ):</p>
-
-<p>1. Set the templates location constant in struts.xml (in the application struts.xml, not a bundled struts.xml)</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;constant name="struts.convention.result.path" value="/content/"/&gt;
-
-</code></pre>
-</div>
-
-<p>2. Using the ResultPath annotation</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-@ResultPath("/content")
-public class HelloWorldAction extends ActionSupport
-...
-}
-
-</code></pre>
-</div>
-
-<p>####The OSGi interceptor####</p>
-
-<p>The OSGi plugins defines the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>osgi
-</code></pre>
-</div>
-<p>interceptor and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>osgiStack
-</code></pre>
-</div>
-<p>(</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>defaultStack
-</code></pre>
-</div>
-<p>plus the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>osgi
-</code></pre>
-</div>
-<p>interceptor) in the package</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>osgi-default
-</code></pre>
-</div>
-<p>. This interceptor will check the action and if it implements</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.osgi.interceptor.BundleContextAware
-</code></pre>
-</div>
-<p>, it will invoke setBundleContext(BundleContext bundleContext) on the action, passing the BundleContext of the OSGi container. The interceptor also checks if the class implements</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.osgi.interceptor.ServiceAware&lt;T&gt;
-</code></pre>
-</div>
-<p>, if it does, setServices(List&lt;T&gt; services) will be called, where T is the type of a service published in the OSGi container. For example, lets assume an installed bundle publishes a service with the interface</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>BookPriceLookup
-</code></pre>
-</div>
-<p>, to get all the instances of this service, an action would look like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class BookPriceAction extends ActionSupport implements ServiceAware&lt;BookPriceLookup&gt; {
-    private List&lt;BookPriceLookup&gt; services;
-
-    public void setServices(List&lt;BookPriceLookup&gt; services) {
-        this.services = services;
-    }
-}
-
-</code></pre>
-</div>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Keep in mind that the interceptor is not defined in the default struts package, so when using Convention, you need to specify the parent package as “osgi-default”, either using annotations (@ParentPackage), or XML(<strong>this XML fragment must be in the struts XML config file in the application, not the bundle’s</strong>, this is a current limitation of the OSGi plugin):</p>
-</blockquote>
-
-<blockquote>
-
-  <p>&lt;constant name=”struts.convention.default.parent.package” value=”osgi-default” /&gt;</p>
-
-  <p>####Admin bundle####</p>
-</blockquote>
-
-<p>An admin bundle is distributed with struts, which provides a simple interface to list the installed bundles. Using this interface the bundles can be stopped, started and updated (reloaded from the file system). This interface also provides information on the installed bundles, like OSGi metadata, and a list of packages and actions loaded from each bundle. An interactive AJAX shell is also available, which is just a web interface to the Apache Felix Shell. To use this bundle, just copy [...]
-
-<p>####About stopping/starting bundles####</p>
-
-<p>When a bundle is started, the OSGi plugin will check for the header</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>Struts2-Enabled
-</code></pre>
-</div>
-<p>in it. If it is set to “true”, the bundle will be scanned for XML config and Convention config. When a bundle is stopped, any actions that were loaded from it will be removed from the runtime configuration.</p>
-
-<p>####Settings####</p>
-
-<p>The following settings can be customized.  See the <a href="http://cwiki\.apache\.org/confluence/display/WW/Configuration\+Files">developer guide</a>^[http://cwiki.apache.org/confluence/display/WW/Configuration+Files].</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.objectFactory.delegate</td>
-      <td>The alias of the ObjectFactory to wrap</td>
-      <td>struts</td>
-      <td>Any configured alias</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>The following setting must be set as context parameters in <em>web.xml</em> , because they are used by the StrutsOsgiListener, for example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;context-param&gt;
-    &lt;param-name&gt;struts.osgi.clearBundleCache&lt;/param-name&gt;
-    &lt;param-value&gt;false&lt;/param-value&gt;
-&lt;/context-param&gt;
-
-</code></pre>
-</div>
-
-<p>If you are running your application on Glassfish 3 (which already contains Apache Felix) you must specify</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.osgi.host
-</code></pre>
-</div>
-<p>, like below:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;context-param&gt;
-    &lt;param-name&gt;struts.osgi.host&lt;/param-name&gt;
-    &lt;param-value&gt;Glassfish&lt;/param-value&gt;
-&lt;/context-param&gt;
-
-</code></pre>
-</div>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.osgi.clearBundleCache</td>
-      <td>Delete all installed bundles when the container starts</td>
-      <td>true</td>
-      <td>true or false</td>
-    </tr>
-    <tr>
-      <td>struts.osgi.runLevel</td>
-      <td>Run level to start the container</td>
-      <td>3</td>
-      <td>&gt;=3</td>
-    </tr>
-    <tr>
-      <td>struts.osgi.logLevel</td>
-      <td>Log level for Apache Felix</td>
-      <td>1 (Error)</td>
-      <td>1 = error, 2 = warning, 3 = information, and 4 = debug</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Building bundles with Maven####</p>
-
-<p>Jar files can be turned into bundles using the <a href="http://cwiki\.apache\.org/FELIX/bundle\-plugin\-for\-maven\-bnd\.html">Maven Bundle Plugin</a>^[http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd.html] like:</p>
-
-<p><strong>Maven Bundle Plugin Example</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;build&gt;
-    &lt;plugins&gt;
-        &lt;plugin&gt;
-            &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;
-            &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;
-            &lt;extensions&gt;true&lt;/extensions&gt;
-            &lt;version&gt;2.0.0&lt;/version&gt;
-            &lt;configuration&gt;
-                &lt;instructions&gt;
-                    &lt;manifestLocation&gt;META-INF&lt;/manifestLocation&gt;
-                    &lt;Struts2-Enabled&gt;true&lt;/Struts2-Enabled&gt;
-                    &lt;Export-Package&gt;org.apache.struts2.osgi.demo&lt;/Export-Package&gt;
-                    &lt;Import-Package&gt;*,com.opensymphony.xwork2&lt;/Import-Package&gt;
-                    &lt;Spring-Context&gt;*;create-asynchronously:=false&lt;/Spring-Context&gt;
-                &lt;/instructions&gt;
-            &lt;/configuration&gt;
-        &lt;/plugin&gt;
-    &lt;/plugins&gt;
-&lt;/build&gt;
-
-</code></pre>
-</div>
-
-<p>####Struts OSGi + Spring OSGi diagram####</p>
-
-<p><img src="/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att10437\_struts\-osgi\.jpg" alt="struts-osgi.jpg" /></p>
-
-<p>####Resources####</p>
-
-<ul>
-  <li>
-    <p><a href="http://www\.osgi\.org">OSGi</a>^[http://www.osgi.org]</p>
-  </li>
-  <li>
-    <p><a href="http://felix\.apache\.org">Apache Felix</a>^[http://felix.apache.org]</p>
-  </li>
-  <li>
-    <p><a href="http://www\.springsource\.org/osgi">Spring OSGi </a>^[http://www.springsource.org/osgi]</p>
-  </li>
-</ul>
-
-<p>##OVal Plugin## {#PAGE_114997}</p>
-
-<p>####Overview####</p>
-
-<p><a href="http://oval\.sourceforge\.net/">OVal</a>^[http://oval.sourceforge.net/] is a pragmatic and extensible validation framework for any kind of Java objects (not only JavaBeans). Constraints can be declared with annotations (@NotNull, @MaxLength), POJOs or XML.Custom constraints can be expressed as custom Java classes or by using scripting languages such as JavaScript, Groovy, BeanShell, OGNL or MVEL.</p>
-
-<p>The OVal plugin</p>
-
-<p>provides support for using the <a href="http://oval\.sourceforge\.net/">OVal Validation Framework</a>^[http://oval.sourceforge.net/]</p>
-
-<p>####Interceptors####</p>
-
-<p>The plugin defines the interceptor “ovalValidation” and the interceptor stack “ovalValidationStack” in the “oval-default” package. To use this interceptor, extend the “oval-default” package and apply the interceptor to your action, like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;struts&gt;
-   &lt;package namespace="/myactions" name="myactions" extends="oval-default"&gt;
-        &lt;action name="simpleFieldsXMLChild" class="org.apache.struts2.interceptor.SimpleFieldsXMLChild"&gt;
-            &lt;interceptor-ref name="ovalValidationStack"/&gt;
-            &lt;result type="void"&gt;&lt;/result&gt;
-        &lt;/action&gt;
-   &lt;/package&gt;
-&lt;/struts&gt;
-
-</code></pre>
-</div>
-
-<p>####Annotations####</p>
-
-<p>OVal provides many annotations for validations that can be used out of the box (custom validators can also be defined). Once the “ovalValidation” interceptor is applied to an action, you can annotate it:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class SimpleField extends ActionSupport{
-    @NotNull()
-    @NotEmpty
-    @Length(max = 3)
-    private String name;
-...
-}
-
-</code></pre>
-</div>
-
-<p>Use the @AssertValid annotation to validate nested objects, like</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class MemberObject extends ActionSupport {
-    @AssertValid
-    private Person person = new Person();
-
-    public Person getPerson() {
-        return person;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>####XML Configuration####</p>
-
-<p>OVal provides support for defining the validation via XML. Validation files must end in “-validation.xml” and the rules to find them, are the same rules used to find the validation XML files used by the regular validation mechanisms (default validation in xwork):</p>
-
-<ol>
-  <li>
-    <p>Per Action class: in a file named ActionName-validation.xml</p>
-  </li>
-  <li>
-    <p>Per Action alias: in a file named ActionName-alias-validation.xml</p>
-  </li>
-  <li>
-    <p>Inheritance hierarchy and interfaces implemented by Action class: The plugin searches up the inheritance tree of the action to find default validations for parent classes of the Action and interfaces implemented</p>
-  </li>
-</ol>
-
-<p>Here is an example of an XML validation file:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-&lt;oval xmlns="http://oval.sf.net/oval-configuration" xmlns:xsi="http://http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration-1.3.xsd"&gt;
-    &lt;class type="org.apache.struts2.interceptor.SimpleFieldsXML" overwrite="false"
-           applyFieldConstraintsToSetters="true"&gt;
-        &lt;field name="firstName"&gt;
-            &lt;notNull/&gt;
-        &lt;/field&gt;
-    &lt;/class&gt;
-&lt;/oval&gt;
-
-</code></pre>
-</div>
-
-<p>####Profiles####</p>
-
-<p>A profile is a set of validations, that can be enabled for a method in an action, for example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-import org.apache.struts2.validation.Profiles;
-
-public class FieldsWithProfiles extends ActionSupport {
-    @NotNull(profiles = "1")
-    private String firstName;
-
-    @NotNull(profiles = "2")
-    private String middleName;
-
-    @NotNull(profiles = "3")
-    private String lastName;
-
-    @Profiles({"1", "3"})
-    public String firstAndLast() {
-        return SUCCESS;
-    }
-
-    @Profiles({"2"})
-    public void middle() {
-        return SUCCESS;
-    }
-}
-
-</code></pre>
-</div>
-
-<p>In this example, when <em>firstAndLast()</em>  is executed, the fields <em>firstName</em>  and <em>lastName</em>  will be validated. When <em>middle()</em>  is executed, only <em>middleName</em>  will be validated. When a method is annotated with the <em>Profiles</em>  annotation, only the validations in the specified profiles will be performed. If no profile is specified for an action method, all the validations in the class will be evaluated.</p>
-
-<p>####Internationalization of messages####</p>
-
-<p>The OVal annotations (and corresponding XML tags) have a <em>message</em>  attribute that can be used to specify either the error message, or the key of the error message. If a key is found in a property file, matching the value of the <em>massage</em>  attribute, it will be used as the message, otherwise the value will be used as a literal string. For example, given this property file:</p>
-
-<p><strong>BookAction.properties</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-notnull.field=${field.name} cannot be null
-
-field.too.long=${field.name} value is too long, allowed length is ${max}
-
-</code></pre>
-</div>
-
-<p>and this class:</p>
-
-<p><strong>BookAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class BookActionextends ActionSupport {
-    @NotNull(message = "notnull.field")
-    @Length(max = 3, message = "field.too.long")
-    private String title;
-
-    @NotNull(message = "You must enter a valid ISBN")
-    private String isbn;
-...
-}
-
-</code></pre>
-</div>
-
-<p>When that action is validated, the field errors would be:</p>
-
-<ul>
-  <li>
-    <p>“title cannot be null”</p>
-  </li>
-  <li>
-    <p>“You must enter a valid ISBN”</p>
-  </li>
-  <li>
-    <p>“title value is too long, allowed length is 3”</p>
-  </li>
-</ul>
-
-<p>The current OVal “context” object is pushed into the stack for each validator, so it can be accessed from the property file to build the error message. See the <a href="http://oval\.sourceforge\.net/api/net/sf/oval/context/FieldContext\.html">OVal javadoc</a>^[http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext.html] for more properties available in the FieldContext class.</p>
-
-<p>####The OVal Validation Interceptor####</p>
-
-<p>This interceptor runs the action through the standard validation framework, which in turn checks the action against any validation rules (found in files such as ActionClass-validation.xml) and adds field-level and action-level error messages (provided that the action implements com.opensymphony.xwork2.ValidationAware). This interceptor is often one of the last (or second to last) interceptors applied in a stack, as it assumes that all values have already been set on the action.</p>
-
-<p>This interceptor does nothing if the name of the method being invoked is specified in the <em>excludeMethods</em>  parameter. <em>excludeMethods</em>  accepts a comma-delimited list of method names. For example, requests to foo!input.action and foo!back.action will be skipped by this interceptor if you set the excludeMethods parameter to “input, back”.</p>
-
-<p>Note that this has nothing to do with the com.opensymphony.xwork2.Validateable interface and simply adds error messages to the action. The workflow of the action request does not change due to this interceptor. Rather, this interceptor is often used in conjuction with the workflow interceptor.</p>
-
-<p>NOTE: As this method extends off MethodFilterInterceptor, it is capable of deciding if it is applicable only to selective methods in the action class. See MethodFilterInterceptor for more info.</p>
-
-<p>The param <em>alwaysInvokeValidate</em>  (default to <em>true</em> ), will make the interceptor invoke <em>validate()</em>  on the action, if the action implements <em>Validateable</em> .</p>
-
-<p>The param <em>programmatic</em>  (defaults to <em>true</em> ), will make the plugin call <em>validateX()</em>  where <em>X</em>  is the name of the method that will be invoked in the action. If this param is set to <em>false</em> , <em>alwaysInvokeValidate</em>  is ignored and <em>validate()</em>  won’t be invoked.</p>
-
-<p>####Installation####</p>
-
-<p>The jar plugin needs to be added to the lib directory of your application as well as other dependencies. If you are using XML validation, XStream needs to be included. Here is the maven dependency example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-    &lt;groupId&gt;com.thoughtworks.xstream&lt;/groupId&gt;
-    &lt;artifactId&gt;xstream&lt;/artifactId&gt;
-    &lt;version&gt;1.3.1&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>###Configuration reference###</p>
-
-<p>Add a <em>constant</em>  element to your struts config file to change the value of a configuration setting, like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
- &lt;constant name="struts.oval.validateJPAAnnotations" value="true" /&gt;
-
-</code></pre>
-</div>
-
-<table>
-  <thead>
-    <tr>
-      <th>Name</th>
-      <th>Default Value</th>
-      <th>Description</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.oval.validateJPAAnnotations</td>
-      <td>false</td>
-      <td>Enables <a href="http://oval\.sourceforge\.net/userguide\.html\#d0e242">mapping of JPA annotations to Oval validators</a>^[http://oval.sourceforge.net/userguide.html#d0e242]</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Resources####</p>
-
-<ul>
-  <li>
-    <p><a href="http://oval\.sourceforge\.net/userguide\.html">OVal User Guide</a>^[http://oval.sourceforge.net/userguide.html]</p>
-  </li>
-  <li>
-    <p><a href="http://oval\.sourceforge\.net/userguide\.html">OVal Javadoc</a>^[http://oval.sourceforge.net/userguide.html]</p>
-  </li>
-  <li>
-    <p><a href="http://oval\.sourceforge\.net/userguide\.html\#d0e1138">OVal Tutorials</a>^[http://oval.sourceforge.net/userguide.html#d0e1138]</p>
-  </li>
-</ul>
-
-<p>##Plexus Plugin## {#PAGE_44204}</p>
-
-<p>(!)  The Plexus Plugin is experimental. Feedback is appreciated!</p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>While <a href="http://plexus\.codehaus\.org/">Plexus</a>^[http://plexus.codehaus.org/]is similar to other inversion-of-control (IoC) or dependency injection frameworks such as the Spring Framework, it’s fully-fledged container supports many more features.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>The Plexus plugin</p>
-
-<p>enables Struts Actions, Interceptors, and Results to be created and injected by <a href="http://plexus\.codehaus\.org/">Plexus</a>^[http://plexus.codehaus.org/]</p>
-
-<p>This plugin provides an <em>ObjectFactory</em>  implementation that tries to create Struts Action, Interceptor, and Result classes as Plexus objects.</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>Allows Actions, Results, and Interceptors to be created and managed by Plexus</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To use the plugin, when configuring Struts Actions, Interceptors, or Results in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>, set the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>class
-</code></pre>
-</div>
-<p>attribute to contain the Plexus object id, rather than the actual Java class.  This will allow Plexus to create the object and inject any dependencies also managed by Plexus.</p>
-
-<p>#####Example#####</p>
-
-<p><strong>A simple Action using a Plexus id</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="myAction" class="myPlexusId"&gt;
-  &lt;result&gt;myAction.jsp&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>#####Settings#####</p>
-
-<p>The following settings can be customized.  See the <a href="http://cwiki\.apache\.org/confluence/display/WW/Configuration\+Files">developer guide</a>^[http://cwiki.apache.org/confluence/display/WW/Configuration+Files].</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.objectFactory</td>
-      <td>The name or class name of the ObjectFactory implementation to use</td>
-      <td>plexus</td>
-      <td>plexus, struts, or any class that extends ObjectFactory</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Installation#####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>##Plugins## {#PAGE_13868}</p>
-
-<p>Struts 2 plugins contain classes and configuration that extend, replace, or add to existing Struts framework functionality. A plugin can be installed by adding its JAR file to the application’s class path, in addition to the JAR files to fulfill whatever dependencies the plugin itself may have. To configure the plugin, the JAR should contain a</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-plugin.xml
-</code></pre>
-</div>
-<p>file, which follows the same format as an ordinary</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>file.</p>
-
-<p>Since a plugin can contain the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-plugin.xml
-</code></pre>
-</div>
-<p>file, it has the ability to:</p>
-
-<ul>
-  <li>
-    <p>Define new packages with results, interceptors, and/or actions</p>
-  </li>
-  <li>
-    <p>Override framework constants</p>
-  </li>
-  <li>
-    <p>Introduce new extension point implementation classes</p>
-  </li>
-</ul>
-
-<p>Many popular but optional features of the framework are distributed as plugins. An application can retain all the plugins provided with the distribution, or just include the ones it uses. Plugins can be used to organize application code or to distribute code to third-parties.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Packages defined in a plugin can have parent packages that are defined in another plugin. Plugins may define configuration elements with classes not contained in the plugin. Any classes not included in the plugin’s JAR must be on the application’s classpath at runtime. As from Struts 2.3.5</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>The framework loads its default configuration first, then any plugin configuration files found in others JARs on the classpath, and finally the “bootstrap”</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>.</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-default.xml
-</code></pre>
-</div>
-<p>(bundled in the Core JAR)</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-plugin.xml
-</code></pre>
-</div>
-<p>(as many as can be found in other JARs)</p>
-
-<ol>
-  <li></li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>(provided by your application)</p>
-
-<p>Since the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>file is always loaded last, it can make use of any resources provided by the plugins bundled with the distribution, or any other plugins available to an application.</p>
-
-<p>####Static resources####</p>
-
-<p>To include static resources in your plugins add them under “/static” in your jar. And include them in your page using “/struts” as the path, like in the following example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>Assuming /static/main.css is inside a plugin jar, to add it to the page:
-
-&lt;@s.url value="/struts/main.css" var="css" /&gt;
-&lt;link rel="stylesheet" type="text/css" href="%{#css}" /&gt;
-
-</code></pre>
-</div>
-
-<p>Read also <a href="http://struts\.apache\.org/2\.x/struts2\-core/apidocs/org/apache/struts2/dispatcher/StaticContentLoader\.html">StaticContentLoader JavaDoc</a>^[http://struts.apache.org/2.x/struts2-core/apidocs/org/apache/struts2/dispatcher/StaticContentLoader.html].</p>
-
-<p>####Extension Points####</p>
-
-<p>Extension points allow a plugin to override a key class in the Struts framework with an alternate implementation. For example, a plugin could provide a new class to create Action classes or map requests to Actions.</p>
-
-<p>The following extension points are available in Struts 2:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=extensionPoints|javadoc=true|url=org.apache.struts2.config.DefaultBeanSelectionProvider</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>####Plugin Examples####</p>
-
-<p>Let’s look at two similar but different plugins bundled with the core distribution.</p>
-
-<p>#####Sitemesh plugin#####</p>
-
-<p><a href="http://opensymphony\.com/sitemesh/">SiteMesh</a>^[http://opensymphony.com/sitemesh/] is a popular alternative to Tiles. SiteMesh provides a common look-and-feel to an application’s pages by automatically wrapping a plain page with common elements like headers and menubars.</p>
-
-<p>The</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>sitemesh-plugin.jar
-</code></pre>
-</div>
-<p>contains several classes, a standard JAR manifest, and a plugin configuration file.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code> + META-INF/
-   + manifest.mf
- + org
-   + apache
-     + struts2
-       + sitemesh
-         + FreeMarkerPageFilter.class
-         + TemplatePageFilter.class
-         + VelocityPageFilter.class
- + struts-plugin.xml
-
-</code></pre>
-</div>
-
-<p>While the SiteMesh Plugin doesn’t provide any new results, interceptors, or actions, or even extend any Struts integration points, it does need to know what settings have been enabled in the Struts framework. Therefore, its</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-plugin.xml
-</code></pre>
-</div>
-<p>looks like this:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=all|lang=xml|url=struts2/plugins/sitemesh/src/main/resources/struts-plugin.xml</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>The two bean elements, with the “static” flag enabled, tell Struts to inject the current settings and framework objects into static property setters on startup. This allows, for example, the FreeMarkerPageFilter class to get an instance of the Struts FreemarkerManager and the current encoding setting.</p>
-
-<p>#####Tiles plugin#####</p>
-
-<p><a href="http://struts\.apache\.org/struts\-sandbox/tiles/index\.html">Tiles</a>^[http://struts.apache.org/struts-sandbox/tiles/index.html] is a popular alternative to SiteMesh. Tiles provides a common look-and-feel to an application’s pages by breaking the page down into common fragments or “tiles”.</p>
-
-<p>The</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>tiles-plugin.jar
-</code></pre>
-</div>
-<p>contains several classes, a standard JAR manifest, and a configuration file.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code> + META-INF/
-   + manifest.mf
- + org
-   + apache
-     + struts2
-       + tiles
-         + StrutsTilesListener.class
-         + StrutsTileUtilImpl.class
-       + views
-         + tiles
-           + TilesResult.class
-   + struts-plugin.xml
-
-</code></pre>
-</div>
-
-<p>Since the Tiles Plugin does need to register configuration elements, a result class, it provides a</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts-plugin.xml
-</code></pre>
-</div>
-<p>file.</p>
-
-<p>####Plugin Registry####</p>
-
-<p>(ok)  For a list of bundled plugins, see the <a href="#PAGE_44163">Plugin Reference Documentation</a>. For more about bundled and third-party plugins, visit the <a href="http://cwiki\.apache\.org/S2PLUGINS/home\.html">Apache Struts Plugin Registry</a>^[http://cwiki.apache.org/S2PLUGINS/home.html].</p>
-
-<p>####Back to####</p>
-
-<p>##Portlet Plugin## {#PAGE_74033}</p>
-
-<p>###Documentation###</p>
-
-<p><strong>The Portlet Plugin</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>is used for developing JSR286 portlets using Struts 2</p>
-</blockquote>
-
-<blockquote>
-  <p><strong>.</strong></p>
-</blockquote>
-
-<p>####portlet-class####</p>
-
-<p>To use the Struts 2 Portlet framework, use **<em>org.apache.struts2.portlet.dispatcher.Jsr286Dispatcher</em> ** as the portlet class in your portlet.xml file:</p>
-
-<p><strong>portlet.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-
-<span class="nt">&lt;portlet-app</span> <span class="na">id=</span><span class="s">"my-portlet-app"</span>
-	<span class="na">xmlns=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"</span>
-	<span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class="na">version=</span><span class="s">"2.0"</span>
-	<span class="na">xsi:schemaLocation=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"</span><span class="nt">&gt;</span>
-
-    <span class="nt">&lt;portlet</span> <span class="na">id=</span><span class="s">"MyPortlet"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;description</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>My Portlet<span class="nt">&lt;/description&gt;</span>
-        <span class="nt">&lt;portlet-name&gt;</span>MyPortlet<span class="nt">&lt;/portlet-name&gt;</span>
-        <span class="nt">&lt;display-name</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>my-portlet<span class="nt">&lt;/display-name&gt;</span>
-    
-        <span class="nt">&lt;portlet-class&gt;</span>org.apache.struts2.portlet.dispatcher.Jsr286Dispatcher<span class="nt">&lt;/portlet-class&gt;</span>
-        
-        <span class="c">&lt;!-- SNIP --&gt;</span>
-
-    <span class="nt">&lt;/portlet&gt;</span>
-<span class="nt">&lt;/portlet-app&gt;</span>
-
-</code></pre>
-</div>
-
-<p>####Portlet Init Parameters####</p>
-
-<p>Below is the init-param elements that you can set up in <em>portlet.xml</em>  for configuring the portlet mode -&gt; xwork namespace mappings for the portlet. Basically, you can think of the different portlet modes as different sub-applications, so it can be useful to set up the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>configuration with different namespaces for the different portlets and modes:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Key</th>
-      <th>Description</th>
-      <th>Default</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>portletNamespace</td>
-      <td>The namespace for the portlet in the action configuration. This namespace is prepended to all action lookups, and makes it possible to host multiple portlets in the same portlet application. If this parameter is set, the complete namespace will be <em>/portletNamespace/modeNamespace/actionName</em></td>
-      <td>The default namespace.</td>
-    </tr>
-    <tr>
-      <td>viewNamespace</td>
-      <td>The namespace in the xwork config for the view portlet mode.</td>
-      <td>The default namespace.</td>
-    </tr>
-    <tr>
-      <td>editNamespace</td>
-      <td>The namespace in the xwork config for the edit portlet mode.</td>
-      <td>The default namespace.</td>
-    </tr>
-    <tr>
-      <td>helpNamespace</td>
-      <td>The namespace in the xwork config for the help portlet mode.</td>
-      <td>The default namespace.</td>
-    </tr>
-    <tr>
-      <td>defaultViewAction</td>
-      <td>Name of the action to use as default for the view portlet mode, when no action name is present.</td>
-      <td>default</td>
-    </tr>
-    <tr>
-      <td>defaultEditAction</td>
-      <td>Name of the action to use as default for the edit portlet mode, when no action name is present.</td>
-      <td>default</td>
-    </tr>
-    <tr>
-      <td>defaultHelpAction</td>
-      <td>Name of the action to use as default for the help portlet mode, when no action name is present.</td>
-      <td>default</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>e.g.</p>
-
-<p><strong>portlet.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;init-param&gt;
-    &lt;!-- Portlet namespace --&gt;
-    &lt;name&gt;portletNamespace&lt;/name&gt;
-    &lt;value&gt;/portletA&lt;/value&gt;
-&lt;/init-param&gt;
-&lt;init-param&gt;
-    &lt;!-- The base namespace of the view portlet mode --&gt;
-    &lt;name&gt;viewNamespace&lt;/name&gt;
-    &lt;value&gt;/view&lt;/value&gt;
-&lt;/init-param&gt;
-&lt;init-param&gt;
-    &lt;!-- The default action to invoke in view mode --&gt;
-    &lt;name&gt;defaultViewAction&lt;/name&gt;
-    &lt;value&gt;index&lt;/value&gt;
-&lt;/init-param&gt;
-
-</code></pre>
-</div>
-
-<p>This snippet from</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>portlet.xml
-</code></pre>
-</div>
-<p>will set up the portlet with a namespace of <em>/portletA/. This means that all requests to this portlet will get the namespace prepended when looking up the action. In addition, the _view</em>  portlet mode will map to the <em>/view</em>  namespace, so a request for action</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>myAction
-</code></pre>
-</div>
-<p>will resolve to the namespace and action <em>/portletA/view/myAction</em> . It also means that if no action is requested, the default action of</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>index
-</code></pre>
-</div>
-<p>will be used for the request.</p>
-
-<p>####web.xml####</p>
-
-<p>If you want to access to expose the value stack through request attributes (e.g. if you want to use regular JSTL tags to access values in the stack), you have to configure the dispatcher servlet in your web application descriptor:</p>
-
-<p><strong>web.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;servlet id="Struts2PortletDispatcherServlet"&gt;
-    &lt;servlet-name&gt;Struts2PortletDispatcherServlet&lt;/servlet-name&gt;
-    &lt;servlet-class&gt;org.apache.struts2.portlet.dispatcher.DispatcherServlet&lt;/servlet-class&gt;
-&lt;/servlet&gt;
-
-</code></pre>
-</div>
-
-<table>
-  <tbody>
-    <tr>
-      <td><strong>If you’re only using Struts 2 tags, configuring the dispatcher servlet is optional</strong></td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Portlet Phases####</p>
-
-<p>The portlet specification describes that a portlet request cycle can consist of two phases, an <em>event</em>  phase and a <em>render</em>  phase. In case of an <em>event</em>  in the portlet, it will always execute before the <em>render</em>  phase. The <em>event</em>  phase is typically for changing the state of the application. In a portlet, this is typically when a form is submitted. The <em>render</em>  phase will then prepare and dispatch to the view. It’s recommended that you s [...]
-
-<p>####Portlet Result Dispatching####</p>
-
-<p>The <em>struts-portlet-default</em>  package defines a special default Result Type, which is responsible for performing the result logic of an Action execution. Typically, this involves including a JSP for rendering, or preparing a render action if one is configured for the current event action.</p>
-
-<p>This result type has three main modes of execution.</p>
-
-<ul>
-  <li>
-    <p>If the Action is executed in the render phase, it will perform a PortletRequestDispatcher.include(req, res) to the resource specified in the <em>location</em>  attribute.</p>
-  </li>
-  <li>
-    <p>If the Action is executed in the event phase, and the result is an action mapping, it will set a render parameter on the ActionResponse to indicate which Action should be executed in the render phase. This follows good web application design, which promotes the use of a redirect after an event, which in this case means that an Action executed in the event phase will be followed by a redirect to an Action executed in the render phase.</p>
-  </li>
-  <li>
-    <p>If the Action is executed in the event phase, and the result is not an action mapping, the result will prepare a special Action called “renderDirect” (specified in the <em>struts-portlet-default</em>  package) whose sole purpose is to render the specified web resource (usually a JSP).</p>
-  </li>
-</ul>
-
-<p>#####redirectAction#####</p>
-
-<p>The action executed in event mode can pass render parameters to the next action to execute in render mode through parameters using the <em>redirectAction</em>  result type:</p>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result type="redirectAction" name="success"&gt;
-    &lt;param name="actionName"&gt;displayCart&lt;/param&gt;
-    &lt;param name="userId"&gt;${userId}&lt;/param&gt;  
-    &lt;!-- If you want to redirect to a different portlet mode, use the portletMode parameter 
-    &lt;param name="portletMode"&gt;view&lt;/param&gt;
-    --&gt;
-&lt;/result&gt;
-
-</code></pre>
-</div>
-
-<p>This will set up a <em>render parameter</em>  called <em>userId</em>  with the value of the <em>userId</em>  property on the value stack.</p>
-
-<p>You can also use the <em>portletMode</em>  parameter to change to a different portlet mode.</p>
-
-<p>####s:url and s:form tags####</p>
-
-<p>URLs in a portlet is handled quite different than for a regular web application. There’s no such thing as “extension”, there’s simply an action name and a namespace, and they have to be specified using the respective tag attributes. URLs using the <em>value</em>  attribute will be encoded as a resource URL and is only suitable for additional resources such as images and style sheets.</p>
-
-<p>Example:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Servlet</th>
-      <th>Portlet</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>&lt;s:url value=”hello.action”/&gt;</td>
-      <td>&lt;s:url action=”hello”/&gt;</td>
-    </tr>
-    <tr>
-      <td>&lt;s:url value=”style.css”/&gt;</td>
-      <td>&lt;s:url value=”style.css”/&gt;</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>In addition, there are some additional tag attributes that are portlet specific. These are:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Name</th>
-      <th>Description</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>portletMode</td>
-      <td>The resulting portlet mode of the url</td>
-    </tr>
-    <tr>
-      <td>windowState</td>
-      <td>The resulting window state of the url</td>
-    </tr>
-    <tr>
-      <td>portletUrlType</td>
-      <td>Specifies if this is a <em>render</em>  or an <em>action</em>  url</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>Typical usage for the <em>portletUrlType</em>  is if you have a <em>delete</em>  link that removes something from a database. To ensure this is done in the event phase, as recommended by the portlet specification (since it is a change of state), the url can use this attribute, e.g. &lt;s:url action=”deleteEntry” portletUrlType=”action”/&gt;</p>
-
-<p>####Security####</p>
-
-<p>Basically the Struts2 Portlet Plugin doesn’t support different auth level in the same portlet. If you want to achieve that you must create two separated portlets and configure access level with portlet engine for each of them.</p>
-
-<p>####Other resources####</p>
-
-<p><a href="#PAGE_71458">Struts 2 Portlet Tutorial</a>
-<a href="http://jcp\.org/aboutJava/communityprocess/final/jsr168/index\.html"> JSR168 Specification</a>^[http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html]
-<a href="http://jcp\.org/aboutJava/communityprocess/final/jsr286/index\.html">JSR286 Specification</a>^[http://jcp.org/aboutJava/communityprocess/final/jsr286/index.html]</p>
-
-<p>###Struts 2 Portlet Tutorial### {#PAGE_71458}</p>
-
-<p>####Struts 2 Portlet Tutorial - Creating a simple Bookmark Portlet####</p>
-
-<p>Using version 2.1.1-SNAPSHOT of the portlet plugin</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>(i) Note that this tutorial assumes that you’re familiar with basic Struts 2 web application programming.</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>If you have not used Struts 2 before, please check out some of the other Struts 2 tutorials first.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>#####Preparations#####</p>
-
-<p>In this tutorial we will use eclipse as our IDE. If you do not have Eclipse, you can download it from <a href="http://www\.eclipse\.org">http://www.eclipse.org</a>.</p>
-
-<p>The project itself will be set up using Maven 2. Maven 2 is available from <a href="http://maven\.apache\.org">http://maven.apache.org</a>.</p>
-
-<p>If you have not used the maven-eclipse-plugin before, you need to set up the Eclipse workspace with a variable that points to the Maven 2 repository. To do this, type</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>mvn -Declipse.workspace=&lt;path-to-eclipse-workspace&gt; eclipse:add-maven-repo
-</code></pre>
-</div>
-
-<p>#####Creating the project#####</p>
-
-<p>We’ll use Maven 2 with the Struts 2 Portlet Archetype to create a skeleton project for our portlet application. From the command line, issue the command:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>mvn archetype:create -DarchetypeGroupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-portlet -DarchetypeVersion=2.1.1-SNAPSHOT -DartifactId=bookmark-portlet 
-    -DgroupId=com.mycompany -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository
-</code></pre>
-</div>
-
-<p>This will set up the maven 2 structure for us and also set up the basic configuration needed to create a Struts 2 portlet. The archetype creates a sample HelloWorld portlet that shows off some of the basic principles of Struts 2 portlet programming. To test the set up, type</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>mvn jetty:run -P pluto-embedded
-</code></pre>
-</div>
-
-<p>in a command prompt. Open a browser and point your browser to <a href="http://localhost:8080/bookmark\-portlet/pluto/index\.jsp">http://localhost:8080/bookmark-portlet/pluto/index.jsp</a> and play around.</p>
-
-<p>#####Looking at the basics#####</p>
-
-<p>To see how the basic HelloWorld example works, let’s look at some of the configuration files, starting with the JSR168 portlet descriptor</p>
-
-<p><strong>src/main/webapp/WEB-INF/portlet.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;
-
-&lt;portlet-app
-   version="1.0"
-   xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
-   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-   xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
-   id="bookmark-portlet"&gt;
-
-   &lt;portlet id="HelloPortlet"&gt;
-      &lt;description xml:lang="EN"&gt;Simple hello world portlet&lt;/description&gt;
-      &lt;portlet-name&gt;HelloPortlet&lt;/portlet-name&gt;
-      &lt;display-name xml:lang="EN"&gt;bookmark-portlet&lt;/display-name&gt;
-		
-      &lt;portlet-class&gt;org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher&lt;/portlet-class&gt;
-		
-      &lt;!-- The namespace for the actions configured for view mode --&gt;
-      &lt;init-param&gt;
-         &lt;name&gt;viewNamespace&lt;/name&gt;
-         &lt;value&gt;/view&lt;/value&gt;
-      &lt;/init-param&gt;
-		
-      &lt;!-- The default action to invoke in view mode. --&gt;
-      &lt;init-param&gt;
-         &lt;name&gt;defaultViewAction&lt;/name&gt;
-         &lt;value&gt;index&lt;/value&gt;
-      &lt;/init-param&gt;
-		
-      &lt;!-- The namespace for the actions configured for edit mode --&gt;
-      &lt;init-param&gt;
-         &lt;name&gt;editNamespace&lt;/name&gt;
-         &lt;value&gt;/edit&lt;/value&gt;
-      &lt;/init-param&gt;
-		
-      &lt;!-- The default action to invoke in edit mode. --&gt;
-      &lt;init-param&gt;
-         &lt;name&gt;defaultEditAction&lt;/name&gt;
-         &lt;value&gt;index!input&lt;/value&gt;
-      &lt;/init-param&gt;
-		
-      &lt;expiration-cache&gt;0&lt;/expiration-cache&gt;
-		
-      &lt;supports&gt;
-         &lt;mime-type&gt;text/html&lt;/mime-type&gt;
-         &lt;portlet-mode&gt;view&lt;/portlet-mode&gt;
-         &lt;portlet-mode&gt;edit&lt;/portlet-mode&gt;
-      &lt;/supports&gt;
-		
-      &lt;supported-locale&gt;en&lt;/supported-locale&gt;
-		
-      &lt;portlet-info&gt;
-         &lt;title&gt;HelloPortlet&lt;/title&gt;
-         &lt;short-title&gt;HelloPortlet&lt;/short-title&gt;
-         &lt;keywords&gt;struts 2,portlet,hello,world&lt;/keywords&gt;
-      &lt;/portlet-info&gt;
-   &lt;/portlet&gt;  
-&lt;/portlet-app&gt;
-
-</code></pre>
-</div>
-
-<p>The important parts to notice are the <em>portlet-class</em>  and <em>init-param</em>  elements. The <em>portlet-class</em>  element is always **<em>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</em> ** (or a subclass, if you have added some custom functionality). This is the portlet that acts as the dispatcher for the Struts 2 framework, and translates incoming user interaction to action requests that Struts 2 understands. The init-params <em>viewNamespace</em> , <em>default [...]
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-<span class="cp">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
-<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</span> <span class="na">name=</span><span class="s">"default"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/view"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.HelloAction"</span><span class="nt">&gt;</span>
-	    <span class="nt">&lt;result&gt;</span>/WEB-INF/jsp/view/index.jsp<span class="nt">&lt;/result&gt;</span>
-	<span class="nt">&lt;/action&gt;</span>
-   <span class="nt">&lt;/package&gt;</span>
-	
-   <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"edit"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/edit"</span><span class="nt">&gt;</span>
-	<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.UpdateNameAction"</span><span class="nt">&gt;</span>
-	    <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
-	        <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/param&gt;</span>
-		<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"portletMode"</span><span class="nt">&gt;</span>view<span class="nt">&lt;/param&gt;</span>
-	    <span class="nt">&lt;/result&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/jsp/edit/index.jsp<span class="nt">&lt;/result&gt;</span>
-	<span class="nt">&lt;/action&gt;</span>
-    <span class="nt">&lt;/package&gt;</span>
-<span class="nt">&lt;/struts&gt;</span>
-
-</code></pre>
-</div>
-
-<p>As we can see, the actions for the <em>view</em>  portlet mode is in the <em>default</em>  package, with <em>/view</em>  as namespace, and the actions for the <em>edit</em>  portlet mode is in the <em>edit</em>  package, with <em>/edit</em>  as namespace.</p>
-
-<p>#####Import the project into Eclipse#####</p>
-
-<p>Now let’s import the project into Eclipse. First, type</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>mvn eclipse:eclipse -P pluto-embedded
-</code></pre>
-</div>
-
-<p>Then start Eclipse (if you have not already done so), and import the project using “File -&gt; Import -&gt; General -&gt; Existing Projects into Workspace”. Browse to the folder where you created the project and press finish. Your portlet project should now be setup up with all dependencies in place.</p>
-
-<p>#####Creating the Bookmark domain object#####</p>
-
-<p>To represent the bookmarks, we’ll create a simple domain object. We’ll keep it really simple, so the Bookmark object will only have a <em>name</em>  and a <em>url</em>  property:</p>
-
-<p><strong>src/main/java/com/mycompany/domain/Bookmark.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class Bookmark {
-   private String name;
-   private String url;
-
-   public Bookmark(String name, String url) {
-      this.name = name;
-      this.url = url;
-   }
-	
-   public String getName() {
-      return name;
-   }
-
-   public String getUrl() {
-      return url;
-   }
-}
-
-</code></pre>
-</div>
-
-<p>#####Adding bookmarks#####</p>
-
-<p>Adding bookmarks is an operation that logically belongs to the <em>edit</em>  portlet mode. So we’ll create a simple action for this purpose, and configure it in the <em>edit</em>  configuration package. In normal Struts 2 fashion, we’ll create an action object with the properties we need:</p>
-
-<p><strong>src/main/java/com/mycompany/AddBookmark.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class AddBookmarkAction extends DefaultActionSupport {
-
-   private String name;
-   private String url;
-
-   public void setName(String name) {
-      this.name = name;
-   }
-
-   public void setUrl(String url) {
-      this.url = url;
-   }
-
-   @Override
-   public String execute() throws Exception {
-      return SUCCESS;
-   }
-}
-
-</code></pre>
-</div>
-
-<p>And in struts.xml, remove the existing configuration for the edit package and add an entry for the action:</p>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;package name="edit" extends="struts-portlet-default" namespace="/edit"&gt;
-	
-   &lt;action name="index" class="com.mycompany.AddBookmarkAction"&gt;
-      &lt;result name="input"&gt;/WEB-INF/jsp/edit/index.jsp&lt;/result&gt;
-   &lt;/action&gt;
-
-&lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>Let’s create the input form so we have something to display. The form is really simple, with a label and a text field for each of the properties in the <em>Bookmark</em>  domain object:</p>
-
-<p><strong>src/main/webapp/WEB-INF/jsp/edit/index.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
-
-&lt;h2&gt;Manage bookmarks&lt;/h2&gt;
-
-&lt;s:form action="index"&gt;
-   &lt;table&gt;
-      &lt;s:textfield name="name" label="Name"/&gt;
-      &lt;s:textfield name="url" label="URL"/&gt;
-      &lt;s:submit value="Add"/&gt;
-   &lt;/table&gt;
-&lt;/s:form&gt;
-
-</code></pre>
-</div>
-
-<p>The textfields maps to the property names we have defined in <em>AddBookmarkAction</em> . Before we continue, let’s check that everything is configured correctly and check that our portlet can be run. In a command prompt, change into the directory where you have created the project and issue the command <em>mvn jetty:run -P pluto-embedded</em> . Then open <a href="http://localhost:8080/bookmark\-portlet/pluto/index\.jsp">http://localhost:8080/bookmark-portlet/pluto/index.jsp</a> and c [...]
-
-<p><img src="/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att59671071\_AddBookmarkForm\.jpg" alt="AddBookmarkForm.jpg" /></p>
-
-<p>If you try to submit data in the form, it will obviously not work since we have not implemented any logic to add bookmarks yet. That will be our next task. Since we’ll need a PortletPreferences reference, we’ll have the action implement the <em>PortletPreferencesAware</em>  interface that will instruct Struts 2 to inject this into our action, without the need for us to look it up manually. When we have the reference to the <em>PortletPreferences</em>  object, we’ll implement logic to  [...]
-
-<p><strong>src/main/java/com/mycompany/AddBookmarkAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class AddBookmarkAction extends DefaultActionSupport implements PortletPreferencesAware {
-
-   private String name;
-   private String url;
-	
-   private PortletPreferences portletPreferences;
-
-   public void setName(String name) {
-      this.name = name;
-   }
-
-   public void setUrl(String url) {
-      this.url = url;
-   }
-	
-   public void setPortletPreferences(PortletPreferences portletPreferences) {
-      this.portletPreferences = portletPreferences;	
-   }
-
-   @Override
-   public String execute() throws Exception {
-      portletPreferences.setValue(name, url);
-      portletPreferences.store();
-      return SUCCESS;
-   }
-}
-
-</code></pre>
-</div>
-
-<p>After the bookmark has been stored, we’ll just redirect back to the input form:</p>
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;package name="edit" extends="struts-portlet-default" namespace="/edit"&gt;
-	
-   &lt;action name="index" class="com.mycompany.AddBookmarkAction"&gt;
-      &lt;result type="redirectAction"&gt;
-         &lt;param name="actionName"&gt;index!input&lt;/param&gt;
-      &lt;/result&gt;
-      &lt;result name="input"&gt;/WEB-INF/jsp/edit/index.jsp&lt;/result&gt;
-   &lt;/action&gt;
-
-&lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>We use a <em>redirectAction</em>  result type to redirect back to the input form in proper PRG (Post - Redirect - Get) manner.</p>
-
-<p>Now we can add some bookmarks. We don’t get much feedback though, so let’s proceed...</p>
-
-<p>#####Listing the bookmarks#####</p>
-
-<p>The bookmarks will be listed in the <em>view</em>  portlet mode, so we’ll create a <em>ListBookmarksAction</em>  and configure it in the default package:</p>
-
-<p><strong>src/main/java/com/mycompany/ListBookmarksAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class ListBookmarksAction extends DefaultActionSupport implements PortletPreferencesAware {
-   private List&lt;Bookmark&gt; bookmarks = new ArrayList&lt;Bookmark&gt;();
-   private PortletPreferences portletPreferences;
-
-   public List&lt;Bookmark&gt; getBookmarks() {
-      return bookmarks;
-   }
-
-   public void setPortletPreferences(PortletPreferences portletPreferences) {
-      this.portletPreferences = portletPreferences;
-   }
-
-   @Override
-   public String execute() throws Exception {
-      // For simplicity, we'll assume that only bookmarks are stored in the preferences.
-      Map&lt;String, String[]&gt; preferencesMap = portletPreferences.getMap();
-      for(Map.Entry&lt;String, String[]&gt; entry : preferencesMap.entrySet()) {
-         bookmarks.add(new Bookmark(entry.getKey(), entry.getValue()[0]));
-      }
-      return SUCCESS;
-   }
-}
-
-</code></pre>
-</div>
-
-<p>Again we use the <em>PortletPreferencesAware</em>  to get the <em>PortletPreferences</em>  injected in our action. Then we just get all the values from the preferences and add them as a <em>Bookmark</em>  instance in an <em>ArrayList</em> .</p>
-
-<p>Obviously, we’ll need a jsp to view the list of bookmarks:</p>
-
-<p><strong>src/main/webapp/WEB-INF/jsp/view/index.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
-
-&lt;strong&gt;Bookmarks&lt;/strong&gt;
-&lt;p&gt;
-   &lt;table&gt;
-   &lt;s:iterator value="%{bookmarks}" var="bookmark"&gt;
-      &lt;tr&gt;
-         &lt;td&gt;&lt;s:property value="%{name}"/&gt;&lt;/td&gt;
-         &lt;td&gt;&lt;a href="&lt;s:property value="%{url}"/&gt;" target="_blank"&gt;&lt;s:property value="%{url}"/&gt;&lt;/a&gt;&lt;/td&gt;
-      &lt;/tr&gt;
-   &lt;/s:iterator&gt;
-   &lt;/table&gt;
-&lt;/p&gt;
-
-</code></pre>
-</div>
-
-<p>In the JSP, we just iterate over the list of Bookmarks and print the properties in the iterator loop.</p>
-
-<p>In struts.xml, remove the <em>default</em>  package, and add this instead:</p>
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;package name="view" extends="struts-portlet-default" namespace="/view"&gt;
-   &lt;action name="index" class="com.mycompany.ListBookmarksAction"&gt;
-      &lt;result&gt;/WEB-INF/jsp/view/index.jsp&lt;/result&gt;
-   &lt;/action&gt;
-&lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>When you’re ready, go back to a command prompt and start the server again (<em>mvn jetty:run -P pluto-embedded</em> ), open a browser and start adding some bookmarks. When you go back to <em>view</em>  mode after adding a few, you’ll see the bookmarks listed:</p>
-
-<p><img src="/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att59671072\_ListBookmarks\.jpg" alt="ListBookmarks.jpg" /></p>
-
-<p>#####Preparing for bookmark management#####</p>
-
-<p>It would be nice to be able to manage the list of bookmarks, so we’ll add delete and edit functionality. All modifications will happen in the <em>edit</em>  portlet mode. We’ll start by displaying the list of bookmarks in the <em>edit</em>  mode as well. The plan is to extend this list to add a <em>delete</em>  and an <em>edit</em>  link to modify the bookmark entries. We’ll do it really simple and just copy the code from the <em>index.jsp</em>  for view into the index.jsp for <em>edi [...]
-
-<p><strong>src/main/webapp/WEB-INF/jsp/edit/index.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
-
-&lt;h2&gt;Manage bookmarks&lt;/h2&gt;
-
-&lt;p&gt;
-   &lt;table&gt;
-   &lt;s:iterator value="%{bookmarks}" var="bookmark"&gt;
-      &lt;s:url action="editBookmark!input" id="editUrl"&gt;
-         &lt;s:param name="oldName" value="%{name}"/&gt;
-      &lt;/s:url&gt;
-      &lt;s:url action="deleteBookmark" portletUrlType="action" id="deleteUrl"&gt;
-         &lt;s:param name="bookmarkName" value="%{name}"/&gt;
-      &lt;/s:url&gt;
-      &lt;tr&gt;
-         &lt;td&gt;&lt;s:property value="%{name}"/&gt;&lt;/td&gt;
-         &lt;td&gt;&lt;a href="&lt;s:property value="%{url}"/&gt;" target="_blank"&gt;&lt;s:property value="%{url}"/&gt;&lt;/a&gt;&lt;/td&gt;
-         &lt;td&gt;&lt;a href="&lt;s:property value="%{editUrl}"/&gt;"&gt;Edit&lt;/a&gt;&lt;/td&gt;
-         &lt;td&gt;&lt;a href="&lt;s:property value="%{deleteUrl}"/&gt;"&gt;Delete&lt;/a&gt;&lt;/td&gt;
-      &lt;/tr&gt;
-   &lt;/s:iterator&gt;
-   &lt;/table&gt;
-&lt;/p&gt;
-
-&lt;s:form action="addBookmark"&gt;
-   &lt;table&gt;
-      &lt;s:textfield name="name" label="Name"/&gt;
-      &lt;s:textfield name="url" label="URL"/&gt;
-      &lt;s:submit value="Add"/&gt;
-   &lt;/table&gt;
-&lt;/s:form&gt;
-
-</code></pre>
-</div>
-
-<p>For the <em>delete</em>  url we need to specify that it is a portlet action url since portlet preferences cannot be changed in the render phase. We also need to change our configuration a bit since we’ll use this page as index page for <em>edit</em>  mode, and not only as the input form for the <em>AddBookmarkAction</em> :</p>
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;package name="edit" extends="struts-portlet-default" namespace="/edit"&gt;
-
-   &lt;action name="index" class="com.mycompany.ListBookmarksAction"&gt;
-      &lt;result&gt;/WEB-INF/jsp/edit/index.jsp&lt;/result&gt;
-   &lt;/action&gt;
-
-   &lt;action name="addBookmark" class="com.mycompany.AddBookmarkAction"&gt;
-      &lt;result type="redirectAction"&gt;
-         &lt;param name="actionName"&gt;index&lt;/param&gt;
-      &lt;/result&gt;
-   &lt;/action&gt;
-
-&lt;/package&gt;
-
-</code></pre>
-</div>
-
-<p>Here we have added the <em>ListBookmarksAction</em>  as the <em>index</em>  action, which will display the bookmark list with the input form. When the form is submitted, it will invoke the <em>addBookmark</em>  action, and upon success, control is redirected back to the <em>index</em>  action. With this new structure, we’ll also need to updated the portlet descriptor to use <em>index</em>  instead of <em>index!input</em>  as the default action for <em>edit</em>  mode:</p>
-
-<p><strong>src/main/webapp/WEB-INF/portlet.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;!-- The default action to invoke in edit mode. --&gt;
-&lt;init-param&gt;
-   &lt;name&gt;defaultEditAction&lt;/name&gt;
-   &lt;value&gt;index&lt;/value&gt;
-&lt;/init-param&gt;
-
-</code></pre>
-</div>
-
-<p>Now you can (re)start the server and see how it works. This is how it looks in <em>edit</em>  mode after adding a few entries:</p>
-
-<p><img src="/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att59671070\_ListBookmarksInEditMode\.jpg" alt="ListBookmarksInEditMode.jpg" /></p>
-
-<p>#####Deleting bookmarks#####</p>
-
-<p>Let’s create the action that handles deletion of bookmarks. It’s pretty simple. As with our other actions, we need to get a reference to the <em>PortletPreferences</em>  and simply remove the bookmark values from it:</p>
-
-<p><strong>src/main/java/com/mycompany/DeleteBookmarkAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class DeleteBookmarkAction extends DefaultActionSupport implements PortletPreferencesAware{
-
-   private String bookmarkName;
-	
-   private PortletPreferences portletPreferences;
-
-   public void setBookmarkName(String bookmarkName) {
-      this.bookmarkName = bookmarkName;
-   }
-	
-   public void setPortletPreferences(PortletPreferences portletPreferences) {
-      this.portletPreferences = portletPreferences;
-   }
-	
-   @Override
-   public String execute() throws Exception {
-      portletPreferences.reset(bookmarkName);
-      portletPreferences.store();
-      return SUCCESS;
-   }
-
-}
-
-</code></pre>
-</div>
-
-<p>Pretty simple and straight forward. Next, add a configuration entry for the action in the <em>edit</em>  package:</p>
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="deleteBookmark" class="com.mycompany.DeleteBookmarkAction"&gt;
-   &lt;result type="redirectAction"&gt;
-      &lt;param name="actionName"&gt;index&lt;/param&gt;
-   &lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>After a bookmark has been deleted, we redirect back to the <em>index</em>  action. Now you should be able to click the <em>Delete</em>  link to remove individual entries.</p>
-
-<p>#####Editing bookmarks#####</p>
-
-<p>The final step is to edit bookmark entries. When the user clicks the <em>edit</em>  link, the portlet will display a new page with an input form and the bookmark values already filled in the text fields. We’ll start by creating the jsp file:</p>
-
-<p><strong>src/main/webapp/WEB-INF/jsp/edit.jsp</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
-
-&lt;h2&gt;Edit bookmark&lt;/h2&gt;
-
-&lt;s:form action="editBookmark"&gt;
-   &lt;input type="hidden" name="oldName" value="&lt;s:property value="%{oldName}"/&gt;"/&gt;
-   &lt;table&gt;
-      &lt;s:textfield name="name" label="Name" value="%{oldName}"/&gt;
-      &lt;s:textfield name="url" label="URL"/&gt;
-      &lt;s:submit value="Update"/&gt;
-   &lt;/table&gt;
-&lt;/s:form&gt;
-
-</code></pre>
-</div>
-
-<p>The <em>oldName</em>  hidden field keeps track of which bookmark is beeing edited, since the name is also our id to the entry beeing edited. The actual update of the bookmark will be a “delete and add a new entry”:</p>
-
-<p><strong>src/main/java/com/mycompany/EditBookmarkAction.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class EditBookmarkAction extends DefaultActionSupport implements PortletPreferencesAware, Preparable, ParameterAware {
-
-   private String oldName;
-   private String name;
-   private String url;
-	
-   private PortletPreferences portletPreferences;
-   private Map&lt;String, String[]&gt; parameters;
-	
-   public String getOldName() {
-      return oldName;
-   }
-	
-   public void setOldName(String oldName) {
-      this.oldName = oldName;
-   }
-	
-   public String getUrl() {
-      return url;
-   }
-
-   public void setUrl(String url) {
-      this.url = url;
-   }
-
-   public void setName(String name) {
-      this.name = name;
-   }
-	
-   public void setPortletPreferences(PortletPreferences portletPreferences) {
-      this.portletPreferences = portletPreferences;
-   }
-	
-   public void setParameters(Map&lt;String, String[]&gt; parameters) {
-      this.parameters = parameters;
-   }
-	
-   public void prepare() throws Exception {
-      // Since the prepare interceptor is run before the parameter interceptor, 
-      // we have to get the parameter "manually".
-      this.oldName = parameters.get("oldName")[0];
-      this.url = portletPreferences.getValue(oldName, null);
-   }
-	
-   public String execute() throws Exception {
-      // The modification is handled as remove/add
-      portletPreferences.reset(oldName);
-      portletPreferences.setValue(name, url);
-      portletPreferences.store();
-      return SUCCESS;
-   }
-}
-
-</code></pre>
-</div>
-
-<p>There’s a couple of new things here, but nothing unfamiliar if you have worked with Struts 2 before. We use the <em>Preparable</em>  interface to pre-populate the vaules in the edit form, and we use the <em>ParameterAware</em>  interface to get a reference to the request parameter map. Other than that, the <em>execute</em>  method simply resets the old value for the bookmark and add it with the (possibly) new name.</p>
-
-<p>The last thing we need to do is to add the configuration in the <em>edit</em>  package for the new action:</p>
-
-<p><strong>src/main/resources/struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="editBookmark" class="com.mycompany.EditBookmarkAction"&gt;
-   &lt;result type="redirectAction"&gt;
-      &lt;param name="actionName"&gt;index&lt;/param&gt;
-   &lt;/result&gt;
-   &lt;result name="input"&gt;/WEB-INF/jsp/edit/edit.jsp&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>#####Summary#####</p>
-
-<p>Using Struts 2, we built a simple bookmark portlet utilizing the <em>edit</em>  portlet mode for management operations. The tutorial should have given you a basic understanding of portlet development with Struts 2, and that it is not very different from using Struts 2 in a regular web application.</p>
-
-<p>#####Notes#####</p>
-
-<p>Instead of using the Maven 2 Jetty plugin to run the tutorial, you can check out the <em>JettyPlutoLauncher</em>  which is included in the test sources. Just launch it as a regular Java class in your IDE. And to debug, just launch it in debug mode.</p>
-
-<p>#####Links#####</p>
-
-<p><em>S2PLUGINS:Source code for the tutorial</em> 
-<a href="http://jcp\.org/aboutJava/communityprocess/final/jsr168/index\.html">JSR168 Specification</a>^[http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html]
-<a href="http://struts\.apache\.org/2\.x/docs/portlet\-configuration\.html">Struts 2 Portlet Configuration options</a>^[http://struts.apache.org/2.x/docs/portlet-configuration.html]
-<a href="http://portletwork\.blogspot\.com">Author’s blog about portlet related development</a>^[http://portletwork.blogspot.com]
-<a href="http://struts\.apache\.org/2\.x/docs/portlet\-tutorial\-webwork\-22\.html">Old tutorial for WebWork 2</a>^[http://struts.apache.org/2.x/docs/portlet-tutorial-webwork-22.html]</p>
-
-<p>##Portlet Tiles Plugin## {#PAGE_30150178}</p>
-
-<p>Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look and feel. It can be used for both page decorating and componentization.</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Features####</p>
-
-<ul>
-  <li>Supports Tiles in Portlet environment</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>The following steps must be taken in order to enable tiles support within your Struts2 Portlet application:</p>
-
-<ol>
-  <li>Include the struts-portlet-tiles-plugin as a dependency in your web application.  If you are using maven2, the dependency configuration will be similar to:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-  &lt;artifactId&gt;struts2-portlet-tiles-plugin&lt;/artifactId&gt;
-  &lt;version&gt;${struts2.version}&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>All package definitions which require tiles support must either extend the struts-portlet-tiles-default package or must register the <em>Tiles Result</em>  type definition dedicated for Portlets.</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;result-types&gt;
-  &lt;result-type name="tiles" class="org.apache.struts2.views.tiles.PortletTilesResult"/&gt;
-&lt;/result-types&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>and dedicated action to support Tiles in portlet environment</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="tilesDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"&gt;
-    &lt;result type="tiles" name="success"&gt;$\{location\}&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Configure your actions to utilize a tiles definition:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="sample" class="org.apache.struts2.tiles.example.SamplePortletAction" &gt;
-  &lt;result name="success" type="tiles"&gt;tilesWorks&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>##REST Plugin## {#PAGE_70699}</p>
-
-<p>This plugin is only available with Struts 2.1.1 or later</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Overview####</p>
-
-<p>The REST Plugin</p>
-
-<p>provides high level support for the implementation of RESTful resource based web applications
-<a href="#PAGE_105613">Convention Plugin</a></p>
-
-<p>If you prefer to see a working code example, instead of reading through an explanation, you can download the <a href="http://struts\.apache\.org/download\.cgi\#struts\-ga">struts2 sample apps</a>^[http://struts.apache.org/download.cgi#struts-ga] and check out the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts2-rest-showcase
-</code></pre>
-</div>
-<p>application, a complete WAR file, that demonstrates a simple REST web program.</p>
-
-<p>#####Features#####</p>
-
-<ul>
-  <li>
-    <p>Ruby on Rails REST-style URLs</p>
-  </li>
-  <li>
-    <p>Zero XML config when used with Convention Plugin</p>
-  </li>
-  <li>
-    <p>Built-in serialization and deserialization support for XML and JSON</p>
-  </li>
-  <li>
-    <p>Automatic error handling</p>
-  </li>
-  <li>
-    <p>Type-safe configuration of the HTTP response</p>
-  </li>
-  <li>
-    <p>Automatic conditional GET support</p>
-  </li>
-</ul>
-
-<p>#####Mapping REST URLs to Struts 2 Actions#####</p>
-
-<p>The main functionality of the REST plugin lies in the interpretation of incoming request URL’s according the RESTful rules. In the Struts 2 framework, this ‘mapping’ of request URL’s to Actions is handled by in implementation of the [</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ActionMapper
-</code></pre>
-</div>
-<p>](http://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/ActionMapper.html)^[http://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/ActionMapper.html] interface. Out of the box, Struts 2 uses the [</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>DefaultActionMapper
-</code></pre>
-</div>
-<p>](http://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.html)^[http://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.html] to map URL’s to Actions via the logic you are probably already familiar with.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td><em>Actions or Controllers</em> ? Most Struts 2 developers are familiar with the Action. They are the things that get executed by the incoming requests. In the context of the REST plugin, just to keep you on your toes, we’ll adopt the RESTful lingo and refer to our Actions as <em>Controllers</em> . Don’t be confused; it’s just a name!</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>The REST plugin provides an alternative implementation, [</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>RestActionMapper
-</code></pre>
-</div>
-<p>](http://struts.apache.org/maven/struts2-plugins/struts2-rest-plugin/apidocs/org/apache/struts2/rest/RestActionMapper.html)^[http://struts.apache.org/maven/struts2-plugins/struts2-rest-plugin/apidocs/org/apache/struts2/rest/RestActionMapper.html], that provides the RESTful logic that maps a URL to a give action class ( aka ‘controller’ in RESTful terms ) and, more specifically, to the invocation of a method on that controller class. The following section, which comes from the Javadoc  [...]
-
-<p><strong>RESTful URL Mapping Logic</strong></p>
-
-<p>This Restful action mapper enforces Ruby-On-Rails REST-style mappings. If the method is not specified (via ‘!’ or ‘method:’ prefix), the method is “guessed” at using REST-style conventions that examine the URL and the HTTP method. Special care has been given to ensure this mapper works correctly with the codebehind plugin so that XML configuration is unnecessary.</p>
-
-<p>This mapper supports the following parameters:</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.idParameterName
-</code></pre>
-</div>
-<p>- If set, this value will be the name  of the parameter under which the id is stored. The id will then be removed  from the action name. Whether or not the method is specified, the mapper will  try to truncate the identifier from the url and store it as a parameter.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.indexMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a GET  request with no id parameter. Defaults to <strong>index</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.getMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a GET  request with an id parameter. Defaults to <strong>show</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.postMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a POST  request with no id parameter. Defaults to <strong>create</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.putMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a PUT  request with an id parameter. Defaults to <strong>update</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.deleteMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a DELETE  request with an id parameter. Defaults to <strong>destroy</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.editMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a GET  request with an id parameter and the <strong>edit</strong> view specified. Defaults to <strong>edit</strong>.</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.mapper.newMethodName
-</code></pre>
-</div>
-<p>- The method name to call for a GET  request with no id parameter and the <strong>new</strong> view specified. Defaults to <strong>editNew</strong>.</p>
-
-<p>The following URL’s will invoke its methods:</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>GET: /movies
-</code></pre>
-</div>
-<p> =&gt; method=<strong>index</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>GET: /movies/Thrillers
-</code></pre>
-</div>
-<p> =&gt; method=<strong>show</strong>, id=<strong>Thrillers</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>GET: /movies/Thrillers;edit
-</code></pre>
-</div>
-<p> =&gt; method=<strong>edit</strong>, id=<strong>Thrillers</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>GET: /movies/Thrillers/edit
-</code></pre>
-</div>
-<p> =&gt; method=<strong>edit</strong>, id=<strong>Thrillers</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>GET: /movies/new
-</code></pre>
-</div>
-<p> =&gt; method=<strong>editNew</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>POST: /movies
-</code></pre>
-</div>
-<p>=&gt; method=<strong>create</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>PUT: /movies/Thrillers
-</code></pre>
-</div>
-<p> =&gt; method=<strong>update</strong>, id=<strong>Thrillers</strong></p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>DELETE: /movies/Thrillers
-</code></pre>
-</div>
-<p> =&gt; method=<strong>destroy</strong>, id=<strong>Thrillers</strong></p>
-
-<p>To simulate the HTTP methods PUT and DELETE, since they aren’t supported by HTML, the HTTP parameter “_method” will be used.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>Or, expressed as a table:</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>HTTP method</th>
-      <th>URI</th>
-      <th>Class.method</th>
-      <th>parameters</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>GET</td>
-      <td>/movie</td>
-      <td>Movie.index</td>
-      <td> </td>
-    </tr>
-    <tr>
-      <td>POST</td>
-      <td>/movie</td>
-      <td>Movie.create</td>
-      <td> </td>
-    </tr>
-    <tr>
-      <td>PUT</td>
-      <td>/movie/Thrillers</td>
-      <td>Movie.update</td>
-      <td>id=”Thrillers”</td>
-    </tr>
-    <tr>
-      <td>DELETE</td>
-      <td>/movie/Thrillers</td>
-      <td>Movie.destroy</td>
-      <td>id=”Thrillers”</td>
-    </tr>
-    <tr>
-      <td>GET</td>
-      <td>/movie/Thrillers</td>
-      <td>Movie.show</td>
-      <td>id=”Thrillers”</td>
-    </tr>
-    <tr>
-      <td>GET</td>
-      <td>/movie/Thrillers/edit</td>
-      <td>Movie.edit</td>
-      <td>id=”Thrillers”</td>
-    </tr>
-    <tr>
-      <td>GET</td>
-      <td>/movie/new</td>
-      <td>Movie.editNew</td>
-      <td> </td>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Content Types#####</p>
-
-<p>In addition to providing mapping of RESTful URL’s to Controller ( Action ) invocations, the REST plugin also provides the ability to produce multiple representations of the resource data. By default, the plugin can return the resource in the following content types:</p>
-
-<ul>
-  <li>
-    <p>HTML</p>
-  </li>
-  <li>
-    <p>XML </p>
-  </li>
-  <li>
-    <p>JSON</p>
-  </li>
-</ul>
-
-<p>There is nothing configure here, just add the conent type extension to your RESTful URL. The framework will take care of the rest. So, for instance, assuming a Controller called Movies and a movie with the id of superman, the following URL’s will all hit the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>http://my.company.com/myapp/movies/superman
-http://my.company.com/myapp/movies/superman.xml
-http://my.company.com/myapp/movies/superman.xhtml
-http://my.company.com/myapp/movies/superman.json
-
-</code></pre>
-</div>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Note, these content types are supported as incoming data types as well. And, if you need, you can extend the functionality by writing your own implementations of org.apache.struts2.rest.handler.ContentTypeHandler and registering them with the system.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Usage####</p>
-
-<p>This section will walk you through a quick demo. Here are the steps in the sequence that we will follow.</p>
-
-<ul>
-  <li>
-    <p>Setting Up your Project</p>
-  </li>
-  <li>
-    <p>Configuring your Project</p>
-  </li>
-  <li>
-    <p>Writing your Controllers</p>
-  </li>
-</ul>
-
-<p>#####Setting Up#####</p>
-
-<p>Assuming you have a normal Struts 2 application, all you need to do for this REST demo is to add the following two plugins:</p>
-
-<ul>
-  <li>
-    <p>Struts 2 Rest Plugin</p>
-  </li>
-  <li>
-    <p><a href="http://struts\.apache\.org/2\.3\.8/docs/convention\-plugin\.html">Struts 2 Convention Plugin</a>^[http://struts.apache.org/2.3.8/docs/convention-plugin.html]</p>
-  </li>
-</ul>
-
-<p>Note, you can download the jars for these plugins from <a href="http://search\.maven\.org/\#search%7Cga%7C1%7Cstruts2\-convention\-plugin">Maven Central</a>^[http://search.maven.org/#search%7Cga%7C1%7Cstruts2-convention-plugin]</p>
-
-<p><strong>Configuration ( struts.xml )</strong></p>
-
-<p>Just dropping the plugin’s into your application may not produce exactly the desired effect. There are a couple of considerations. The first consideration is whether you want to have any non-RESTful URL’s coexisting with your RESTful URL’s. We’ll show two configurations. The first assumes all you want to do is REST. The second assumes you want to keep other non-RESTful URL’s alive in the same Struts 2 application.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>As with all configuration of Struts 2, we prefer using &lt;constant/&gt; elements in our struts.xml.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>REST Only Configuration</strong></p>
-
-<p>Instruct Struts to use the REST action mapper:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.mapper.class" value="rest" /&gt;
-
-</code></pre>
-</div>
-
-<p>At this point, the REST mapper has replaced the DefaultActionMapper so all incoming URL’s will be interpreted as RESTful URL’s.</p>
-
-<p>We’re relying on the Convention plugin to find our controllers, so we need to configure the convention plugin a bit:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.action.suffix" value="Controller"/&gt;
-&lt;constant name="struts.convention.action.mapAllMatches" value="true"/&gt;
-&lt;constant name="struts.convention.default.parent.package" value="rest-default"/&gt;
-&lt;constant name="struts.convention.package.locators" value="example"/&gt;
-
-</code></pre>
-</div>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Note, you don’t have to use the Convention plugin just to use the REST plugin. The actions of your RESTful application can be defined in XML just as easily as by convention. The REST mapper doesn’t care how the application came to know about your actions when it maps a URL to an invocation of one of it’s methods.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>REST and non-RESTful URL’s Together Configuration</strong></p>
-
-<p>If you want to keep using some non-RESTful URL’s alongside your REST stuff, then you’ll have to provide for a configuration that utilizes to mappers.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Plugins contain their own configuration. If you look in the Rest plugin jar, you’ll see the struts-plugin.xml and in that you’ll see some configuration settings made by the plugin. Often, the plugin just sets things the way it wants them. You may frequently need to override those settings in your own struts.xml.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>First, you’ll need to re-assert the extensions that struts knows about because the rest plugin will have thrown out the default</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>action
-</code></pre>
-</div>
-<p>extension.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>  &lt;constant name="struts.action.extension" value="xhtml,,xml,json,action"/&gt;
-
-</code></pre>
-</div>
-
-<p>Next, we will configure the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>PrefixBasedActionMapper
-</code></pre>
-</div>
-<p>, which is part of the core Struts 2 distribution, to have some URL’s routed to the Rest mapper and others to the default mapper.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>  &lt;constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" /&gt;
-  &lt;constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/&gt;
-
-</code></pre>
-</div>
-
-<p>And, again, we’re relying on the Convention plugin to find our controllers, so we need to configure the convention plugin a bit:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.convention.action.suffix" value="Controller"/&gt;
-&lt;constant name="struts.convention.action.mapAllMatches" value="true"/&gt;
-&lt;constant name="struts.convention.default.parent.package" value="rest-default"/&gt;
-&lt;constant name="struts.convention.package.locators" value="example"/&gt;
-
-</code></pre>
-</div>
-
-<p>#####Write Your Controller Actions#####</p>
-
-<p>Once everything is configured, you need to create the controllers. Controllers are simply actions created with the purpose of handling requests for a give RESTful resource. As we saw in the mapping logic above, various REST URL’s will hit different methods on the controller. Traditionally, normal Struts 2 actions expose the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>execute
-</code></pre>
-</div>
-<p>method as their target method. Here’s a sample controller for a <em>orders</em>  resource. Note, this sample doesn’t implement all of the methods that can be hit via the RESTful action mapper’s interpretation of URL’s.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>package org.apache.struts2.rest.example;
-
-public class OrdersController implements ModelDriven&lt;Order&gt; {
-
-    private OrderManager orderManager;
-    private String id;
-    private Order model;
-
-    // Handles /orders/{id} GET requests
-    public HttpHeaders show() {
-        model = orderManager.findOrder(id);
-        return new DefaultHttpHeaders("show")
-            .withETag(model.getUniqueStamp())
-            .lastModified(model.getLastModified());
-    }
-
-    // Handles /orders/{id} PUT requests
-    public String update() {
-        orderManager.updateOrder(model);
-        return "update";
-    }
-
-    // getters and setters
-}
-
-</code></pre>
-</div>
-
-<p>In this example, the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ModelDriven
-</code></pre>
-</div>
-<p>interface is used to ensure that only my model, the Order object in this case, is returned to the client, otherwise, the whole</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>OrdersController
-</code></pre>
-</div>
-<p>object would be serialized.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Where’s ActionSupport? Normally, you extend ActionSupport when writing Struts 2 actions. In these case, our controller doesn’t do that. Why, you ask? ActionSupport provides a bunch of important functionality to our actions, including support for i18n and validation. All of this functionality, in the RESTful case, is provided by the default interceptor stack defined in the REST plugin’s struts-plugin.xml file. Unless you willfully break your controller’s membership in the rest-d [...]
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>You may wonder why the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>show()
-</code></pre>
-</div>
-<p>method returns a</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>HttpHeaders
-</code></pre>
-</div>
-<p>object and the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>update()
-</code></pre>
-</div>
-<p>method returns the expected result code String. The REST Plugin adds support for action methods that return</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>HttpHeaders
-</code></pre>
-</div>
-<p>objects as a way for the action to have more control over the response. In this example, we wanted to ensure the response included the ETag header and a last modified date so that the information will be cached properly by the client. The</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>HttpHeaders
-</code></pre>
-</div>
-<p>object is a convenient way to control the response in a type-safe way.</p>
-
-<p>Also, notice we aren’t returning the usual “success” result code in either method. This allows us to use the special features of the <a href="#PAGE_29637">Codebehind Plugin</a> to intuitively select the result template to process when this resource is accessed with the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>.xhtml
-</code></pre>
-</div>
-<p>extension. In this case, we can provide a customized XHTML view of the resource by creating</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/orders-show.jsp
-</code></pre>
-</div>
-<p>and</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/orders-update.jsp
-</code></pre>
-</div>
-<p>for the respective methods.</p>
-
-<p>####Advanced Topics####</p>
-
-<p>The following sections describe some of the non-standard bells and whistles that you might need to utilize for your application’s more non-standard requirements.</p>
-
-<p>#####Custom ContentTypeHandlers#####</p>
-
-<p>If you need to handle extensions that aren’t supported by the default handlers, you can create your own</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ContentTypeHandler
-</code></pre>
-</div>
-<p>implementation and define it in your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;bean name="yaml" type="org.apache.struts2.rest.handler.ContentTypeHandler" class="com.mycompany.MyYamlContentHandler" /&gt;
-
-</code></pre>
-</div>
-
-<p>If the built-in content type handlers don’t do what you need, you can override the handling of any extension by providing an alternate handler. First, define your own</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ContentTypeHandler
-</code></pre>
-</div>
-<p>and declare with its own alias. For example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;bean name="myXml" type="org.apache.struts2.rest.handler.ContentTypeHandler" class="com.mycompany.MyXmlContentHandler" /&gt;
-
-</code></pre>
-</div>
-
-<p>Then, tell the REST Plugin to override the handler for the desired extension with yours. In</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.properties
-</code></pre>
-</div>
-<p>, it would look like this:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.rest.handlerOverride.xml=myXml
-
-</code></pre>
-</div>
-
-<p>#####Use Jackson framework as JSON ContentTypeHandler#####</p>
-
-<p>The default JSON Content Handler is build on top of the <a href="http://json\-lib\.sourceforge\.net/">JSON-lib</a>^[http://json-lib.sourceforge.net/]. If you prefer to use the <a href="http://jackson\.codehaus\.org/">Jackson framework</a>^[http://jackson.codehaus.org/] for JSON serialisation, you can configure the JacksonLibHandler as Content Handler for your json requests. </p>
-
-<p>First you need to add the jackson dependency to your web application by downloading the jar file and put it under WEB-INF/lib or by adding following xml snippet to your dependencies section in the pom.xml when you are using maven as build system.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-    &lt;groupId&gt;org.codehaus.jackson&lt;/groupId&gt;
-    &lt;artifactId&gt;jackson-jaxrs&lt;/artifactId&gt;
-    &lt;version&gt;1.9.13&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>Now you can overwrite the Content Handler with the Jackson Content Handler in the struts.xml:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/&gt;
-&lt;constant name="struts.rest.handlerOverride.json" value="jackson"/&gt;
-
-&lt;!-- Set to false if the json content can be returned for any kind of http method --&gt;
-&lt;constant name="struts.rest.content.restrictToGET" value="false"/&gt; 
-
-&lt;!-- Set encoding to UTF-8, default is ISO-8859-1 --&gt;
-&lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt; 
-
-
-</code></pre>
-</div>
-
-<p> </p>
-
-<p>#####Settings#####</p>
-
-<p>The following settings can be customized. See the <a href="http://cwiki\.apache\.org/confluence/display/WW/Configuration\+Files">developer guide</a>^[http://cwiki.apache.org/confluence/display/WW/Configuration+Files].
- For more configuration options see the <a href="#PAGE_105613">Convention Plugin Documentation</a></p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.rest.handlerOverride.EXTENSION</td>
-      <td>The alias for the ContentTypeHandler implementation that handles the EXTENSION value</td>
-      <td>N/A</td>
-      <td>Any declared alias for a ContentTypeHandler implementation</td>
-    </tr>
-    <tr>
-      <td>struts.rest.defaultExtension</td>
-      <td>The default extension to use when none is explicitly specified in the request</td>
-      <td>xhtml</td>
-      <td>Any extension</td>
-    </tr>
-    <tr>
-      <td>struts.rest.validationFailureStatusCode</td>
-      <td>The HTTP status code to return on validation failure</td>
-      <td>400</td>
-      <td>Any HTTP status code as an integer</td>
-    </tr>
-    <tr>
-      <td>struts.rest.namespace</td>
-      <td>Optional parameter to specify namespace for REST services</td>
-      <td>/</td>
-      <td>eg. /rest</td>
-    </tr>
-    <tr>
-      <td>struts.rest.content.restrictToGET</td>
-      <td>Optional parameter, if set to true blocks returning content from any other methods than GET, if set to false, the content can be returned for any kind of method</td>
-      <td>true</td>
-      <td>eg. put struts.rest.content.restrictToGET = false in struts.properties</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Resources####</p>
-
-<ul>
-  <li>
-    <p><a href="http://www\.b\-simple\.de/documents">http://www.b-simple.de/documents</a> - Short RESTful Rails tutorial (PDF, multiple languages)</p>
-  </li>
-  <li>
-    <p><a href="http://www\.amazon\.com/RESTful\-Web\-Services\-Leonard\-Richardson/dp/0596529260">RESTful Web Services</a>^[http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260] - Highly recommend book from O’Reilly</p>
-  </li>
-  <li>
-    <p><a href="http://raibledesigns\.com/rd/entry/go\_light\_with\_apache\_struts">Go Light with Apache Struts 2 and REST</a>^[http://raibledesigns.com/rd/entry/go_light_with_apache_struts] - Presentation by Don Brown at ApacheCon US 2008</p>
-  </li>
-</ul>
-
-<p>####Version History####</p>
-
-<p>From Struts 2.1.1+</p>
-
-<p>##SiteGraph Plugin## {#PAGE_14137}</p>
-
-<p>This plugin got marked as deprecated since Struts 2.5.11!</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p> </p>
-
-<p>The SiteGraph plugin</p>
-
-<p>generates graphical diagrams representing the flow of your web application</p>
-
-<p>SiteGraph works by parsing your configuration files, Action classes, and view files (JSP, Velocity, and FreeMarker), and displaying a visual map.</p>
-
-<p>Additional information can be found in the JavaDocs:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=javadocs-intro|javadoc=true|url=org.apache.struts2.sitegraph.SiteGraph</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p><strong>Understanding the Output</strong></p>
-
-<p>There are several key things to notice when looking at the output from SiteGraph:</p>
-
-<ul>
-  <li>
-    <p>Boxes: those shaded red indicate an action; those shaded green indicate a view file (JSP, etc).</p>
-  </li>
-  <li>
-    <p>Links: arrows colored green imply that no new HTTP request is being made; black arrows indicate a new HTTP request.</p>
-  </li>
-  <li>
-    <p>Link labels: labels may sometimes contain additional useful information. For example, a label of <strong>href</strong> means that the link behavior is that of a hyper-text reference. The complete label behaviors are provided:</p>
-
-    <ul>
-      <li>
-        <p><strong>href</strong> - a view file references an action by name (typically ending with the extension “.action”)</p>
-      </li>
-      <li>
-        <p><strong>action</strong> - a view file makes a call to the <em>action</em>  tag</p>
-      </li>
-      <li>
-        <p><strong>form</strong> - a view file is linked to an action using the <em>form</em>  tag</p>
-      </li>
-      <li>
-        <p><strong>redirect</strong> - an action is redirecting to another view or action</p>
-      </li>
-      <li>
-        <p><strong>! notation</strong> - a link to an action overrides the method to invoke</p>
-      </li>
-    </ul>
-  </li>
-</ul>
-
-<p><strong>Requirements</strong></p>
-
-<p>SiteGraph requires that your view files be structured in a very specific way. Because it has to read these files, only certain styles are supported. The requirements are:</p>
-
-<ul>
-  <li>
-    <p>The JSP tags must use the “s” namespace.</p>
-
-    <ul>
-      <li>
-        <p>In JSP: &lt;s:xxx/&gt;</p>
-      </li>
-      <li>
-        <p>In FreeMarker: &lt;@s.xxx/&gt;</p>
-      </li>
-      <li>
-        <p>In Velocity: N/A</p>
-      </li>
-    </ul>
-  </li>
-  <li>
-    <p>Use of the <em>form</em>  tag and <em>action</em>  tag must be linking directly to the action name (and optional namespace). This means that &lt;s:form action=”foo”/&gt; is OK, but &lt;s:form action=”foo.action”/&gt; is not.
- Here is also a short overview of what it does and why a developer would want to use it.</p>
-  </li>
-</ul>
-
-<p><strong>Features</strong></p>
-
-<ul>
-  <li>Generates a graphical view of your web application</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>You can use SiteGraph with the following command:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>java -cp ... -jar struts2-sitegraph-plugin-x.x.x.jar
-     -config CONFIG_DIR
-     -views VIEWS_DIRS
-     -output OUTPUT
-     [-ns NAMESPACE]
-
-</code></pre>
-</div>
-
-<p>Where:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=sitegraph-usage|lang=none|url=struts2/plugins/sitegraph/src/main/resources/org/apache/struts2/sitegraph/sitegraph-usage.txt</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>You must either supply the correct classpath when invoking the SiteGraph tool or place the Sitegraph plugin in the same directory as the dependent jars. Specifically, the XWork jar, Struts jar, and their dependencies must be included in the classpath. Futhermore, <strong>you must also include your Action class files referenced in</strong>struts.xml. Without the proper class path entries, SiteGraph will not function properly.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>Once you have run SiteGraph, check the directory specified in the “output” argument (OUTPUT). In there you will find two files: <strong>out.dot</strong> and <strong>out.gif</strong>. You may immediately open up <strong>out.gif</strong> and view the web application flow. However, you may also wish to either run the <strong>out.dot</strong> file through a different GraphVis layout engine (neato, twopi, etc), so the original dot file is provided as well. You may also wish to edit the dot [...]
-
-<p><strong>Automatic Execution</strong></p>
-
-<p>Some advanced users may wish to execute SiteGraph from within their application - this could be required if you are developing an application that supports plugin capabilities. This can easily be done. See the JavaDocs for more info:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=javadocs-api|javadoc=true|url=org.apache.struts2.sitegraph.SiteGraph</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-<p>The command line version of SiteGraph does exactly this (except for overriding the Writer):</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:id=example-api|javadoc=true|lang=java|url=org.apache.struts2.sitegraph.SiteGraph</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p><strong>Example</strong></p>
-
-<p><strong>Settings</strong></p>
-
-<p>This plugin doesn’t allow for any global settings.</p>
-
-<p><strong>Installation</strong></p>
-
-<p>The SiteGraph plugin jar is distributed with Struts, so if you’re up and running, you don’t need to do download any additional Java packages. However, SiteGraph does require the “dot” package by <a href="http://www\.graphviz\.org">GraphViz</a>^[http://www.graphviz.org].</p>
-
-<p>You’ll need to download the latest version of GraphViz and make sure that the dot executable (dot.exe in Windows) is in your command path. In Windows the GraphViz installer typically automatically adds</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>dot.exe
-</code></pre>
-</div>
-<p>to your path. However, you may need to do this by hand depending on your system configuration.</p>
-
-<p>##SiteMesh Plugin## {#PAGE_14142}</p>
-
-<p><strong>(i) About SiteMesh</strong></p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p><a href="http://www\.sitemesh\.org/">SiteMesh</a>^[http://www.sitemesh.org/] is a web-page layout and decoration framework and web application integration framework to aid in creating large sites consisting of many pages for which a consistent look/feel, navigation and layout scheme is required.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>The Sitemesh plugin</p>
-
-<p>allows Sitemesh templates to access framework resources</p>
-
-<p>The framework stores all its value stack information as request attributes, meaning that if you wish to display data that is on the stack (or even the ActionContext), you can do so by using the normal tag libraries that come with the framework. That’s it!</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Can use Struts tags in Sitemesh decorator templates</p>
-  </li>
-  <li>
-    <p>Sitemesh decorators can be written in FreeMarker as well as Velocity and JSP</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>From 2.2+ the new</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.opensymphony.sitemesh.webapp.SiteMeshFilter
-</code></pre>
-</div>
-<p>filter and Struts</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.dispatcher.ng.listener.StrutsListener
-</code></pre>
-</div>
-<p>context listener must be added to</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>web.xml
-</code></pre>
-</div>
-<p>, like:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;filter&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt;
-&lt;/filter&gt; 
-...
-&lt;listener&gt;
-    &lt;listener-class&gt;org.apache.struts2.dispatcher.ng.listener.StrutsListener&lt;/listener-class&gt;
-&lt;/listener&gt; 
-
-</code></pre>
-</div>
-
-<p>####FreeMarker  and Velocity Decorators####</p>
-
-<p>The plugin provides an extension of the SiteMesh <em>Velocity</em>  and <em>FreeMarker</em>  servlets. These servlets provide the standard variables and <em>Struts Tags</em>  that you used to create views in your favourite template language.</p>
-
-<p>#####FreeMarker#####</p>
-
-<p>From 2.2+ the recommended way to use Freemarker with Sitemesh is through the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet
-</code></pre>
-</div>
-<p>servlet, which can be configured like this in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>web.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;servlet&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;servlet-class&gt;org.apache.struts2.sitemesh.FreemarkerDecoratorServlet&lt;/servlet-class&gt;
-    &lt;init-param&gt;
- 	&lt;param-name&gt;default_encoding&lt;/param-name&gt;
- 	&lt;param-value&gt;UTF-8&lt;/param-value&gt;
-    &lt;/init-param&gt;
-    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-&lt;/servlet&gt; 
-
-&lt;servlet-mapping&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt; 
-
-</code></pre>
-</div>
-
-<p>#####Velocity#####</p>
-
-<p>From 2.2+ the recommended way to use Velocity with Sitemesh is through the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.sitemesh.VelocityDecoratorServlet
-</code></pre>
-</div>
-<p>servlet, which can be configured like this in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>web.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;servlet&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;servlet-class&gt;org.apache.struts2.sitemesh.VelocityDecoratorServlet&lt;/servlet-class&gt;
-    &lt;init-param&gt;
- 	&lt;param-name&gt;default_encoding&lt;/param-name&gt;
- 	&lt;param-value&gt;UTF-8&lt;/param-value&gt;
-    &lt;/init-param&gt;
-    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-&lt;/servlet&gt; 
-
-&lt;servlet-mapping&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt; 
-
-</code></pre>
-</div>
-
-<p>#####Full integration with SiteMesh 2 + Freemarker 2.4.2 + Velocity 1.3 , including Struts 2 Tags, ValueStack, and FreemarkerManager statics.#####</p>
-
-<p>Such configuration is available as from Struts 2.2.0, please refer to <a href="https://issues\.apache\.org/jira/browse/WW\-3296">WW-3296</a>^[https://issues.apache.org/jira/browse/WW-3296] for me details.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-    &lt;filter&gt;
-        &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-        &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;
-    &lt;/filter&gt;
-
-    &lt;filter&gt;
-        &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-        &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt;
-    &lt;/filter&gt;
-
-    &lt;filter&gt;
-        &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-        &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;
-    &lt;/filter&gt;
-
-    &lt;filter-mapping&gt;
-        &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-    &lt;/filter-mapping&gt;
-
-    &lt;filter-mapping&gt;
-        &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-        &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
-        &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
-        &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
-    &lt;/filter-mapping&gt;
-
-    &lt;filter-mapping&gt;
-        &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-    &lt;/filter-mapping&gt;
-
-    &lt;servlet&gt;
-        &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-        &lt;servlet-class&gt;org.apache.struts2.sitemesh.FreemarkerDecoratorServlet&lt;/servlet-class&gt;
-        &lt;init-param&gt;
-            &lt;param-name&gt;default_encoding&lt;/param-name&gt;
-            &lt;param-value&gt;UTF-8&lt;/param-value&gt;
-        &lt;/init-param&gt;
-        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-    &lt;/servlet&gt;
-
-    &lt;servlet-mapping&gt;
-        &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-        &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt;
-    &lt;/servlet-mapping&gt;
-
-    &lt;servlet&gt;
-        &lt;servlet-name&gt;JspSupportServlet&lt;/servlet-name&gt;
-        &lt;servlet-class&gt;org.apache.struts2.views.JspSupportServlet&lt;/servlet-class&gt;
-        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-    &lt;/servlet&gt;
-
-    &lt;listener&gt;
-        &lt;listener-class&gt;org.apache.struts2.dispatcher.ng.listener.StrutsListener&lt;/listener-class&gt;
-    &lt;/listener&gt;
-
-</code></pre>
-</div>
-
-<p>####Example####</p>
-
-<p>Here is an example of how to configure the filter chains in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>web.xml
-</code></pre>
-</div>
-<p>:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;filter&gt;
-    &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter&gt;
-    &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-
-&lt;filter&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;listener&gt;
-    &lt;listener-class&gt;org.apache.struts2.dispatcher.ng.listener.StrutsListener&lt;/listener-class&gt;
-&lt;/listener&gt;
-
-&lt;servlet&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;servlet-class&gt;org.apache.struts2.sitemesh.FreemarkerDecoratorServlet&lt;/servlet-class&gt;
-    &lt;init-param&gt;
-        &lt;param-name&gt;default_encoding&lt;/param-name&gt;
-        &lt;param-value&gt;UTF-8&lt;/param-value&gt;
-    &lt;/init-param&gt;
-    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-&lt;/servlet&gt;
-
-&lt;servlet&gt;
-    &lt;servlet-name&gt;sitemesh-velocity&lt;/servlet-name&gt;
-    &lt;servlet-class&gt;org.apache.struts2.sitemesh.VelocityDecoratorServlet&lt;/servlet-class&gt;
-    &lt;init-param&gt;
-        &lt;param-name&gt;default_encoding&lt;/param-name&gt;
-        &lt;param-value&gt;UTF-8&lt;/param-value&gt;
-    &lt;/init-param&gt;
-    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
-&lt;/servlet&gt;
-
-&lt;servlet-mapping&gt;
-    &lt;servlet-name&gt;sitemesh-freemarker&lt;/servlet-name&gt;
-    &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt;
-
-&lt;servlet-mapping&gt;
-    &lt;servlet-name&gt;sitemesh-velocity&lt;/servlet-name&gt;
-    &lt;url-pattern&gt;*.vm&lt;/url-pattern&gt;
-&lt;/servlet-mapping&gt;
-
-</code></pre>
-</div>
-
-<p>Struts 2.1 web.xml filter chain example:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;filter&gt;
-    &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter&gt;
-    &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts-execute&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-</code></pre>
-</div>
-
-<p>You do not need the struts2-sitmesh-plugin if you are using JSP for your decorators.</p>
-
-<p>Here are the only only changes needed to web.xml</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;filter&gt;
-    &lt;filter-name&gt;struts2-prepare&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter&gt;
-    &lt;filter-name&gt;struts2-execute&lt;/filter-name&gt;
-    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;
-&lt;/filter&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts2-prepare&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-    &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
-    &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
-    &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
-&lt;/filter-mapping&gt;
-
-&lt;filter-mapping&gt;
-    &lt;filter-name&gt;struts2-execute&lt;/filter-name&gt;
-    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
-&lt;/filter-mapping&gt;
-
-</code></pre>
-</div>
-
-<p>####Settings####</p>
-
-<p>This plugin doesn’t support any global settings.</p>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  No other files need to be copied or created.</p>
-
-<p>##Spring Plugin## {#PAGE_14281}</p>
-
-<p>####Description####</p>
-
-<p><a href="http://www\.springframework\.org">Spring</a>^[http://www.springframework.org] is a lightweight container, providing centralized, automated configuration and wiring of your application objects, using a technique called “Dependency Injection”</p>
-
-<blockquote>
-
-</blockquote>
-
-<p>The Spring Plugin works by overriding the Struts <em>ObjectFactory</em>  to enhance the creation of core framework objects. When an object is to be created, it uses the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>class
-</code></pre>
-</div>
-<p>attribute in the Struts configuration to correspond to the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>id
-</code></pre>
-</div>
-<p>attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2’s <a href="http://www\.springframework\.org/docs/reference/beans\.html\#beans\-factory\-scopes">bean scope feature</a>^[http://www.springframework.org/docs/reference/beans.html#beans-factory-scopes] can be used to scope an Action instance to the session, application, or a custom scope, providing advanced customization above the d [...]
-
-<table>
-  <tbody>
-    <tr>
-      <td>Remember: <strong>registering Actions with Spring is not required</strong>. The Spring alternative is there if you need it, but the framework will automatically create Actions objects from the action mappings. But, if you want to use Spring to inject your Actions, the option is there.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>Features</strong></p>
-
-<ul>
-  <li>
-    <p>Allow Actions, Interceptors, and Results to be created by Spring</p>
-  </li>
-  <li>
-    <p>Struts-created objects can be autowired by Spring after creation</p>
-  </li>
-  <li>
-    <p>Provides two interceptors that autowire actions, if not using the Spring ObjectFactory</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To enable Spring integration, simply include struts2-spring-plugin-x-x-x.jar in your application.</p>
-
-<p>If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in <em>struts.properties</em>  or in one of several XML files via <em>Constant Configuration</em> :</p>
-
-<p><strong>struts.properties</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.objectFactory = spring
-</code></pre>
-</div>
-
-<p><strong>struts.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;struts&gt;
-  &lt;constant name="struts.objectFactory" value="spring" /&gt;
-  ... 
-&lt;/struts&gt;
-
-</code></pre>
-</div>
-
-<p><strong>Autowiring</strong></p>
-
-<p>The framework enables “autowiring” by default. (Autowiring means to look for objects defined in Spring with the same name as your object property). To change the wiring mode, modify the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>spring.autowire
-</code></pre>
-</div>
-<p>property.</p>
-
-<p><strong>Wiring Mode</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.objectFactory.spring.autoWire = type
-</code></pre>
-</div>
-
-<p>The</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>autowire
-</code></pre>
-</div>
-<p>property can be set to several options.</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>name</th>
-      <th>Auto-wire by matching the name of the bean in Spring with the name of the property in your action. <strong>This is the default</strong></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>type</td>
-      <td>Auto-wire by looking for a bean registered with Spring of the same type as the property in your action. This requires you to have only one bean of this type registered with Spring</td>
-    </tr>
-    <tr>
-      <td>auto</td>
-      <td>Spring will attempt to auto-detect the best method for auto-wiring your action</td>
-    </tr>
-    <tr>
-      <td>constructor</td>
-      <td>Spring will auto-wire the parameters of the bean’s constructor</td>
-    </tr>
-    <tr>
-      <td>no</td>
-      <td>Turn off externally defined autowiring. Annotation-driven injection and injection based on Springs *Aware-interfaces still applies</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>By default, the framework will at least try to use Spring to create all its objects. If the object cannot be created by Spring, then the framework will create the object itself.</p>
-
-<p>Enabling Spring integration for other application objects is a two-step process.</p>
-
-<ul>
-  <li>Configure the Spring listener</li>
-</ul>
-
-<p><strong>web.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;listener&gt;
-    &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
-&lt;/listener&gt;
-
-</code></pre>
-</div>
-
-<ul>
-  <li>Register your objects via the Spring configuration</li>
-</ul>
-
-<p><strong>applicationContext.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-<span class="cp">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span>
-<span class="nt">&lt;beans</span> <span class="na">default-autowire=</span><span class="s">"autodetect"</span><span class="nt">&gt;</span>
-    <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"personManager"</span> <span class="na">class=</span><span class="s">"com.acme.PersonManager"</span> <span class="na">scope=</span><span class="s">"prototype"</span><span class="nt">/&gt;</span>
-    ...
-<span class="nt">&lt;/beans&gt;</span>
-
-</code></pre>
-</div>
-
-<table>
-  <tbody>
-    <tr>
-      <td>Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than applicationContext.xml. Adding the following to your web.xml will cause Spring’s ApplicationContext to be inititalized from all files matching the given pattern:</td>
-    </tr>
-  </tbody>
-</table>
-
-<p>| &lt;!-- Context Configuration locations for Spring XML files --&gt;
- &lt;context-param&gt;
-     &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
-     &lt;param-value&gt;/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml&lt;/param-value&gt;
- &lt;/context-param&gt;</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>See the Spring documentation for a full description of this parameter.</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>Initializing Actions from Spring</strong></p>
-
-<p>Normally, in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>you specify the class for each Action. When using the default SpringObjectFactory, the framework will ask Spring to create the Action and wire up dependencies as specified by the default auto-wire behavior.</p>
-
-<table>
-  <tbody>
-    <tr>
-      <td>We <strong>strongly</strong> recommend that you find declarative ways of letting Spring know what to provide for your actions. This includes making your beans able to be autowired by either naming your dependent properties on your action the same as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type and only having one of the required type registered with Spring. It also can include using JDK5 annotations to decla [...]
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>applicationContext.xml
-</code></pre>
-</div>
-<p>and then <em>change</em>  the class attribute from your Action in the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>to use the bean name defined in Spring instead of the class name.</p>
-
-<p>Your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>file would then have the Action class attributes changed.</p>
-
-<p><strong>struts.xml</strong></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;include</span> <span class="na">file=</span><span class="s">"struts-default.xml"</span><span class="nt">/&gt;</span>
-
-    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"default"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"foo"</span> <span class="na">class=</span><span class="s">"com.acme.Foo"</span><span class="nt">&gt;</span>
-            <span class="nt">&lt;result&gt;</span>foo.ftl<span class="nt">&lt;/result&gt;</span>
-        <span class="nt">&lt;/action&gt;</span>
-    <span class="nt">&lt;/package&gt;</span>
-
-    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"secure"</span> <span class="na">namespace=</span><span class="s">"/secure"</span> <span class="na">extends=</span><span class="s">"default"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"bar"</span><span class="nt">&gt;</span>
-            <span class="nt">&lt;result&gt;</span>bar.ftl<span class="nt">&lt;/result&gt;</span>
-        <span class="nt">&lt;/action&gt;</span>
-    <span class="nt">&lt;/package&gt;</span>
-<span class="nt">&lt;/struts&gt;</span>
-
-</code></pre>
-</div>
-
-<p>Where you have a Spring bean defined in your</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>applicationContext.xml
-</code></pre>
-</div>
-<p>named “bar”. Note that the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>com.acme.Foo
-</code></pre>
-</div>
-<p>Action did not need to be changed, because it can be autowired.</p>
-
-<p>A typical spring configuration for bar could look as following.</p>
-
-<p><strong>applicationConext.xml</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-<span class="cp">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span>
-<span class="nt">&lt;beans</span> <span class="na">default-autowire=</span><span class="s">"autodetect"</span><span class="nt">&gt;</span>
-    <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"com.my.BarClass"</span> <span class="na">singleton=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
-    ...
-<span class="nt">&lt;/beans&gt;</span>
-
-</code></pre>
-</div>
-
-<p>To use session-scoped components with Spring and Struts, see the <a href="#PAGE_4588171">Spring Session Components Workarounds</a> analysis.</p>
-
-<p><strong>Class Reloading</strong></p>
-
-<p>The Spring plugin can be configured to automatically reload classes that change in the file system. This feature will enable code changes to be “hot deployed” without having to restart the web container. To enable this feature follow these steps:</p>
-
-<ol>
-  <li>
-    <p>Set “struts.devMode” to “true”</p>
-  </li>
-  <li>
-    <p>Set “struts.class.reloading.watchList” to a comma separated list of directories, or jar files (absolute or relative paths)</p>
-  </li>
-  <li>
-    <p>Add this to web.xml:</p>
-  </li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>   &lt;context-param&gt;
-       &lt;param-name&gt;contextClass&lt;/param-name&gt;
-       &lt;param-value&gt;org.apache.struts2.spring.ClassReloadingXMLWebApplicationContext&lt;/param-value&gt;
-   &lt;/context-param&gt; 
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Add Apache Commons JCI FAM to the classpath. If you are using maven, add this to pom.xml</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>   &lt;dependency&gt;
-       &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
-       &lt;artifactId&gt;commons-jci-fam&lt;/artifactId&gt;
-       &lt;version&gt;1.0&lt;/version&gt;
-   &lt;/dependency&gt; 
-
-</code></pre>
-</div>
-
-<p>Letting the reloading class loader handle all the classes can lead to ClassCastException(s) because instances of the same classes loaded by different class loaders can not be assigned to each other. To prevent this problem we suggest that</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.class.reloading.acceptClasses
-</code></pre>
-</div>
-<p>is used to limit the classes loaded by the reloading class loader, so only actions are handled by it. This constant supports a comma separated list of regular expressions:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;constant name="struts.class.reloading.acceptClasses" value="com\.myproject\.example\.actions\..*" /&gt;
-
-</code></pre>
-</div>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>This feature is experimental, and <strong>should never</strong> be used in production systems.</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p><strong>Settings</strong></p>
-
-<p>The following settings can be customized. See the <a href="http://cwiki\.apache\.org/confluence/display/WW/Configuration\+Files">developer guide</a>^[http://cwiki.apache.org/confluence/display/WW/Configuration+Files].</p>
-
-<table>
-  <thead>
-    <tr>
-      <th>Setting</th>
-      <th>Description</th>
-      <th>Default</th>
-      <th>Possible Values</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td>struts.objectFactory.spring.autoWire</td>
-      <td>The autowire strategy</td>
-      <td>name</td>
-      <td>name,type,auto, or constructor</td>
-    </tr>
-    <tr>
-      <td>struts.objectFactory.spring.autoWire.alwaysRespect</td>
-      <td>Whether the autowire strategy should always be used, or if the framework should try to guess the best strategy based on the situation</td>
-      <td>false for backwards-compatibility</td>
-      <td>true or false</td>
-    </tr>
-    <tr>
-      <td>struts.objectFactory.spring.useClassCache</td>
-      <td>Whether to have Spring use its class cache or not</td>
-      <td>true</td>
-      <td>true or false</td>
-    </tr>
-    <tr>
-      <td>struts.class.reloading.watchList</td>
-      <td>List of jar files or directories to watch for changes</td>
-      <td>null</td>
-      <td>Comma separated list of absolute or relative paths to jars or directories</td>
-    </tr>
-    <tr>
-      <td>struts.class.reloading.acceptClasses</td>
-      <td>List of regular expressions of accepted class names</td>
-      <td>null</td>
-      <td>Comma separated list of regular expressions of classes that will be loaded by the reloading class loader(we suggest to add regular expressions so only action classes are handled by the reloading class loader)</td>
-    </tr>
-    <tr>
-      <td>struts.class.reloading.reloadConfig</td>
-      <td>Reload the runtime configuration (action mappings, results etc) when a change is detected in one of the watched directories</td>
-      <td>false</td>
-      <td>true or false</td>
-    </tr>
-    <tr>
-      <td>DEPRECATED: struts.objectFactory.spring.enableAopSupport</td>
-      <td>Uses different logic to construct beans to allow support AOP, it uses an old approach to create a bean, switch this flag if you have problems with Spring beans and AOP</td>
-      <td>false</td>
-      <td>true or false</td>
-    </tr>
-  </tbody>
-</table>
-
-<p><strong>Installation</strong></p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory. No other files need to be copied or created.</p>
-
-<p>###Spring Session Components Workarounds### {#PAGE_4588171}</p>
-
-<p>##Struts 1 Plugin## {#PAGE_44227}</p>
-
-<p>The Struts 1 plugin</p>
-
-<p>allows you to use existing Struts 1 Actions and ActionForms in Struts 2 applications</p>
-
-<p>This plugin provides a generic Struts 2 Action class to wrap an existing Struts 1 Action,</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.s1.Struts1Action
-</code></pre>
-</div>
-<p>.  The wrapper class provides the expected calls to the legacy Struts 1 Action and ActionForm, converting incoming and outgoing objects into the expected forms.  It works by using the <em>scoped model driven</em>  technique that uses a single Object as the model for every page, very similar to how the Struts 1 ActionForm works.  The plugin also provides several interceptors to emulate Struts 1 logic:</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.s1.ActionFormValidatorInterceptor
-</code></pre>
-</div>
-<p>- Integrates the validation of ActionForms into the workflow of Struts 2</p>
-
-<ul>
-  <li></li>
-</ul>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>org.apache.struts2.s1.ActionFormResetInterceptor
-</code></pre>
-</div>
-<p>- Calls the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>reset()
-</code></pre>
-</div>
-<p>method on any discovered ActionForms</p>
-
-<p>The Struts 1 plugin is currently only intended to allow you to run Strust 1 actions inside a Struts 2 application. It DOES NOT allow you to continue to use the Struts 1 tag libraries in your JSPs. Your JSPs must be converted to use the Struts 2 tag library.</p>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-      <td>There is a <a href="https://issues\.apache\.org/struts/browse/WW\-2157">JIRA ticket</a>^[https://issues.apache.org/struts/browse/WW-2157] open for enhancing this plugin to allow a more seamless transition from Struts 1 to Struts 2 by supporting continued use of the Struts 1 tag libraries in JSPs, however, there is not a scheduled time frame for that functionality to be made available. (Patches are welcomed!)</td>
-    </tr>
-  </tbody>
-</table>
-
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Can use Struts 1 Actions and ActionForms with no code changes</p>
-  </li>
-  <li>
-    <p>Supports Commons Validator-enabled ActionForms</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>To use existing Struts 1 Actions and ActionForms in a Struts 2 application, create a normal Struts 2 configuration package in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts.xml
-</code></pre>
-</div>
-<p>, but have it extend</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts1-default
-</code></pre>
-</div>
-<p>.  The</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>struts1-default
-</code></pre>
-</div>
-<p>package contains several interceptors and a default interceptor stack that work the plugin into the Struts 2 request process.</p>
-
-<p>In the most simple case, where you have a Struts 1 Action that you want to use in Struts 2, configure a Struts 2 action using the wrapper:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;action name="myAction" class="org.apache.struts2.s1.Struts1Action"&gt;
-  &lt;param name="className"&gt;com.mycompany.myapp.MyAction&lt;/param&gt;
-  &lt;result&gt;myAction.jsp&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>Most likely, you will have an ActionForm that your Struts 1 Action expects.  To use an ActionForm, the setup is a little more complicated because you’ll need an interceptor that manages the creation and scope (to support request and session scoping like Struts 1) of the ActionForm.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-
-&lt;action name="myFormAction" class="org.apache.struts2.s1.Struts1Action"&gt;
-  &lt;param name="className"&gt;com.mycompany.myapp.MyAction&lt;/param&gt;
-
-  &lt;interceptor-ref name="scopedModelDriven"&gt;
-    &lt;param name="className"&gt;com.mycompany.myapp.MyForm&lt;/param&gt;
-    &lt;param name="name"&gt;gangsterForm&lt;/param&gt;
-    &lt;param name="scope"&gt;session&lt;/param&gt;
-  &lt;/interceptor-ref&gt;
-  &lt;interceptor-ref name="struts1-default"/&gt;
-
-  &lt;result&gt;myAction.jsp&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>####Example####</p>
-
-<p>This example shows a few Struts 1 Actions, a session-scoped ActionForm, and validation that uses Commons Validator:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:url=struts2/apps/showcase/src/main/resources/struts-integration.xml|lang=xml</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-
-<p>####Settings####</p>
-
-<p>This plugin doesn’t support any global settings.</p>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory.  It will need the Struts 1 jar in order to function correctly.</p>
-
-<p>##TestNG Plugin## {#PAGE_82452}</p>
-
-<p>The TestNG plugin</p>
-
-<p>provides integration with the popular <a href="http://testng\.org">TestNG</a>^[http://testng.org] unit testing framework</p>
-
-<p>This plugin provides a base</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>class that can subclassed for tests that work on Struts 2 components.</p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>This plugin is only available with Struts 2.1.1 or later</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>####Features####</p>
-
-<ul>
-  <li>
-    <p>Base test class that starts up a full Struts 2 instance</p>
-  </li>
-  <li>
-    <p>Great for testing how configuration is loaded and Struts 2 components are used</p>
-  </li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>First, include the plugin your POM (if using Maven 2) under the test scope:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-  &lt;artifactId&gt;struts2-testng-plugin&lt;/artifactId&gt;
-  &lt;version&gt;STRUTS_2_VERSION&lt;/version&gt;
-  &lt;scope&gt;test&lt;/scope&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<p>If you are not using Maven 2 to build and test your code, ensure the plugin jar and its dependencies (spring-mock and testng) are in the testing classpath.</p>
-
-<p>Now, your unit tests can subclass the</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>StrutsTestCase
-</code></pre>
-</div>
-<p>class, which handles starting and stopping the Struts 2 framework:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-public class MyTest extends StrutsTestCase {
- // testing code
-}
-
-</code></pre>
-</div>
-
-<p>####Settings####</p>
-
-<p>This plugin doesn’t support any global settings.</p>
-
-<p>####Installation####</p>
-
-<p>This plugin is meant to be used during unit testing, and not during runtime.  Therefore, include it in your build’s classpath, but do not deploy it to</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF/lib
-</code></pre>
-</div>
-<p>in your Struts 2 application.</p>
-
-<p>##Tiles 3 Plugin## {#PAGE_30750969}</p>
-
-<p>This plugin was dropped in Struts 2.5, instead please use <a href="#PAGE_27401">Tiles Plugin</a> which was extended and upgraded to Tiles 3.</p>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-  <p>Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look and feel. It can be used for both page decorating and componentization. This is the first release of the plugin!</p>
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
-<p>The Tiles 3 plugin</p>
-
-<p>allows actions to return Tiles 3 pages</p>
-
-<p>####Features####</p>
-
-<ul>
-  <li>Supports Tiles in Freemarker, JSP, and Velocity - more testing is needed</li>
-</ul>
-
-<p>####Usage####</p>
-
-<p>The following steps must be taken in order to enable Tiles 3 support within your Struts2 application:</p>
-
-<ol>
-  <li>Include the struts-tiles3-plugin as a dependency in your web application, do not include the old struts2-tiles-plugin! If you are using maven3, the dependency configuration will be similar to:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-  &lt;artifactId&gt;struts2-tiles3-plugin&lt;/artifactId&gt;
-  &lt;version&gt;${version.tiles}&lt;/version&gt;
-  &lt;scope&gt;compile&lt;/scope&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Register the tiles listener.</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;listener&gt;
-    &lt;listener-class&gt;org.apache.tiles.extras.complete.CompleteAutoloadTilesListener&lt;/listener-class&gt;
-&lt;/listener&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>All package definitions which require tiles support must either extend the tiles-default package or must register the <em>Tiles 3 Result</em>  type definition.</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result-types&gt;
-  &lt;result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/&gt;
-&lt;/result-types&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Configure your actions to utilize a tiles definition:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;action name="sample" class="org.apache.struts2.tiles.example.SampleAction" &gt;
-  &lt;result name="success" type="tiles"&gt;tilesWorks&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<p>####Example####</p>
-
-<p>TBD</p>
-
-<p>####Settings####</p>
-
-<p>This plugin does inherits settings from <a href="http://tiles\.apache\.org/config\-reference\.html">Tiles configuration</a>^[http://tiles.apache.org/config-reference.html].</p>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory. No other files need to be copied or created.</p>
-
-<p>##Tiles Plugin## {#PAGE_27401}</p>
-
-<p>Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look and feel. It can be used for both page decorating and componentization.</p>
-
-<p>The Tiles plugin</p>
-
-<p>allows actions to return Tiles pages</p>
-
-<p>####Features####</p>
+<p>Apache Struts 2 provides a simple <a href="plugins.html">plugin architecture</a> so that developers can extend the framework just by adding a JAR to the application’s classpath. Since plugins are contained in a JAR, they are easy to share with others. Several plugins are bundled with the framework, and others are available from third-party sources.</p>
 
 <ul>
   <li>
-    <p>Supports Tiles in Freemarker, JSP, and Velocity</p>
+    <p><a href="plugins.html">Plugins</a></p>
   </li>
   <li>
-    <p>Provides annotations to keep tiles.xml short and put definitons into actions</p>
+    <p><a href="extending-an-application-with-custom-plugins.html">Extending an Application with Custom Plugins</a></p>
   </li>
 </ul>
 
-<p>####Usage####</p>
-
-<p>The following steps must be taken in order to enable tiles support within your Struts2 application:</p>
-
-<ol>
-  <li>Include the struts-tiles-plugin as a dependency in your web application. If you are using maven2, the dependency configuration will be similar to:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;dependency&gt;
-  &lt;groupId&gt;org.apache.struts&lt;/groupId&gt;
-  &lt;artifactId&gt;struts2-tiles-plugin&lt;/artifactId&gt;
-  &lt;version&gt;${version.tiles}&lt;/version&gt;
-&lt;/dependency&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Register the tiles listener. This listener will typically either be the standard tiles listener (org.apache.tiles.listener.TilesListener) or the Struts2 replacement (org.apache.struts2.tiles.TilesListener). The latter provides tighter integration with Struts features such as freemarker integration.</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;listener&gt;
-  &lt;listener-class&gt;org.apache.struts2.tiles.StrutsTilesListener&lt;/listener-class&gt;
-&lt;/listener&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>All package definitions which require tiles support must either extend the tiles-default package or must register the <em>Tiles Result</em>  type definition.</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;result-types&gt;
-  &lt;result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/&gt;
-&lt;/result-types&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Configure your actions to utilize a tiles definition:</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;action name="sample" class="org.apache.struts2.tiles.example.SampleAction" &gt;
-  &lt;result name="success" type="tiles"&gt;tilesWorks&lt;/result&gt;
-&lt;/action&gt;
-
-</code></pre>
-</div>
-
-<ol>
-  <li>Instead of xml configuration you can use annotations</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>@Result(name = "success", type="tiles")
-@TilesDefinition(extend = "fooLayout", putAttributes = {
-    @TilesPutAttribute(name = "header", value = "/WEB-INF/tiles/header.jsp"),
-    @TilesPutAttribute(name = "body", value = "/WEB-INF/tiles/body.ftl")
-})
-public class FooAction extends ActionSupport {
-</code></pre>
-</div>
-
-<ol>
-  <li>You have to define Tiles Definitons in a tiles.xml file. That can be placed in</li>
-</ol>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>resources
-</code></pre>
-</div>
-<p>or in</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>WEB-INF
-</code></pre>
-</div>
-<p>.</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE tiles-definitions PUBLIC
-        "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-        "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"&gt;</span>
-
-<span class="nt">&lt;tiles-definitions&gt;</span>
-
-    <span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"fooLayout"</span> <span class="na">template=</span><span class="s">"/WEB-INF/tiles/layout.jsp"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">value=</span><span class="s">"Tiles Sample"</span><span class="nt">/&gt;</span>
-        <span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"header"</span> <span class="na">value=</span><span class="s">".header"</span><span class="nt">/&gt;</span>
-        <span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">".bodyp"</span><span class="nt">/&gt;</span>
-    <span class="nt">&lt;/definition&gt;</span>
-
-    <span class="nt">&lt;definition</span> <span class="na">name=</span><span class="s">"tilesWorks"</span> <span class="na">extends=</span><span class="s">"fooLayout"</span><span class="nt">&gt;</span>
-        <span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"header"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/header.jsp"</span><span class="nt">/&gt;</span>
-        <span class="nt">&lt;put-attribute</span> <span class="na">name=</span><span class="s">"body"</span> <span class="na">value=</span><span class="s">"/WEB-INF/tiles/body.jsp"</span><span class="nt">/&gt;</span>
-    <span class="nt">&lt;/definition&gt;</span>
-
-<span class="nt">&lt;/tiles-definitions&gt;</span>
-</code></pre>
-</div>
-
-<p> </p>
+<h2 id="bundled-plugins">Bundled Plugins</h2>
 
 <table>
   <tbody>
     <tr>
-      <td>As from Struts 2.3.28, the plugin automatically loads all Tiles definitions matching the following pattern tiles*.xml - you don’t have to specify them via org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG in web.xml, but you can use this option if your application is going to work in restricted servlet environment e.g. Google AppEngine. In such case, definitions will be read from provided init-param.</td>
+      <td><a href="bean-validation">Bean Validation Plugin</a> (2.5+)<br /><a href="cdi">CDI (JSR 299) Plugin</a> (2.3.1+)<br /><a href="codebehind">Codebehind Plugin</a> (&lt; 2.5)<br /><a href="config-browser">Config Browser Plugin</a><br /><a href="convention">Convention Plugin</a> (2.1.3+)<br /><a href="dwr">DWR Plugin</a><br /><a href="embedded-jsp">Embedded JSP Plugin</a> (2.1.7+)<br /><a href="jasperreports">JasperReports Plugin</a><br /><a href="java-8-support">Java 8 Support Plu [...]
+      <td><a href="oval">OVal Plugin</a> (2.1.7+)<br /><a href="osgi">OSGi Plugin</a> (2.1.7+)<br /><a href="plexus">Plexus Plugin</a><br /><a href="portlet">Portlet Plugin</a><br /><a href="portlet-tiles">Portlet Tiles Plugin</a> (2.3.5+)<br /><a href="rest">REST Plugin</a> (2.1.1+)<br />Deprecated: <a href="sitegraph">SiteGraph Plugin</a><br /><a href="sitemesh">SiteMesh Plugin</a><br /><a href="spring">Spring Plugin</a><br /><a href="struts-1">Struts 1 Plugin</a>( &lt; 2.5)<br /><a hr [...]
     </tr>
   </tbody>
 </table>
 
-<table>
-  <tbody>
-    <tr>
-    </tr>
-  </tbody>
-</table>
-
-<p>#####Accessing Struts attributes#####</p>
-
-<p>As from Struts version 2.5.3 it’s possible accessing defined values on a </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ValueStack
-</code></pre>
-</div>
-<p>using </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>S2
-</code></pre>
-</div>
-<p>prefix when defining an expression in tiles definition, e.g.:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;definition name="home" extends="logged-in"&gt;
-  &lt;put-attribute name="title" expression="S2:actionProperty"/&gt;
-  &lt;put-attribute name="body" value="/WEB-INF/tiles/home.jsp"/&gt;
-&lt;/definition&gt;
-</code></pre>
-</div>
-
-<p>In such case Tiles will delegate evaluation of the expression to Struts and </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>ValueStack
-</code></pre>
-</div>
-<p>will be examined to evaluate the expression.</p>
-
-<p>#####I18N#####</p>
-
-<p>Instead of defining new tiles definitions per supported language (i.e.: </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>tiles.xml
-</code></pre>
-</div>
-<p>, </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>tiles_de.xml
-</code></pre>
-</div>
-<p>, </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>tiles_pl.xml
-</code></pre>
-</div>
-<p>) you can use </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>I18N
-</code></pre>
-</div>
-<p>prefix to evaluate provided expression as a key in Struts resource bundles. </p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>&lt;definition name="home" extends="logged-in"&gt;
-  &lt;put-attribute name="title" expression="I18N:home.title"/&gt;
-  &lt;put-attribute name="body" value="/WEB-INF/tiles/home.jsp"/&gt;
-&lt;/definition&gt;
-</code></pre>
-</div>
-
-<p>####Example####</p>
-
-<p>This example shows a Tiles layout page using Struts tags:</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="err">snippet:url=struts2/apps/showcase/src/main/webapp/WEB-INF/tiles/layout.jsp|lang=xml</span><span class="p">}</span><span class="w">
-</span></code></pre>
-</div>
-<p>Please check <a href="https://github\.com/apache/struts\-examples/tree/master/tiles">tiles</a>^[https://github.com/apache/struts-examples/tree/master/tiles] example in <a href="https://github\.com/apache/struts\-examples/tree/master/tiles">struts-examples</a>^[https://github.com/apache/struts-examples/tree/master/tiles] project.</p>
-
-<p>####Settings####</p>
-
-<p>This plugin does inherits settings from <a href="http://tiles\.apache\.org/config\-reference\.html">Tiles configuration</a>^[http://tiles.apache.org/config-reference.html].</p>
-
-<p>####Installation####</p>
-
-<p>This plugin can be installed by copying the plugin jar into your application’s</p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>/WEB-INF/lib
-</code></pre>
-</div>
-<p>directory. No other files need to be copied or created.</p>
-
-<p>###Tiles Use### {#PAGE_14187}</p>
-
-<p>Tiles uses a definition file (XML document) that must be instantiated before use. One way to render the definition file would be to use Spring. Another way would be to use a separate Listener, as shown by Tilesconfigurer.</p>
-
-<p><strong>TilesConfigurer.java</strong></p>
-
-<div class="highlighter-rouge"><pre class="highlight"><code>
-package com.opensymphony.webwork.views.tiles;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.struts.tiles.DefinitionsFactoryConfig;
-import org.apache.struts.tiles.DefinitionsFactoryException;
-import org.apache.struts.tiles.TilesUtil;
-import org.apache.struts.tiles.xmlDefinition.I18nFactorySet;
-
-/*
-* Modified from Spring's source
-*
-* here's how a smaple web xml should look like:
-* &lt;web-app&gt;
-*   &lt;context-param&gt;
-*     &lt;param-name&gt;tilesDefinitions&lt;/param-name&gt;
-*     &lt;param-value&gt;/WEB-INF/tiles.xml&lt;/param-value&gt;
-*   &lt;/context-param&gt;
-*
-*   &lt;listener&gt;
-*      &lt;listener-class&gt;com.opensymphony.webwork.views.tiles.TilesConfigurer&lt;/listener-class&gt;
-*   &lt;/listener&gt;
-* &lt;/web-app&gt;
-*
-* To use the definitions specified you would use a dispatcher result (since
-* tiles jsp is just another jsp) to render tiles view.
-*/
-public class TilesConfigurer implements ServletContextListener {
-
-    private boolean initialized = false;
-
-    public void contextInitialized (ServletContextEvent evt) {
-
-        if (!initialized) {
-            DefinitionsFactoryConfig factoryConfig = new DefinitionsFactoryConfig();
-            factoryConfig.setFactoryClassname(I18nFactorySet.class.getName());
-            factoryConfig.setParserValidate(true);
-            factoryConfig.setDefinitionConfigFiles(evt.getServletContext().getInitParameter("tilesDefinitions"));
-            try {
-                TilesUtil.createDefinitionsFactory(evt.getServletContext(), factoryConfig);
-            } catch (DefinitionsFactoryException e) {
-                e.printStackTrace();
-            }
-            initialized = true;
-        }
-
-    }
-
-    public void contextDestroyed (ServletContextEvent evt) {
-    }
-
-}
-
-</code></pre>
-</div>
-
-<blockquote>
-
-</blockquote>
-
-<blockquote>
-
-</blockquote>
-
 <blockquote>
-  <p>The TilesConfigurer was adapted from the Spring source code.</p>
+  <p>For a complete list of bundled and third-party plugins, visit the <a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin Registry</a>.</p>
 </blockquote>
 
-<blockquote>
-
-</blockquote>
+<h3 id="next-architects-guidearchitects-guidehtml">Next: <a href="architects-guide.html">Architects Guide</a></h3>
 
   </section>
 </article>
diff --git a/content/plugins/plugins.html b/content/plugins/plugins.html
new file mode 100644
index 0000000..0791b40
--- /dev/null
+++ b/content/plugins/plugins.html
@@ -0,0 +1,601 @@
+<!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>Plugins</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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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 class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/plugins.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    
+    <h1 id="plugins">Plugins</h1>
+
+<p>Struts 2 plugins contain classes and configuration that extend, replace, or add to existing Struts framework functionality. A plugin can be installed by adding its JAR file to the application’s class path, in addition to the JAR files to fulfill whatever dependencies the plugin itself may have. To configure the plugin, the JAR should contain a <code class="highlighter-rouge">struts-plugin.xml</code> file, which follows the same format as an ordinary <code class="highlighter-rouge">str [...]
+
+<p>Since a plugin can contain the <code class="highlighter-rouge">struts-plugin.xml</code> file, it has the ability to:</p>
+
+<ul>
+  <li>
+    <p>Define new packages with results, interceptors, and/or actions</p>
+  </li>
+  <li>
+    <p>Override framework constants</p>
+  </li>
+  <li>
+    <p>Introduce new extension point implementation classes</p>
+  </li>
+</ul>
+
+<p>Many popular but optional features of the framework are distributed as plugins. An application can retain all the plugins provided with the distribution, or just include the ones it uses. Plugins can be used to organize application code or to distribute code to third-parties.</p>
+
+<p>Packages defined in a plugin can have parent packages that are defined in another plugin. Plugins may define configuration elements with classes not contained in the plugin. Any classes not included in the plugin’s JAR must be on the application’s classpath at runtime. As from Struts 2.3.5</p>
+
+<p>The framework loads its default configuration first, then any plugin configuration files found in others JARs on the classpath, and finally the “bootstrap” <code class="highlighter-rouge">struts.xml</code>.</p>
+
+<ol>
+  <li>
+    <p><code class="highlighter-rouge">struts-default.xml</code> (bundled in the Core JAR)</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts-plugin.xml</code> (as many as can be found in other JARs)</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.xml</code> (provided by your application)</p>
+  </li>
+</ol>
+
+<p>Since the <code class="highlighter-rouge">struts.xml</code> file is always loaded last, it can make use of any resources provided by the plugins bundled with the distribution, or any other plugins available to an application.</p>
+
+<h2 id="static-resources">Static resources</h2>
+
+<p>To include static resources in your plugins add them under “/static” in your jar. And include them in your page using “/struts” as the path, like in the following example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="c">&lt;!-- Assuming /static/main.css is inside a plugin jar, to add it to the page: --&gt;</span>
+
+<span class="err">&lt;</span>@s.url value="/struts/main.css" var="css" /&gt;
+<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="na">href=</span><span class="s">"%{#css}"</span> <span class="nt">/&gt;</span>
+</code></pre>
+</div>
+
+<p>Read also <a href="https://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/StaticContentLoader.html">StaticContentLoader JavaDoc</a>.</p>
+
+<h2 id="extension-points">Extension Points</h2>
+
+<p>Extension points allow a plugin to override a key class in the Struts framework with an alternate implementation. For example, a plugin could provide a new class to create Action classes or map requests to Actions.</p>
+
+<p>The following extension points are available in Struts 2:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> <span class="nt">&lt;table</span> <span class="na">border=</span><span class="s">"1"</span> <span class="na">summary=</span><span class="s">""</span><span class="nt">&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;th&gt;</span>Type<span class="nt">&lt;/th&gt;</span>
+     <span class="nt">&lt;th&gt;</span>Property<span class="nt">&lt;/th&gt;</span>
+     <span class="nt">&lt;th&gt;</span>Scope<span class="nt">&lt;/th&gt;</span>
+     <span class="nt">&lt;th&gt;</span>Description<span class="nt">&lt;/th&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.ObjectFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Creates actions, results, and interceptors<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.factory.ActionFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory.actionFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Dedicated factory used to create Actions, you can implement/extend existing one instead of defining new ObjectFactory<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.factory.ResultFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory.resultFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Dedicated factory used to create Results, you can implement/extend existing one instead of defining new ObjectFactory<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.factory.InterceptorFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory.interceptorFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Dedicated factory used to create Interceptors, you can implement/extend existing one instead of defining new ObjectFactory<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.factory.ConverterFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory.converterFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Dedicated factory used to create TypeConverters, you can implement/extend existing one instead of defining new ObjectFactory<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.factory.ValidatorFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectFactory.validatorFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Dedicated factory used to create Validators, you can implement/extend existing one instead of defining new ObjectFactory<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.ActionProxyFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.actionProxyFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Creates the ActionProxy<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.util.ObjectTypeDeterminer<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.objectTypeDeterminer<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Determines what the key and element class of a Map or Collection should be<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.dispatcher.mapper.ActionMapper<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.mapper.class<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Determines the ActionMapping from a request and a URI from an ActionMapping<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.dispatcher.multipart.MultiPartRequest<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.multipart.parser<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>per request<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Parses a multipart request (file upload)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.views.freemarker.FreemarkerManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.freemarker.manager.classname<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Loads and processes Freemarker templates<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.views.velocity.VelocityManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.velocity.manager.classname<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Loads and processes Velocity templates<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.validator.ActionValidatorManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.actionValidatorManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Main interface for validation managers (regular and annotation based).  Handles both the loading of
+         configuration and the actual validation (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.util.ValueStackFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.valueStackFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Creates value stacks (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.reflection.ReflectionProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.reflectionProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Provides reflection services, key place to plug in a custom expression language (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.reflection.ReflectionContextFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.reflectionContextFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Creates reflection context maps used for reflection and expression language operations (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.config.PackageProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>N/A<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>All beans registered as PackageProvider implementations will be automatically included in configuration building (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.util.PatternMatcher<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.patternMatcher<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Matches patterns, such as action names, generally used in configuration (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.views.dispatcher.DefaultStaticContentLoader<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.staticContentLoader<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Loads static resources (since 2.1)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.XWorkConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.xworkConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Handles conversion logic and allows to load custom converters per class or per action<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.TextProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.xworkTextProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>default<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Allows provide custom TextProvider for whole application<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.LocaleProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.localeProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>DEPRECATED! Allows provide custom TextProvider for whole application - instead this endpoint use <span class="nt">&lt;b&gt;</span>struts.localeProviderFactory<span class="nt">&lt;/b&gt;&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.LocaleProviderFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.localeProviderFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Allows provide custom LocaleProvider for whole application<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.components.UrlRenderer<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.urlRenderer<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Allows provide custom implementation of environment specific URL rendering/creating class<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.UnknownHandlerManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.unknownHandlerManager<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Implementation of this interface allows handle logic of unknown Actions, Methods or Results<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.views.util.UrlHelper<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.view.urlHelper<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Helper class used with URLRenderer to provide exact logic for building URLs<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.FileManagerFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.fileManagerFactory<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Used to create {@link FileManager} instance to access files on the File System as also to monitor if reload is needed,
+     can be implemented / overwritten to meet specific an application server needs
+     <span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.CollectionConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.collection<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Converter used to convert any object to Collection and back<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.ArrayConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.array<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Converter used to convert any object to Array and back<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.DateConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.date<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Converter used to convert any object to Date and back<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.NumberConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.number<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Converter used to convert any object to Number and back<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.impl.StringConverter<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.string<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Converter used to convert any object to String and back<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.ConversionPropertiesProcessor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.conversion.properties.processor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Process Properties to create converters<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.ConversionPropertiesProcessor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.file.processor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Process <span class="ni">&amp;lt;</span>class<span class="ni">&amp;gt;</span>-conversion.properties file create converters<span class="ni">&amp;lt;</span>/class<span class="ni">&amp;gt;</span><span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.annotation.processor<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Process TypeConversion annotation to create converters<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.TypeConverterCreator<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.creator<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Creates user converters<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.conversion.TypeConverterHolder<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.converter.holder<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Holds user converters' instances<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.util.TextParser<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.expression.parser<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Used to parse expressions like ${foo.bar} or %{bar.foo} but it is up tp the TextParser's
+         implementation what kind of opening char to use (#, $, %, etc)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.ExcludedPatternsChecker<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.excludedPatterns.checker<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>request<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Used across different interceptors to check if given string matches one of the excluded patterns<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.AcceptedPatternsChecker<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.acceptedPatterns.checker<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>request<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Used across different interceptors to check if given string matches one of the accepted patterns<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>org.apache.struts2.util.ContentTypeMatcher<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.contentTypeMatcher<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Matches content type of uploaded files (since 2.3.22)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+   <span class="nt">&lt;tr&gt;</span>
+     <span class="nt">&lt;td&gt;</span>com.opensymphony.xwork2.LocalizedTextProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>struts.localizedTextProvider<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>singleton<span class="nt">&lt;/td&gt;</span>
+     <span class="nt">&lt;td&gt;</span>Provides access to resource bundles used to localise messages (since 2.5.11)<span class="nt">&lt;/td&gt;</span>
+   <span class="nt">&lt;/tr&gt;</span>
+ <span class="nt">&lt;/table&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="plugin-examples">Plugin Examples</h2>
+
+<p>Let’s look at two similar but different plugins bundled with the core distribution.</p>
+
+<h3 id="sitemesh-plugin">Sitemesh plugin</h3>
+
+<p><a href="http://opensymphony.com/sitemesh/">SiteMesh</a> is a popular alternative to Tiles. SiteMesh provides a common look-and-feel to an application’s pages by automatically wrapping a plain page with common elements like headers and menubars.</p>
+
+<p>The <code class="highlighter-rouge">sitemesh-plugin.jar</code> contains several classes, a standard JAR manifest, and a plugin configuration file.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> + META-INF/
+   + manifest.mf
+ + org
+   + apache
+     + struts2
+       + sitemesh
+         + FreeMarkerPageFilter.class
+         + TemplatePageFilter.class
+         + VelocityPageFilter.class
+ + struts-plugin.xml
+</code></pre>
+</div>
+
+<p>While the SiteMesh Plugin doesn’t provide any new results, interceptors, or actions, or even extend any Struts integration points, it does need to know what settings have been enabled in the Struts framework. Therefore, its <code class="highlighter-rouge">struts-plugin.xml</code> looks like this:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
+<span class="c">&lt;!--
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+--&gt;</span>
+<span class="cp">&lt;!DOCTYPE struts PUBLIC
+	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
+	"http://struts.apache.org/dtds/struts-2.5.dtd"&gt;</span>
+    
+<span class="nt">&lt;struts&gt;</span>
+    <span class="nt">&lt;bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.sitemesh.FreemarkerPageFilter"</span> <span class="na">static=</span><span class="s">"true"</span> <span class="na">optional=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;bean</span> <span class="na">class=</span><span class="s">"org.apache.struts2.sitemesh.VelocityPageFilter"</span> <span class="na">static=</span><span class="s">"true"</span> <span class="na">optional=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+
+</code></pre>
+</div>
+
+<p>The two bean elements, with the “static” flag enabled, tell Struts to inject the current settings and framework objects into static property setters on startup. This allows, for example, the FreeMarkerPageFilter class to get an instance of the Struts FreemarkerManager and the current encoding setting.</p>
+
+<h3 id="tiles-plugin">Tiles plugin</h3>
+
+<p><a href="http://struts.apache.org/struts-sandbox/tiles/index.html">Tiles</a> is a popular alternative to SiteMesh. Tiles provides a common look-and-feel to an application’s pages by breaking the page down into common fragments or “tiles”.</p>
+
+<p>The <code class="highlighter-rouge">tiles-plugin.jar</code> contains several classes, a standard JAR manifest, and a configuration file.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> + META-INF/
+   + manifest.mf
+ + org
+   + apache
+     + struts2
+       + tiles
+         + StrutsTilesListener.class
+         + StrutsTileUtilImpl.class
+       + views
+         + tiles
+           + TilesResult.class
+   + struts-plugin.xml
+</code></pre>
+</div>
+
+<p>Since the Tiles Plugin does need to register configuration elements, a result class, it provides a <code class="highlighter-rouge">struts-plugin.xml</code> file.</p>
+
+<h2 id="plugin-registry">Plugin Registry</h2>
+
+<blockquote>
+  <p>For a list of bundled plugins, see the <a href="plugin-developers.html">Plugin Reference Documentation</a>. For more about bundled and third-party plugins, visit the <a href="http://cwiki.apache.org/S2PLUGINS/home.html">Apache Struts Plugin Registry</a>.</p>
+</blockquote>
+
+<h2 id="back-to-home">Back to <a href="/">Home</a></h2>
+
+  </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>
diff --git a/content/plugins/portlet-tiles/index.html b/content/plugins/portlet-tiles/index.html
new file mode 100644
index 0000000..2434842
--- /dev/null
+++ b/content/plugins/portlet-tiles/index.html
@@ -0,0 +1,252 @@
+<!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>Portlet Tiles Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/portlet-tiles/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="portlet-tiles-plugin">Portlet Tiles Plugin</h1>
+
+<p>Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look and feel. It can be used for both page decorating and componentization.</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>Supports Tiles in Portlet environment</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>The following steps must be taken in order to enable tiles support within your Struts2 Portlet application:</p>
+
+<ol>
+  <li>Include the struts-portlet-tiles-plugin as a dependency in your web application.  If you are using maven2, the dependency configuration will be similar to:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;dependency&gt;</span>
+  <span class="nt">&lt;groupId&gt;</span>org.apache.struts<span class="nt">&lt;/groupId&gt;</span>
+  <span class="nt">&lt;artifactId&gt;</span>struts2-portlet-tiles-plugin<span class="nt">&lt;/artifactId&gt;</span>
+  <span class="nt">&lt;version&gt;</span>${struts2.version}<span class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+
+</code></pre>
+</div>
+
+<ol start="2">
+  <li>All package definitions which require tiles support must either extend the struts-portlet-tiles-default package or must register the <em>Tiles Result</em>  type definition dedicated for Portlets.</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;result-types&gt;</span>
+  <span class="nt">&lt;result-type</span> <span class="na">name=</span><span class="s">"tiles"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.views.tiles.PortletTilesResult"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/result-types&gt;</span>
+
+</code></pre>
+</div>
+
+<ol start="3">
+  <li>and dedicated action to support Tiles in portlet environment</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"tilesDirect"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"tiles"</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>${location}<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<ol start="4">
+  <li>Configure your actions to utilize a tiles definition:</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"sample"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.tiles.example.SamplePortletAction"</span> <span class="nt">&gt;</span>
+  <span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"tiles"</span><span class="nt">&gt;</span>tilesWorks<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="installation">Installation</h2>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/portlet/index.html b/content/plugins/portlet/index.html
new file mode 100644
index 0000000..398f83a
--- /dev/null
+++ b/content/plugins/portlet/index.html
@@ -0,0 +1,413 @@
+<!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>Portlet Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/portlet/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="portlet-plugin">Portlet Plugin</h1>
+
+<h2 id="documentation">Documentation</h2>
+
+<p>The Portlet Plugin is used for developing JSR286 portlets using Struts 2.</p>
+
+<h3 id="portlet-class">portlet-class</h3>
+
+<p>To use the Struts 2 Portlet framework, use <strong><em>org.apache.struts2.portlet.dispatcher.Jsr286Dispatcher</em></strong> as the portlet class in your portlet.xml file:</p>
+
+<p><strong>portlet.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+
+<span class="nt">&lt;portlet-app</span> <span class="na">id=</span><span class="s">"my-portlet-app"</span>
+	<span class="na">xmlns=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"</span>
+	<span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class="na">version=</span><span class="s">"2.0"</span>
+	<span class="na">xsi:schemaLocation=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"</span><span class="nt">&gt;</span>
+
+    <span class="nt">&lt;portlet</span> <span class="na">id=</span><span class="s">"MyPortlet"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;description</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>My Portlet<span class="nt">&lt;/description&gt;</span>
+        <span class="nt">&lt;portlet-name&gt;</span>MyPortlet<span class="nt">&lt;/portlet-name&gt;</span>
+        <span class="nt">&lt;display-name</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>my-portlet<span class="nt">&lt;/display-name&gt;</span>
+    
+        <span class="nt">&lt;portlet-class&gt;</span>org.apache.struts2.portlet.dispatcher.Jsr286Dispatcher<span class="nt">&lt;/portlet-class&gt;</span>
+        
+        <span class="c">&lt;!-- SNIP --&gt;</span>
+
+    <span class="nt">&lt;/portlet&gt;</span>
+<span class="nt">&lt;/portlet-app&gt;</span>
+</code></pre>
+</div>
+
+<h3 id="portlet-init-parameters">Portlet Init Parameters</h3>
+
+<p>Below is the init-param elements that you can set up in <em>portlet.xml</em>  for configuring the portlet mode -&gt; xwork namespace mappings for the portlet. Basically, you can think of the different portlet modes as different sub-applications, so it can be useful to set up the <code class="highlighter-rouge">struts.xml</code> configuration with different namespaces for the different portlets and modes:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Key</th>
+      <th>Description</th>
+      <th>Default</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>portletNamespace</td>
+      <td>The namespace for the portlet in the action configuration. This namespace is prepended to all action lookups, and makes it possible to host multiple portlets in the same portlet application. If this parameter is set, the complete namespace will be <em>/portletNamespace/modeNamespace/actionName</em></td>
+      <td>The default namespace.</td>
+    </tr>
+    <tr>
+      <td>viewNamespace</td>
+      <td>The namespace in the xwork config for the view portlet mode.</td>
+      <td>The default namespace.</td>
+    </tr>
+    <tr>
+      <td>editNamespace</td>
+      <td>The namespace in the xwork config for the edit portlet mode.</td>
+      <td>The default namespace.</td>
+    </tr>
+    <tr>
+      <td>helpNamespace</td>
+      <td>The namespace in the xwork config for the help portlet mode.</td>
+      <td>The default namespace.</td>
+    </tr>
+    <tr>
+      <td>defaultViewAction</td>
+      <td>Name of the action to use as default for the view portlet mode, when no action name is present.</td>
+      <td>default</td>
+    </tr>
+    <tr>
+      <td>defaultEditAction</td>
+      <td>Name of the action to use as default for the edit portlet mode, when no action name is present.</td>
+      <td>default</td>
+    </tr>
+    <tr>
+      <td>defaultHelpAction</td>
+      <td>Name of the action to use as default for the help portlet mode, when no action name is present.</td>
+      <td>default</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>e.g.</p>
+
+<p><strong>portlet.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;init-param&gt;</span>
+    <span class="c">&lt;!-- Portlet namespace --&gt;</span>
+    <span class="nt">&lt;name&gt;</span>portletNamespace<span class="nt">&lt;/name&gt;</span>
+    <span class="nt">&lt;value&gt;</span>/portletA<span class="nt">&lt;/value&gt;</span>
+<span class="nt">&lt;/init-param&gt;</span>
+<span class="nt">&lt;init-param&gt;</span>
+    <span class="c">&lt;!-- The base namespace of the view portlet mode --&gt;</span>
+    <span class="nt">&lt;name&gt;</span>viewNamespace<span class="nt">&lt;/name&gt;</span>
+    <span class="nt">&lt;value&gt;</span>/view<span class="nt">&lt;/value&gt;</span>
+<span class="nt">&lt;/init-param&gt;</span>
+<span class="nt">&lt;init-param&gt;</span>
+    <span class="c">&lt;!-- The default action to invoke in view mode --&gt;</span>
+    <span class="nt">&lt;name&gt;</span>defaultViewAction<span class="nt">&lt;/name&gt;</span>
+    <span class="nt">&lt;value&gt;</span>index<span class="nt">&lt;/value&gt;</span>
+<span class="nt">&lt;/init-param&gt;</span>
+</code></pre>
+</div>
+
+<p>This snippet from <code class="highlighter-rouge">portlet.xml</code> will set up the portlet with a namespace of <em>/portletA/</em>. This means that all requests to this portlet will get the namespace prepended when looking up the action. In addition, the _view_  portlet mode will map to the <em>/view</em>  namespace, so a request for action <code class="highlighter-rouge">myAction</code> will resolve to the namespace and action <em>/portletA/view/myAction</em> . It also means that i [...]
+
+<h3 id="webxml">web.xml</h3>
+
+<p>If you want to access to expose the value stack through request attributes (e.g. if you want to use regular JSTL tags to access values in the stack), you have to configure the dispatcher servlet in your web application descriptor:</p>
+
+<p><strong>web.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;servlet</span> <span class="na">id=</span><span class="s">"Struts2PortletDispatcherServlet"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>Struts2PortletDispatcherServlet<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.portlet.dispatcher.DispatcherServlet<span class="nt">&lt;/servlet-class&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span>
+</code></pre>
+</div>
+
+<p><strong>If you’re only using Struts 2 tags, configuring the dispatcher servlet is optional</strong></p>
+
+<h3 id="portlet-phases">Portlet Phases</h3>
+
+<p>The portlet specification describes that a portlet request cycle can consist of two phases, an <em>event</em>  phase and a <em>render</em>  phase. In case of an <em>event</em>  in the portlet, it will always execute before the <em>render</em>  phase. The <em>event</em>  phase is typically for changing the state of the application. In a portlet, this is typically when a form is submitted. The <em>render</em>  phase will then prepare and dispatch to the view. It’s recommended that you s [...]
+
+<h3 id="portlet-result-dispatching">Portlet Result Dispatching</h3>
+
+<p>The <em>struts-portlet-default</em>  package defines a special default Result Type, which is responsible for performing the result logic of an Action execution. Typically, this involves including a JSP for rendering, or preparing a render action if one is configured for the current event action.</p>
+
+<p>This result type has three main modes of execution.</p>
+
+<ul>
+  <li>
+    <p>If the Action is executed in the render phase, it will perform a PortletRequestDispatcher.include(req, res) to the resource specified in the <em>location</em>  attribute.</p>
+  </li>
+  <li>
+    <p>If the Action is executed in the event phase, and the result is an action mapping, it will set a render parameter on the ActionResponse to indicate which Action should be executed in the render phase. This follows good web application design, which promotes the use of a redirect after an event, which in this case means that an Action executed in the event phase will be followed by a redirect to an Action executed in the render phase.</p>
+  </li>
+  <li>
+    <p>If the Action is executed in the event phase, and the result is not an action mapping, the result will prepare a special Action called “renderDirect” (specified in the <em>struts-portlet-default</em>  package) whose sole purpose is to render the specified web resource (usually a JSP).</p>
+  </li>
+</ul>
+
+<h4 id="redirectaction">redirectAction</h4>
+
+<p>The action executed in event mode can pass render parameters to the next action to execute in render mode through parameters using the <em>redirectAction</em>  result type:</p>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>displayCart<span class="nt">&lt;/param&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"userId"</span><span class="nt">&gt;</span>${userId}<span class="nt">&lt;/param&gt;</span>  
+    <span class="c">&lt;!-- If you want to redirect to a different portlet mode, use the portletMode parameter 
+    &lt;param name="portletMode"&gt;view&lt;/param&gt;
+    --&gt;</span>
+<span class="nt">&lt;/result&gt;</span>
+</code></pre>
+</div>
+
+<p>This will set up a <em>render parameter</em>  called <em>userId</em>  with the value of the <em>userId</em>  property on the value stack.</p>
+
+<p>You can also use the <em>portletMode</em>  parameter to change to a different portlet mode.</p>
+
+<h3 id="surl-and-sform-tags">s:url and s:form tags</h3>
+
+<p>URLs in a portlet is handled quite different than for a regular web application. There’s no such thing as “extension”, there’s simply an action name and a namespace, and they have to be specified using the respective tag attributes. URLs using the <em>value</em>  attribute will be encoded as a resource URL and is only suitable for additional resources such as images and style sheets.</p>
+
+<p>Example:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Servlet</th>
+      <th>Portlet</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>&lt;s:url value=”hello.action”/&gt;</td>
+      <td>&lt;s:url action=”hello”/&gt;</td>
+    </tr>
+    <tr>
+      <td>&lt;s:url value=”style.css”/&gt;</td>
+      <td>&lt;s:url value=”style.css”/&gt;</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>In addition, there are some additional tag attributes that are portlet specific. These are:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Name</th>
+      <th>Description</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>portletMode</td>
+      <td>The resulting portlet mode of the url</td>
+    </tr>
+    <tr>
+      <td>windowState</td>
+      <td>The resulting window state of the url</td>
+    </tr>
+    <tr>
+      <td>portletUrlType</td>
+      <td>Specifies if this is a <em>render</em>  or an <em>action</em>  url</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Typical usage for the <em>portletUrlType</em>  is if you have a <em>delete</em>  link that removes something from a database. To ensure this is done in the event phase, as recommended by the portlet specification (since it is a change of state), the url can use this attribute, e.g. &lt;s:url action=”deleteEntry” portletUrlType=”action”/&gt;</p>
+
+<h3 id="security">Security</h3>
+
+<p>Basically the Struts2 Portlet Plugin doesn’t support different auth level in the same portlet. If you want to achieve that you must create two separated portlets and configure access level with portlet engine for each of them.</p>
+
+<h3 id="other-resources">Other resources</h3>
+
+<ul>
+  <li><a href="struts-2-portlet-tutorial.html">Struts 2 Portlet Tutorial</a></li>
+  <li><a href="http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html">JSR168 Specification</a></li>
+  <li><a href="http://jcp.org/aboutJava/communityprocess/final/jsr286/index.html">JSR286 Specification</a></li>
+</ul>
+
+  </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>
diff --git a/content/plugins/portlet/struts-2-portlet-tutorial.html b/content/plugins/portlet/struts-2-portlet-tutorial.html
new file mode 100644
index 0000000..b86e2ec
--- /dev/null
+++ b/content/plugins/portlet/struts-2-portlet-tutorial.html
@@ -0,0 +1,800 @@
+<!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>Struts 2 Portlet Tutorial</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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/portlet/struts-2-portlet-tutorial.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="struts-2-portlet-tutorial">Struts 2 Portlet Tutorial</h1>
+
+<h2 id="creating-a-simple-bookmark-portlet">Creating a simple Bookmark Portlet</h2>
+
+<p>Using version 2.1.1-SNAPSHOT of the portlet plugin</p>
+
+<blockquote>
+  <p>Note that this tutorial assumes that you’re familiar with basic Struts 2 web application programming.
+If you have not used Struts 2 before, please check out some of the other Struts 2 tutorials first.</p>
+</blockquote>
+
+<h3 id="preparations">Preparations</h3>
+
+<p>In this tutorial we will use eclipse as our IDE. If you do not have Eclipse, you can download it from <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+<p>The project itself will be set up using Maven 2. Maven 2 is available from <a href="http://maven.apache.org">http://maven.apache.org</a>.</p>
+
+<p>If you have not used the maven-eclipse-plugin before, you need to set up the Eclipse workspace with a variable that points to the Maven 2 repository. To do this, type</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>mvn -Declipse.workspace=&lt;path-to-eclipse-workspace&gt; eclipse:add-maven-repo
+</code></pre>
+</div>
+
+<h3 id="creating-the-project">Creating the project</h3>
+
+<p>We’ll use Maven 2 with the Struts 2 Portlet Archetype to create a skeleton project for our portlet application. From the command line, issue the command:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>mvn archetype:create -DarchetypeGroupId=org.apache.struts -DarchetypeArtifactId=struts2-archetype-portlet -DarchetypeVersion=2.1.1-SNAPSHOT -DartifactId=bookmark-portlet 
+    -DgroupId=com.mycompany -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository
+</code></pre>
+</div>
+
+<p>This will set up the maven 2 structure for us and also set up the basic configuration needed to create a Struts 2 portlet. The archetype creates a sample HelloWorld portlet that shows off some of the basic principles of Struts 2 portlet programming. To test the set up, type <code class="highlighter-rouge">mvn jetty:run -P pluto-embedded</code> in a command prompt. Open a browser and point your browser to http://localhost:8080/bookmark-portlet/pluto/index.jsp and play around.</p>
+
+<h3 id="looking-at-the-basics">Looking at the basics</h3>
+
+<p>To see how the basic HelloWorld example works, let’s look at some of the configuration files, starting with the JSR168 portlet descriptor</p>
+
+<p><strong>src/main/webapp/WEB-INF/portlet.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+
+<span class="nt">&lt;portlet-app</span>
+   <span class="na">version=</span><span class="s">"1.0"</span>
+   <span class="na">xmlns=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"</span>
+   <span class="na">xmlns:xsi=</span><span class="s">"http://www.w3.org/2001/XMLSchema-instance"</span>
+   <span class="na">xsi:schemaLocation=</span><span class="s">"http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"</span>
+   <span class="na">id=</span><span class="s">"bookmark-portlet"</span><span class="nt">&gt;</span>
+
+   <span class="nt">&lt;portlet</span> <span class="na">id=</span><span class="s">"HelloPortlet"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;description</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>Simple hello world portlet<span class="nt">&lt;/description&gt;</span>
+      <span class="nt">&lt;portlet-name&gt;</span>HelloPortlet<span class="nt">&lt;/portlet-name&gt;</span>
+      <span class="nt">&lt;display-name</span> <span class="na">xml:lang=</span><span class="s">"EN"</span><span class="nt">&gt;</span>bookmark-portlet<span class="nt">&lt;/display-name&gt;</span>
+		
+      <span class="nt">&lt;portlet-class&gt;</span>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher<span class="nt">&lt;/portlet-class&gt;</span>
+		
+      <span class="c">&lt;!-- The namespace for the actions configured for view mode --&gt;</span>
+      <span class="nt">&lt;init-param&gt;</span>
+         <span class="nt">&lt;name&gt;</span>viewNamespace<span class="nt">&lt;/name&gt;</span>
+         <span class="nt">&lt;value&gt;</span>/view<span class="nt">&lt;/value&gt;</span>
+      <span class="nt">&lt;/init-param&gt;</span>
+		
+      <span class="c">&lt;!-- The default action to invoke in view mode. --&gt;</span>
+      <span class="nt">&lt;init-param&gt;</span>
+         <span class="nt">&lt;name&gt;</span>defaultViewAction<span class="nt">&lt;/name&gt;</span>
+         <span class="nt">&lt;value&gt;</span>index<span class="nt">&lt;/value&gt;</span>
+      <span class="nt">&lt;/init-param&gt;</span>
+		
+      <span class="c">&lt;!-- The namespace for the actions configured for edit mode --&gt;</span>
+      <span class="nt">&lt;init-param&gt;</span>
+         <span class="nt">&lt;name&gt;</span>editNamespace<span class="nt">&lt;/name&gt;</span>
+         <span class="nt">&lt;value&gt;</span>/edit<span class="nt">&lt;/value&gt;</span>
+      <span class="nt">&lt;/init-param&gt;</span>
+		
+      <span class="c">&lt;!-- The default action to invoke in edit mode. --&gt;</span>
+      <span class="nt">&lt;init-param&gt;</span>
+         <span class="nt">&lt;name&gt;</span>defaultEditAction<span class="nt">&lt;/name&gt;</span>
+         <span class="nt">&lt;value&gt;</span>index!input<span class="nt">&lt;/value&gt;</span>
+      <span class="nt">&lt;/init-param&gt;</span>
+		
+      <span class="nt">&lt;expiration-cache&gt;</span>0<span class="nt">&lt;/expiration-cache&gt;</span>
+		
+      <span class="nt">&lt;supports&gt;</span>
+         <span class="nt">&lt;mime-type&gt;</span>text/html<span class="nt">&lt;/mime-type&gt;</span>
+         <span class="nt">&lt;portlet-mode&gt;</span>view<span class="nt">&lt;/portlet-mode&gt;</span>
+         <span class="nt">&lt;portlet-mode&gt;</span>edit<span class="nt">&lt;/portlet-mode&gt;</span>
+      <span class="nt">&lt;/supports&gt;</span>
+		
+      <span class="nt">&lt;supported-locale&gt;</span>en<span class="nt">&lt;/supported-locale&gt;</span>
+		
+      <span class="nt">&lt;portlet-info&gt;</span>
+         <span class="nt">&lt;title&gt;</span>HelloPortlet<span class="nt">&lt;/title&gt;</span>
+         <span class="nt">&lt;short-title&gt;</span>HelloPortlet<span class="nt">&lt;/short-title&gt;</span>
+         <span class="nt">&lt;keywords&gt;</span>struts 2,portlet,hello,world<span class="nt">&lt;/keywords&gt;</span>
+      <span class="nt">&lt;/portlet-info&gt;</span>
+   <span class="nt">&lt;/portlet&gt;</span>  
+<span class="nt">&lt;/portlet-app&gt;</span>
+
+</code></pre>
+</div>
+
+<p>The important parts to notice are the <em>portlet-class</em>  and <em>init-param</em>  elements. The <em>portlet-class</em>  element is always <strong><em>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</em></strong> (or a subclass, if you have added some custom functionality). This is the portlet that acts as the dispatcher for the Struts 2 framework, and translates incoming user interaction to action requests that Struts 2 understands. The init-params <em>viewNamespace</em> , [...]
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="cp">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
+<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</span> <span class="na">name=</span><span class="s">"default"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/view"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.HelloAction"</span><span class="nt">&gt;</span>
+	    <span class="nt">&lt;result&gt;</span>/WEB-INF/jsp/view/index.jsp<span class="nt">&lt;/result&gt;</span>
+	<span class="nt">&lt;/action&gt;</span>
+   <span class="nt">&lt;/package&gt;</span>
+	
+   <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"edit"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/edit"</span><span class="nt">&gt;</span>
+	<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.UpdateNameAction"</span><span class="nt">&gt;</span>
+	    <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
+	        <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/param&gt;</span>
+		<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"portletMode"</span><span class="nt">&gt;</span>view<span class="nt">&lt;/param&gt;</span>
+	    <span class="nt">&lt;/result&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/jsp/edit/index.jsp<span class="nt">&lt;/result&gt;</span>
+	<span class="nt">&lt;/action&gt;</span>
+    <span class="nt">&lt;/package&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+
+</code></pre>
+</div>
+
+<p>As we can see, the actions for the <em>view</em>  portlet mode is in the <em>default</em>  package, with <em>/view</em>  as namespace, and the actions for the <em>edit</em>  portlet mode is in the <em>edit</em>  package, with <em>/edit</em>  as namespace.</p>
+
+<h3 id="import-the-project-into-eclipse">Import the project into Eclipse</h3>
+
+<p>Now let’s import the project into Eclipse. First, type <code class="highlighter-rouge">mvn eclipse:eclipse -P pluto-embedded</code> then start Eclipse (if you have not already done so), and import the project using “File -&gt; Import -&gt; General -&gt; Existing Projects into Workspace”. Browse to the folder where you created the project and press finish. Your portlet project should now be setup up with all dependencies in place.</p>
+
+<h3 id="creating-the-bookmark-domain-object">Creating the Bookmark domain object</h3>
+
+<p>To represent the bookmarks, we’ll create a simple domain object. We’ll keep it really simple, so the Bookmark object will only have a <em>name</em>  and a <em>url</em>  property:</p>
+
+<p><strong>src/main/java/com/mycompany/domain/Bookmark.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Bookmark</span> <span class="o">{</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
+
+   <span class="kd">public</span> <span class="n">Bookmark</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">String</span> <span class="n">url</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">getName</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">name</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">getUrl</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<h3 id="adding-bookmarks">Adding bookmarks</h3>
+
+<p>Adding bookmarks is an operation that logically belongs to the <em>edit</em>  portlet mode. So we’ll create a simple action for this purpose, and configure it in the <em>edit</em>  configuration package. In normal Struts 2 fashion, we’ll create an action object with the properties we need:</p>
+
+<p><strong>src/main/java/com/mycompany/AddBookmark.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AddBookmarkAction</span> <span class="kd">extends</span> <span class="n">DefaultActionSupport</span> <span class="o">{</span>
+
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setName</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setUrl</span><span class="o">(</span><span class="n">String</span> <span class="n">url</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="nd">@Override</span>
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+   <span class="o">}</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>And in struts.xml, remove the existing configuration for the edit package and add an entry for the action:</p>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"edit"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/edit"</span><span class="nt">&gt;</span>
+	
+   <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.AddBookmarkAction"</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/jsp/edit/index.jsp<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>Let’s create the input form so we have something to display. The form is really simple, with a label and a text field for each of the properties in the <em>Bookmark</em>  domain object:</p>
+
+<p><strong>src/main/webapp/WEB-INF/jsp/edit/index.jsp</strong></p>
+
+<pre><code class="language-jsp">
+&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
+
+&lt;h2&gt;Manage bookmarks&lt;/h2&gt;
+
+&lt;s:form action="index"&gt;
+   &lt;table&gt;
+      &lt;s:textfield name="name" label="Name"/&gt;
+      &lt;s:textfield name="url" label="URL"/&gt;
+      &lt;s:submit value="Add"/&gt;
+   &lt;/table&gt;
+&lt;/s:form&gt;
+
+</code></pre>
+
+<p>The textfields maps to the property names we have defined in <em>AddBookmarkAction</em> . Before we continue, let’s check that everything is configured correctly and check that our portlet can be run. In a command prompt, change into the directory where you have created the project and issue the command <code class="highlighter-rouge">mvn jetty:run -P pluto-embedded</code> . Then open http://localhost:8080/bookmark-portlet/pluto/index.jsp and click on the <em>edit</em>  portlet window [...]
+
+<p><img src="../attachments/att59671071_AddBookmarkForm.jpg" alt="AddBookmarkForm.jpg" /></p>
+
+<p>If you try to submit data in the form, it will obviously not work since we have not implemented any logic to add bookmarks yet. That will be our next task. Since we’ll need a PortletPreferences reference, we’ll have the action implement the <em>PortletPreferencesAware</em>  interface that will instruct Struts 2 to inject this into our action, without the need for us to look it up manually. When we have the reference to the <em>PortletPreferences</em>  object, we’ll implement logic to  [...]
+
+<p><strong>src/main/java/com/mycompany/AddBookmarkAction.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">AddBookmarkAction</span> <span class="kd">extends</span> <span class="n">DefaultActionSupport</span> <span class="kd">implements</span> <span class="n">PortletPreferencesAware</span> <span class="o">{</span>
+
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
+	
+   <span class="kd">private</span> <span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">;</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setName</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setUrl</span><span class="o">(</span><span class="n">String</span> <span class="n">url</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setPortletPreferences</span><span class="o">(</span><span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">portletPreferences</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">;</span>	
+   <span class="o">}</span>
+
+   <span class="nd">@Override</span>
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">setValue</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="n">url</span><span class="o">);</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">store</span><span class="o">();</span>
+      <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+   <span class="o">}</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>After the bookmark has been stored, we’ll just redirect back to the input form:</p>
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"edit"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/edit"</span><span class="nt">&gt;</span>
+	
+   <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.AddBookmarkAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
+         <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index!input<span class="nt">&lt;/param&gt;</span>
+      <span class="nt">&lt;/result&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/jsp/edit/index.jsp<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>We use a <em>redirectAction</em>  result type to redirect back to the input form in proper PRG (Post - Redirect - Get) manner.</p>
+
+<p>Now we can add some bookmarks. We don’t get much feedback though, so let’s proceed…</p>
+
+<h3 id="listing-the-bookmarks">Listing the bookmarks</h3>
+
+<p>The bookmarks will be listed in the <em>view</em>  portlet mode, so we’ll create a <em>ListBookmarksAction</em>  and configure it in the default package:</p>
+
+<p><strong>src/main/java/com/mycompany/ListBookmarksAction.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ListBookmarksAction</span> <span class="kd">extends</span> <span class="n">DefaultActionSupport</span> <span class="kd">implements</span> <span class="n">PortletPreferencesAware</span> <span class="o">{</span>
+   <span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Bookmark</span><span class="o">&gt;</span> <span class="n">bookmarks</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">Bookmark</span><span class="o">&gt;();</span>
+   <span class="kd">private</span> <span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">;</span>
+
+   <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Bookmark</span><span class="o">&gt;</span> <span class="n">getBookmarks</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">bookmarks</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setPortletPreferences</span><span class="o">(</span><span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">portletPreferences</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="nd">@Override</span>
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="c1">// For simplicity, we'll assume that only bookmarks are stored in the preferences.</span>
+      <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">[]&gt;</span> <span class="n">preferencesMap</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">.</span><span class="na">getMap</span><span class="o">();</span>
+      <span class="k">for</span><span class="o">(</span><span class="n">Map</span><span class="o">.</span><span class="na">Entry</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">[]&gt;</span> <span class="n">entry</span> <span class="o">:</span> <span class="n">preferencesMap</span><span class="o">.</span><span class="na">entrySet</span><span class="o">())</span> <span class="o">{</span>
+         <span class="n">bookmarks</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Bookmark</span><span class="o">(</span><span class="n">entry</span><span class="o">.</span><span class="na">getKey</span><span class="o">(),</span> <span class="n">entry</span><span class="o">.</span><span class="na">getValue</span><span class="o">()[</span><span class="mi">0</span><span class="o">]));</span>
+      <span class="o">}</span>
+      <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+   <span class="o">}</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>Again we use the <em>PortletPreferencesAware</em>  to get the <em>PortletPreferences</em>  injected in our action. Then we just get all the values from the preferences and add them as a <em>Bookmark</em>  instance in an <em>ArrayList</em> .</p>
+
+<p>Obviously, we’ll need a jsp to view the list of bookmarks:</p>
+
+<p><strong>src/main/webapp/WEB-INF/jsp/view/index.jsp</strong></p>
+
+<pre><code class="language-jsp">
+&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
+
+&lt;strong&gt;Bookmarks&lt;/strong&gt;
+&lt;p&gt;
+   &lt;table&gt;
+   &lt;s:iterator value="%{bookmarks}" var="bookmark"&gt;
+      &lt;tr&gt;
+         &lt;td&gt;&lt;s:property value="%{name}"/&gt;&lt;/td&gt;
+         &lt;td&gt;&lt;a href="&lt;s:property value="%{url}"/&gt;" target="_blank"&gt;&lt;s:property value="%{url}"/&gt;&lt;/a&gt;&lt;/td&gt;
+      &lt;/tr&gt;
+   &lt;/s:iterator&gt;
+   &lt;/table&gt;
+&lt;/p&gt;
+
+</code></pre>
+
+<p>In the JSP, we just iterate over the list of Bookmarks and print the properties in the iterator loop.</p>
+
+<p>In struts.xml, remove the <em>default</em>  package, and add this instead:</p>
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"view"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/view"</span><span class="nt">&gt;</span>
+   <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.ListBookmarksAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;result&gt;</span>/WEB-INF/jsp/view/index.jsp<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>When you’re ready, go back to a command prompt and start the server again (<code class="highlighter-rouge">mvn jetty:run -P pluto-embedded</code>), open a browser and start adding some bookmarks. When you go back to <em>view</em>  mode after adding a few, you’ll see the bookmarks listed:</p>
+
+<p><img src="../attachments/att59671072_ListBookmarks.jpg" alt="ListBookmarks.jpg" /></p>
+
+<h3 id="preparing-for-bookmark-management">Preparing for bookmark management</h3>
+
+<p>It would be nice to be able to manage the list of bookmarks, so we’ll add delete and edit functionality. All modifications will happen in the <em>edit</em>  portlet mode. We’ll start by displaying the list of bookmarks in the <em>edit</em>  mode as well. The plan is to extend this list to add a <em>delete</em>  and an <em>edit</em>  link to modify the bookmark entries. We’ll do it really simple and just copy the code from the <em>index.jsp</em>  for view into the index.jsp for <em>edi [...]
+
+<p><strong>src/main/webapp/WEB-INF/jsp/edit/index.jsp</strong></p>
+
+<pre><code class="language-jsp">
+&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
+
+&lt;h2&gt;Manage bookmarks&lt;/h2&gt;
+
+&lt;p&gt;
+   &lt;table&gt;
+   &lt;s:iterator value="%{bookmarks}" var="bookmark"&gt;
+      &lt;s:url action="editBookmark!input" id="editUrl"&gt;
+         &lt;s:param name="oldName" value="%{name}"/&gt;
+      &lt;/s:url&gt;
+      &lt;s:url action="deleteBookmark" portletUrlType="action" id="deleteUrl"&gt;
+         &lt;s:param name="bookmarkName" value="%{name}"/&gt;
+      &lt;/s:url&gt;
+      &lt;tr&gt;
+         &lt;td&gt;&lt;s:property value="%{name}"/&gt;&lt;/td&gt;
+         &lt;td&gt;&lt;a href="&lt;s:property value="%{url}"/&gt;" target="_blank"&gt;&lt;s:property value="%{url}"/&gt;&lt;/a&gt;&lt;/td&gt;
+         &lt;td&gt;&lt;a href="&lt;s:property value="%{editUrl}"/&gt;"&gt;Edit&lt;/a&gt;&lt;/td&gt;
+         &lt;td&gt;&lt;a href="&lt;s:property value="%{deleteUrl}"/&gt;"&gt;Delete&lt;/a&gt;&lt;/td&gt;
+      &lt;/tr&gt;
+   &lt;/s:iterator&gt;
+   &lt;/table&gt;
+&lt;/p&gt;
+
+&lt;s:form action="addBookmark"&gt;
+   &lt;table&gt;
+      &lt;s:textfield name="name" label="Name"/&gt;
+      &lt;s:textfield name="url" label="URL"/&gt;
+      &lt;s:submit value="Add"/&gt;
+   &lt;/table&gt;
+&lt;/s:form&gt;
+
+</code></pre>
+
+<p>For the <em>delete</em>  url we need to specify that it is a portlet action url since portlet preferences cannot be changed in the render phase. We also need to change our configuration a bit since we’ll use this page as index page for <em>edit</em>  mode, and not only as the input form for the <em>AddBookmarkAction</em> :</p>
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"edit"</span> <span class="na">extends=</span><span class="s">"struts-portlet-default"</span> <span class="na">namespace=</span><span class="s">"/edit"</span><span class="nt">&gt;</span>
+
+   <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span> <span class="na">class=</span><span class="s">"com.mycompany.ListBookmarksAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;result&gt;</span>/WEB-INF/jsp/edit/index.jsp<span class="nt">&lt;/result&gt;</span>
+   <span class="nt">&lt;/action&gt;</span>
+
+   <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"addBookmark"</span> <span class="na">class=</span><span class="s">"com.mycompany.AddBookmarkAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
+         <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/param&gt;</span>
+      <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>Here we have added the <em>ListBookmarksAction</em>  as the <em>index</em>  action, which will display the bookmark list with the input form. When the form is submitted, it will invoke the <em>addBookmark</em>  action, and upon success, control is redirected back to the <em>index</em>  action. With this new structure, we’ll also need to updated the portlet descriptor to use <em>index</em>  instead of <em>index!input</em>  as the default action for <em>edit</em>  mode:</p>
+
+<p><strong>src/main/webapp/WEB-INF/portlet.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="c">&lt;!-- The default action to invoke in edit mode. --&gt;</span>
+<span class="nt">&lt;init-param&gt;</span>
+   <span class="nt">&lt;name&gt;</span>defaultEditAction<span class="nt">&lt;/name&gt;</span>
+   <span class="nt">&lt;value&gt;</span>index<span class="nt">&lt;/value&gt;</span>
+<span class="nt">&lt;/init-param&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Now you can (re)start the server and see how it works. This is how it looks in <em>edit</em>  mode after adding a few entries:</p>
+
+<p><img src="../attachments/att59671070_ListBookmarksInEditMode.jpg" alt="ListBookmarksInEditMode.jpg" /></p>
+
+<h3 id="deleting-bookmarks">Deleting bookmarks</h3>
+
+<p>Let’s create the action that handles deletion of bookmarks. It’s pretty simple. As with our other actions, we need to get a reference to the <em>PortletPreferences</em>  and simply remove the bookmark values from it:</p>
+
+<p><strong>src/main/java/com/mycompany/DeleteBookmarkAction.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DeleteBookmarkAction</span> <span class="kd">extends</span> <span class="n">DefaultActionSupport</span> <span class="kd">implements</span> <span class="n">PortletPreferencesAware</span><span class="o">{</span>
+
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">bookmarkName</span><span class="o">;</span>
+	
+   <span class="kd">private</span> <span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">;</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setBookmarkName</span><span class="o">(</span><span class="n">String</span> <span class="n">bookmarkName</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">bookmarkName</span> <span class="o">=</span> <span class="n">bookmarkName</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setPortletPreferences</span><span class="o">(</span><span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">portletPreferences</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="nd">@Override</span>
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">reset</span><span class="o">(</span><span class="n">bookmarkName</span><span class="o">);</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">store</span><span class="o">();</span>
+      <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+   <span class="o">}</span>
+
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>Pretty simple and straight forward. Next, add a configuration entry for the action in the <em>edit</em>  package:</p>
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"deleteBookmark"</span> <span class="na">class=</span><span class="s">"com.mycompany.DeleteBookmarkAction"</span><span class="nt">&gt;</span>
+   <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/param&gt;</span>
+   <span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<p>After a bookmark has been deleted, we redirect back to the <em>index</em>  action. Now you should be able to click the <em>Delete</em>  link to remove individual entries.</p>
+
+<h3 id="editing-bookmarks">Editing bookmarks</h3>
+
+<p>The final step is to edit bookmark entries. When the user clicks the <em>edit</em>  link, the portlet will display a new page with an input form and the bookmark values already filled in the text fields. We’ll start by creating the jsp file:</p>
+
+<p><strong>src/main/webapp/WEB-INF/jsp/edit.jsp</strong></p>
+
+<pre><code class="language-jsp">
+&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;
+
+&lt;h2&gt;Edit bookmark&lt;/h2&gt;
+
+&lt;s:form action="editBookmark"&gt;
+   &lt;input type="hidden" name="oldName" value="&lt;s:property value="%{oldName}"/&gt;"/&gt;
+   &lt;table&gt;
+      &lt;s:textfield name="name" label="Name" value="%{oldName}"/&gt;
+      &lt;s:textfield name="url" label="URL"/&gt;
+      &lt;s:submit value="Update"/&gt;
+   &lt;/table&gt;
+&lt;/s:form&gt;
+
+</code></pre>
+
+<p>The <em>oldName</em>  hidden field keeps track of which bookmark is beeing edited, since the name is also our id to the entry beeing edited. The actual update of the bookmark will be a “delete and add a new entry”:</p>
+
+<p><strong>src/main/java/com/mycompany/EditBookmarkAction.java</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">EditBookmarkAction</span> <span class="kd">extends</span> <span class="n">DefaultActionSupport</span> <span class="kd">implements</span> <span class="n">PortletPreferencesAware</span><span class="o">,</span> <span class="n">Preparable</span><span class="o">,</span> <span class="n">ParameterAware</span> <span class="o">{</span>
+
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">oldName</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">name</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">String</span> <span class="n">url</span><span class="o">;</span>
+	
+   <span class="kd">private</span> <span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">;</span>
+   <span class="kd">private</span> <span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">[]&gt;</span> <span class="n">parameters</span><span class="o">;</span>
+	
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">getOldName</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">oldName</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setOldName</span><span class="o">(</span><span class="n">String</span> <span class="n">oldName</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">oldName</span> <span class="o">=</span> <span class="n">oldName</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">getUrl</span><span class="o">()</span> <span class="o">{</span>
+      <span class="k">return</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setUrl</span><span class="o">(</span><span class="n">String</span> <span class="n">url</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">url</span><span class="o">;</span>
+   <span class="o">}</span>
+
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setName</span><span class="o">(</span><span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setPortletPreferences</span><span class="o">(</span><span class="n">PortletPreferences</span> <span class="n">portletPreferences</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">portletPreferences</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">setParameters</span><span class="o">(</span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="o">,</span> <span class="n">String</span><span class="o">[]&gt;</span> <span class="n">parameters</span><span class="o">)</span> <span class="o">{</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">parameters</span> <span class="o">=</span> <span class="n">parameters</span><span class="o">;</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="kt">void</span> <span class="n">prepare</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="c1">// Since the prepare interceptor is run before the parameter interceptor, </span>
+      <span class="c1">// we have to get the parameter "manually".</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">oldName</span> <span class="o">=</span> <span class="n">parameters</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"oldName"</span><span class="o">)[</span><span class="mi">0</span><span class="o">];</span>
+      <span class="k">this</span><span class="o">.</span><span class="na">url</span> <span class="o">=</span> <span class="n">portletPreferences</span><span class="o">.</span><span class="na">getValue</span><span class="o">(</span><span class="n">oldName</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span>
+   <span class="o">}</span>
+	
+   <span class="kd">public</span> <span class="n">String</span> <span class="n">execute</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+      <span class="c1">// The modification is handled as remove/add</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">reset</span><span class="o">(</span><span class="n">oldName</span><span class="o">);</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">setValue</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="n">url</span><span class="o">);</span>
+      <span class="n">portletPreferences</span><span class="o">.</span><span class="na">store</span><span class="o">();</span>
+      <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+   <span class="o">}</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>There’s a couple of new things here, but nothing unfamiliar if you have worked with Struts 2 before. We use the <em>Preparable</em>  interface to pre-populate the vaules in the edit form, and we use the <em>ParameterAware</em>  interface to get a reference to the request parameter map. Other than that, the <em>execute</em>  method simply resets the old value for the bookmark and add it with the (possibly) new name.</p>
+
+<p>The last thing we need to do is to add the configuration in the <em>edit</em>  package for the new action:</p>
+
+<p><strong>src/main/resources/struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"editBookmark"</span> <span class="na">class=</span><span class="s">"com.mycompany.EditBookmarkAction"</span><span class="nt">&gt;</span>
+   <span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"redirectAction"</span><span class="nt">&gt;</span>
+      <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"actionName"</span><span class="nt">&gt;</span>index<span class="nt">&lt;/param&gt;</span>
+   <span class="nt">&lt;/result&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/jsp/edit/edit.jsp<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<h3 id="summary">Summary</h3>
+
+<p>Using Struts 2, we built a simple bookmark portlet utilizing the <em>edit</em>  portlet mode for management operations. The tutorial should have given you a basic understanding of portlet development with Struts 2, and that it is not very different from using Struts 2 in a regular web application.</p>
+
+<h3 id="notes">Notes</h3>
+
+<p>Instead of using the Maven 2 Jetty plugin to run the tutorial, you can check out the <em>JettyPlutoLauncher</em>  which is included in the test sources. Just launch it as a regular Java class in your IDE. And to debug, just launch it in debug mode.</p>
+
+<h3 id="links">Links</h3>
+
+<ul>
+  <li><em>S2PLUGINS:Source code for the tutorial</em></li>
+  <li><a href="http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html">JSR168 Specification</a></li>
+  <li><a href="http://struts.apache.org/2.x/docs/portlet-configuration.html">Struts 2 Portlet Configuration options</a></li>
+  <li><a href="http://portletwork.blogspot.com">Author’s blog about portlet related development</a></li>
+  <li><a href="http://struts.apache.org/2.x/docs/portlet-tutorial-webwork-22.html">Old tutorial for WebWork 2</a></li>
+</ul>
+
+  </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>
diff --git a/content/plugins/rest/index.html b/content/plugins/rest/index.html
new file mode 100644
index 0000000..25fca36
--- /dev/null
+++ b/content/plugins/rest/index.html
@@ -0,0 +1,659 @@
+<!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>REST Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/rest/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 class="no_toc" id="rest-plugin">REST Plugin</h1>
+
+<p>This plugin is only available with Struts 2.1.1 or later.</p>
+
+<ul id="markdown-toc">
+  <li><a href="#overview" id="markdown-toc-overview">Overview</a>    <ul>
+      <li><a href="#features" id="markdown-toc-features">Features</a></li>
+      <li><a href="#mapping-rest-urls-to-struts-2-actions" id="markdown-toc-mapping-rest-urls-to-struts-2-actions">Mapping REST URLs to Struts 2 Actions</a></li>
+      <li><a href="#content-types" id="markdown-toc-content-types">Content Types</a></li>
+    </ul>
+  </li>
+  <li><a href="#usage" id="markdown-toc-usage">Usage</a>    <ul>
+      <li><a href="#setting-up" id="markdown-toc-setting-up">Setting Up</a></li>
+      <li><a href="#write-your-controller-actions" id="markdown-toc-write-your-controller-actions">Write Your Controller Actions</a></li>
+    </ul>
+  </li>
+  <li><a href="#advanced-topics" id="markdown-toc-advanced-topics">Advanced Topics</a>    <ul>
+      <li><a href="#custom-contenttypehandlers" id="markdown-toc-custom-contenttypehandlers">Custom ContentTypeHandlers</a></li>
+      <li><a href="#use-jackson-framework-as-json-contenttypehandler" id="markdown-toc-use-jackson-framework-as-json-contenttypehandler">Use Jackson framework as JSON ContentTypeHandler</a></li>
+      <li><a href="#settings" id="markdown-toc-settings">Settings</a></li>
+    </ul>
+  </li>
+  <li><a href="#resources" id="markdown-toc-resources">Resources</a></li>
+  <li><a href="#version-history" id="markdown-toc-version-history">Version History</a></li>
+</ul>
+
+<h2 id="overview">Overview</h2>
+
+<p>The REST Plugin provides high level support for the implementation of RESTful resource based web applications
+<a href="../convention">Convention Plugin</a>.</p>
+
+<p>If you prefer to see a working code example, instead of reading through an explanation, you can download the <a href="/download.html#struts-ga">struts2 sample apps</a> and check out the <code class="highlighter-rouge">struts2-rest-showcase</code> application, a complete WAR file, that demonstrates a simple REST web program.</p>
+
+<h3 id="features">Features</h3>
+
+<ul>
+  <li>
+    <p>Ruby on Rails REST-style URLs</p>
+  </li>
+  <li>
+    <p>Zero XML config when used with Convention Plugin</p>
+  </li>
+  <li>
+    <p>Built-in serialization and deserialization support for XML and JSON</p>
+  </li>
+  <li>
+    <p>Automatic error handling</p>
+  </li>
+  <li>
+    <p>Type-safe configuration of the HTTP response</p>
+  </li>
+  <li>
+    <p>Automatic conditional GET support</p>
+  </li>
+</ul>
+
+<h3 id="mapping-rest-urls-to-struts-2-actions">Mapping REST URLs to Struts 2 Actions</h3>
+
+<p>The main functionality of the REST plugin lies in the interpretation of incoming request URL’s according the RESTful rules. In the Struts 2 framework, this ‘mapping’ of request URL’s to Actions is handled by in implementation of the <a href="http://struts.apache.org/maven/struts2-core/apidocs/org/apache/struts2/dispatcher/mapper/ActionMapper.html"><code class="highlighter-rouge">ActionMapper</code></a> interface. Out of the box, Struts 2 uses the <a href="http://struts.apache.org/mave [...]
+
+<p><em>Actions or Controllers</em> ? Most Struts 2 developers are familiar with the Action. They are the things that get executed by the incoming requests. In the context of the REST plugin, just to keep you on your toes, we’ll adopt the RESTful lingo and refer to our Actions as <em>Controllers</em> . Don’t be confused; it’s just a name!</p>
+
+<p>The REST plugin provides an alternative implementation, <a href="http://struts.apache.org/maven/struts2-plugins/struts2-rest-plugin/apidocs/org/apache/struts2/rest/RestActionMapper.html"><code class="highlighter-rouge">RestActionMapper</code></a>, that provides the RESTful logic that maps a URL to a give action class ( aka ‘controller’ in RESTful terms ) and, more specifically, to the invocation of a method on that controller class. The following section, which comes from the Javadoc  [...]
+
+<p><strong>RESTful URL Mapping Logic</strong></p>
+
+<p>This Restful action mapper enforces Ruby-On-Rails REST-style mappings. If the method is not specified (via ‘!’ or ‘method:’ prefix), the method is “guessed” at using REST-style conventions that examine the URL and the HTTP method. Special care has been given to ensure this mapper works correctly with the codebehind plugin so that XML configuration is unnecessary.</p>
+
+<p>This mapper supports the following parameters:</p>
+
+<ul>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.idParameterName</code> - If set, this value will be the name  of the parameter under which the id is stored. The id will then be removed  from the action name. Whether or not the method is specified, the mapper will  try to truncate the identifier from the url and store it as a parameter.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.indexMethodName</code>  - The method name to call for a GET  request with no id parameter. Defaults to <strong>index</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.getMethodName</code>  - The method name to call for a GET  request with an id parameter. Defaults to <strong>show</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.postMethodName</code>  - The method name to call for a POST  request with no id parameter. Defaults to <strong>create</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.putMethodName</code>  - The method name to call for a PUT  request with an id parameter. Defaults to <strong>update</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.deleteMethodName</code>  - The method name to call for a DELETE  request with an id parameter. Defaults to <strong>destroy</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.editMethodName</code>  - The method name to call for a GET  request with an id parameter and the <strong>edit</strong> view specified. Defaults to <strong>edit</strong>.</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">struts.mapper.newMethodName</code>  - The method name to call for a GET  request with no id parameter and the <strong>new</strong> view specified. Defaults to <strong>editNew</strong>.</p>
+  </li>
+</ul>
+
+<p>The following URL’s will invoke its methods:</p>
+
+<ul>
+  <li>
+    <p><code class="highlighter-rouge">GET: /movies</code> =&gt; method=<strong>index</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">GET: /movies/Thrillers</code> =&gt; method=<strong>show</strong>, id=<strong>Thrillers</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">GET: /movies/Thrillers;edit</code>  =&gt; method=<strong>edit</strong>, id=<strong>Thrillers</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">GET: /movies/Thrillers/edit</code>  =&gt; method=<strong>edit</strong>, id=<strong>Thrillers</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">GET: /movies/new</code>  =&gt; method=<strong>editNew</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">POST: /movies</code>  =&gt; method=<strong>create</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">PUT: /movies/Thrillers</code>  =&gt; method=<strong>update</strong>, id=<strong>Thrillers</strong></p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">DELETE: /movies/Thrillers</code>  =&gt; method=<strong>destroy</strong>, id=<strong>Thrillers</strong></p>
+  </li>
+</ul>
+
+<p>To simulate the HTTP methods PUT and DELETE, since they aren’t supported by HTML, the HTTP parameter “_method” will be used.</p>
+
+<p>Or, expressed as a table:</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>HTTP method</th>
+      <th>URI</th>
+      <th>Class.method</th>
+      <th>parameters</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>GET</td>
+      <td>/movie</td>
+      <td>Movie.index</td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>POST</td>
+      <td>/movie</td>
+      <td>Movie.create</td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>PUT</td>
+      <td>/movie/Thrillers</td>
+      <td>Movie.update</td>
+      <td>id=”Thrillers”</td>
+    </tr>
+    <tr>
+      <td>DELETE</td>
+      <td>/movie/Thrillers</td>
+      <td>Movie.destroy</td>
+      <td>id=”Thrillers”</td>
+    </tr>
+    <tr>
+      <td>GET</td>
+      <td>/movie/Thrillers</td>
+      <td>Movie.show</td>
+      <td>id=”Thrillers”</td>
+    </tr>
+    <tr>
+      <td>GET</td>
+      <td>/movie/Thrillers/edit</td>
+      <td>Movie.edit</td>
+      <td>id=”Thrillers”</td>
+    </tr>
+    <tr>
+      <td>GET</td>
+      <td>/movie/new</td>
+      <td>Movie.editNew</td>
+      <td> </td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="content-types">Content Types</h3>
+
+<p>In addition to providing mapping of RESTful URL’s to Controller ( Action ) invocations, the REST plugin also provides the ability to produce multiple representations of the resource data. By default, the plugin can return the resource in the following content types:</p>
+
+<ul>
+  <li>
+    <p>HTML</p>
+  </li>
+  <li>
+    <p>XML </p>
+  </li>
+  <li>
+    <p>JSON</p>
+  </li>
+</ul>
+
+<p>There is nothing configure here, just add the conent type extension to your RESTful URL. The framework will take care of the rest. So, for instance, assuming a Controller called Movies and a movie with the id of superman, the following URL’s will all hit the</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>http://my.company.com/myapp/movies/superman
+http://my.company.com/myapp/movies/superman.xml
+http://my.company.com/myapp/movies/superman.xhtml
+http://my.company.com/myapp/movies/superman.json
+
+</code></pre>
+</div>
+
+<blockquote>
+  <p>Note, these content types are supported as incoming data types as well. And, if you need, you can extend the functionality by writing your own implementations of org.apache.struts2.rest.handler.ContentTypeHandler and registering them with the system.</p>
+</blockquote>
+
+<h2 id="usage">Usage</h2>
+
+<p>This section will walk you through a quick demo. Here are the steps in the sequence that we will follow.</p>
+
+<ul>
+  <li>
+    <p>Setting Up your Project</p>
+  </li>
+  <li>
+    <p>Configuring your Project</p>
+  </li>
+  <li>
+    <p>Writing your Controllers</p>
+  </li>
+</ul>
+
+<h3 id="setting-up">Setting Up</h3>
+
+<p>Assuming you have a normal Struts 2 application, all you need to do for this REST demo is to add the following two plugins:</p>
+
+<ul>
+  <li>
+    <p>Struts 2 Rest Plugin</p>
+  </li>
+  <li>
+    <p><a href="../convention">Struts 2 Convention Plugin</a></p>
+  </li>
+</ul>
+
+<blockquote>
+  <p>Note, you can download the jars for these plugins from <a href="http://search.maven.org/#search%7Cga%7C1%7Cstruts2-convention-plugin">Maven Central</a></p>
+</blockquote>
+
+<p><strong>Configuration ( struts.xml )</strong></p>
+
+<p>Just dropping the plugin’s into your application may not produce exactly the desired effect. There are a couple of considerations. The first consideration is whether you want to have any non-RESTful URL’s coexisting with your RESTful URL’s. We’ll show two configurations. The first assumes all you want to do is REST. The second assumes you want to keep other non-RESTful URL’s alive in the same Struts 2 application.</p>
+
+<p>As with all configuration of Struts 2, we prefer using &lt;constant/&gt; elements in our struts.xml.</p>
+
+<p><strong>REST Only Configuration</strong></p>
+
+<p>Instruct Struts to use the REST action mapper:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.mapper.class"</span> <span class="na">value=</span><span class="s">"rest"</span> <span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<p>At this point, the REST mapper has replaced the DefaultActionMapper so all incoming URL’s will be interpreted as RESTful URL’s.</p>
+
+<p>We’re relying on the Convention plugin to find our controllers, so we need to configure the convention plugin a bit:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.action.suffix"</span> <span class="na">value=</span><span class="s">"Controller"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.action.mapAllMatches"</span> <span class="na">value=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.default.parent.package"</span> <span class="na">value=</span><span class="s">"rest-default"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.package.locators"</span> <span class="na">value=</span><span class="s">"example"</span><span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<blockquote>
+  <p>Note, you don’t have to use the Convention plugin just to use the REST plugin. The actions of your RESTful application can be defined in XML just as easily as by convention. The REST mapper doesn’t care how the application came to know about your actions when it maps a URL to an invocation of one of it’s methods.</p>
+</blockquote>
+
+<p><strong>REST and non-RESTful URL’s Together Configuration</strong></p>
+
+<p>If you want to keep using some non-RESTful URL’s alongside your REST stuff, then you’ll have to provide for a configuration that utilizes to mappers.</p>
+
+<p>Plugins contain their own configuration. If you look in the Rest plugin jar, you’ll see the struts-plugin.xml and in that you’ll see some configuration settings made by the plugin. Often, the plugin just sets things the way it wants them. You may frequently need to override those settings in your own struts.xml.</p>
+
+<p>First, you’ll need to re-assert the extensions that struts knows about because the rest plugin will have thrown out the default <code class="highlighter-rouge">action</code> extension.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.action.extension"</span> <span class="na">value=</span><span class="s">"xhtml,,xml,json,action"</span><span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Next, we will configure the <code class="highlighter-rouge">PrefixBasedActionMapper</code>, which is part of the core Struts 2 distribution, to have some URL’s routed to the Rest mapper and others to the default mapper.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.mapper.class"</span> <span class="na">value=</span><span class="s">"org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.mapper.prefixMapping"</span> <span class="na">value=</span><span class="s">"/rest:rest,:struts"</span><span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<p>And, again, we’re relying on the Convention plugin to find our controllers, so we need to configure the convention plugin a bit:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.action.suffix"</span> <span class="na">value=</span><span class="s">"Controller"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.action.mapAllMatches"</span> <span class="na">value=</span><span class="s">"true"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.default.parent.package"</span> <span class="na">value=</span><span class="s">"rest-default"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.convention.package.locators"</span> <span class="na">value=</span><span class="s">"example"</span><span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<h3 id="write-your-controller-actions">Write Your Controller Actions</h3>
+
+<p>Once everything is configured, you need to create the controllers. Controllers are simply actions created with the purpose of handling requests for a give RESTful resource. As we saw in the mapping logic above, various REST URL’s will hit different methods on the controller. Traditionally, normal Struts 2 actions expose the <code class="highlighter-rouge">execute</code> method as their target method. Here’s a sample controller for a <em>orders</em>  resource. Note, this sample doesn’t [...]
+
+<div class="highlighter-rouge"><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">struts2</span><span class="o">.</span><span class="na">rest</span><span class="o">.</span><span class="na">example</span><span class="o">;</span>
+
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">OrdersController</span> <span class="kd">implements</span> <span class="n">ModelDriven</span><span class="o">&lt;</span><span class="n">Order</span><span class="o">&gt;</span> <span class="o">{</span>
+
+    <span class="kd">private</span> <span class="n">OrderManager</span> <span class="n">orderManager</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">id</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">Order</span> <span class="n">model</span><span class="o">;</span>
+
+    <span class="c1">// Handles /orders/{id} GET requests</span>
+    <span class="kd">public</span> <span class="n">HttpHeaders</span> <span class="n">show</span><span class="o">()</span> <span class="o">{</span>
+        <span class="n">model</span> <span class="o">=</span> <span class="n">orderManager</span><span class="o">.</span><span class="na">findOrder</span><span class="o">(</span><span class="n">id</span><span class="o">);</span>
+        <span class="k">return</span> <span class="k">new</span> <span class="n">DefaultHttpHeaders</span><span class="o">(</span><span class="s">"show"</span><span class="o">)</span>
+            <span class="o">.</span><span class="na">withETag</span><span class="o">(</span><span class="n">model</span><span class="o">.</span><span class="na">getUniqueStamp</span><span class="o">())</span>
+            <span class="o">.</span><span class="na">lastModified</span><span class="o">(</span><span class="n">model</span><span class="o">.</span><span class="na">getLastModified</span><span class="o">());</span>
+    <span class="o">}</span>
+
+    <span class="c1">// Handles /orders/{id} PUT requests</span>
+    <span class="kd">public</span> <span class="n">String</span> <span class="n">update</span><span class="o">()</span> <span class="o">{</span>
+        <span class="n">orderManager</span><span class="o">.</span><span class="na">updateOrder</span><span class="o">(</span><span class="n">model</span><span class="o">);</span>
+        <span class="k">return</span> <span class="s">"update"</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="c1">// getters and setters</span>
+<span class="o">}</span>
+
+</code></pre>
+</div>
+
+<p>In this example, the <code class="highlighter-rouge">ModelDriven</code> interface is used to ensure that only my model, the Order object in this case, is returned to the client, otherwise, the whole <code class="highlighter-rouge">OrdersController</code> object would be serialized.</p>
+
+<p>Where’s ActionSupport? Normally, you extend ActionSupport when writing Struts 2 actions. In these case, our controller doesn’t do that. Why, you ask? ActionSupport provides a bunch of important functionality to our actions, including support for i18n and validation. All of this functionality, in the RESTful case, is provided by the default interceptor stack defined in the REST plugin’s struts-plugin.xml file. Unless you willfully break your controller’s membership in the rest-default  [...]
+
+<p>You may wonder why the <code class="highlighter-rouge">show()</code> method returns a <code class="highlighter-rouge">HttpHeaders</code> object and the <code class="highlighter-rouge">update()</code> method returns the expected result code String. The REST Plugin adds support for action methods that return <code class="highlighter-rouge">HttpHeaders</code> objects as a way for the action to have more control over the response. In this example, we wanted to ensure the response included [...]
+
+<p>Also, notice we aren’t returning the usual “success” result code in either method. This allows us to use the special features of the <a href="../codebehind">Codebehind Plugin</a> to intuitively select the result template to process when this resource is accessed with the <code class="highlighter-rouge">.xhtml</code> extension. In this case, we can provide a customized XHTML view of the resource by creating <code class="highlighter-rouge">/orders-show.jsp</code> and <code class="highli [...]
+
+<h2 id="advanced-topics">Advanced Topics</h2>
+
+<p>The following sections describe some of the non-standard bells and whistles that you might need to utilize for your application’s more non-standard requirements.</p>
+
+<h3 id="custom-contenttypehandlers">Custom ContentTypeHandlers</h3>
+
+<p>If you need to handle extensions that aren’t supported by the default handlers, you can create your own <code class="highlighter-rouge">ContentTypeHandler</code> implementation and define it in your <code class="highlighter-rouge">struts.xml</code>:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">"yaml"</span> <span class="na">type=</span><span class="s">"org.apache.struts2.rest.handler.ContentTypeHandler"</span> <span class="na">class=</span><span class="s">"com.mycompany.MyYamlContentHandler"</span> <span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<p>If the built-in content type handlers don’t do what you need, you can override the handling of any extension by providing an alternate handler. First, define your own <code class="highlighter-rouge">ContentTypeHandler</code> and declare with its own alias. For example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;bean</span> <span class="na">name=</span><span class="s">"myXml"</span> <span class="na">type=</span><span class="s">"org.apache.struts2.rest.handler.ContentTypeHandler"</span> <span class="na">class=</span><span class="s">"com.mycompany.MyXmlContentHandler"</span> <span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Then, tell the REST Plugin to override the handler for the desired extension with yours. In <code class="highlighter-rouge">struts.properties</code>, it would look like this:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>struts.rest.handlerOverride.xml=myXml
+
+</code></pre>
+</div>
+
+<h3 id="use-jackson-framework-as-json-contenttypehandler">Use Jackson framework as JSON ContentTypeHandler</h3>
+
+<p>The default JSON Content Handler is build on top of the <a href="http://json-lib.sourceforge.net/">JSON-lib</a>. If you prefer to use the <a href="http://jackson.codehaus.org/">Jackson framework</a> for JSON serialisation, you can configure the JacksonLibHandler as Content Handler for your json requests. </p>
+
+<p>First you need to add the jackson dependency to your web application by downloading the jar file and put it under WEB-INF/lib or by adding following xml snippet to your dependencies section in the pom.xml when you are using maven as build system.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;dependency&gt;</span>
+    <span class="nt">&lt;groupId&gt;</span>org.codehaus.jackson<span class="nt">&lt;/groupId&gt;</span>
+    <span class="nt">&lt;artifactId&gt;</span>jackson-jaxrs<span class="nt">&lt;/artifactId&gt;</span>
+    <span class="nt">&lt;version&gt;</span>1.9.13<span class="nt">&lt;/version&gt;</span>
+<span class="nt">&lt;/dependency&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Now you can overwrite the Content Handler with the Jackson Content Handler in the struts.xml:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;bean</span> <span class="na">type=</span><span class="s">"org.apache.struts2.rest.handler.ContentTypeHandler"</span> <span class="na">name=</span><span class="s">"jackson"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.rest.handler.JacksonLibHandler"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.rest.handlerOverride.json"</span> <span class="na">value=</span><span class="s">"jackson"</span><span class="nt">/&gt;</span>
+
+<span class="c">&lt;!-- Set to false if the json content can be returned for any kind of http method --&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.rest.content.restrictToGET"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span> 
+
+<span class="c">&lt;!-- Set encoding to UTF-8, default is ISO-8859-1 --&gt;</span>
+<span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.i18n.encoding"</span> <span class="na">value=</span><span class="s">"UTF-8"</span><span class="nt">/&gt;</span> 
+
+
+</code></pre>
+</div>
+
+<p> </p>
+
+<h3 id="settings">Settings</h3>
+
+<p>The following settings can be customized. See the <a href="/core-developers/configuration-files.html">developer guide</a>.
+ For more configuration options see the <a href="../convention">Convention Plugin Documentation</a></p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.rest.handlerOverride.EXTENSION</td>
+      <td>The alias for the ContentTypeHandler implementation that handles the EXTENSION value</td>
+      <td>N/A</td>
+      <td>Any declared alias for a ContentTypeHandler implementation</td>
+    </tr>
+    <tr>
+      <td>struts.rest.defaultExtension</td>
+      <td>The default extension to use when none is explicitly specified in the request</td>
+      <td>xhtml</td>
+      <td>Any extension</td>
+    </tr>
+    <tr>
+      <td>struts.rest.validationFailureStatusCode</td>
+      <td>The HTTP status code to return on validation failure</td>
+      <td>400</td>
+      <td>Any HTTP status code as an integer</td>
+    </tr>
+    <tr>
+      <td>struts.rest.namespace</td>
+      <td>Optional parameter to specify namespace for REST services</td>
+      <td>/</td>
+      <td>eg. /rest</td>
+    </tr>
+    <tr>
+      <td>struts.rest.content.restrictToGET</td>
+      <td>Optional parameter, if set to true blocks returning content from any other methods than GET, if set to false, the content can be returned for any kind of method</td>
+      <td>true</td>
+      <td>eg. put struts.rest.content.restrictToGET = false in struts.properties</td>
+    </tr>
+  </tbody>
+</table>
+
+<h2 id="resources">Resources</h2>
+
+<ul>
+  <li>
+    <p><a href="http://www.b-simple.de/documents">http://www.b-simple.de/documents</a> - Short RESTful Rails tutorial (PDF, multiple languages)</p>
+  </li>
+  <li>
+    <p><a href="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260">RESTful Web Services</a> - Highly recommend book from O’Reilly</p>
+  </li>
+  <li>
+    <p><a href="http://raibledesigns.com/rd/entry/go_light_with_apache_struts">Go Light with Apache Struts 2 and REST</a> - Presentation by Don Brown at ApacheCon US 2008</p>
+  </li>
+</ul>
+
+<h2 id="version-history">Version History</h2>
+
+<p>From Struts 2.1.1+</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>
diff --git a/content/plugins/sitegraph/index.html b/content/plugins/sitegraph/index.html
new file mode 100644
index 0000000..4fdb5b6
--- /dev/null
+++ b/content/plugins/sitegraph/index.html
@@ -0,0 +1,331 @@
+<!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>SiteGraph Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/sitegraph/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="sitegraph-plugin">SiteGraph Plugin</h1>
+
+<blockquote>
+  <p>This plugin got marked as deprecated since Struts 2.5.11!</p>
+</blockquote>
+
+<p>The SiteGraph plugin generates graphical diagrams representing the flow of your web application.</p>
+
+<p>SiteGraph works by parsing your configuration files, Action classes, and view files (JSP, Velocity, and FreeMarker), and displaying a visual map.</p>
+
+<p>Additional information can be found in the JavaDocs:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> * &lt;p&gt;
+ * SiteGraph is a tool that renders out GraphViz-generated images depicting your
+ * Struts-powered web application's flow. SiteGraph requires GraphViz be installed
+ * and that the "dot" executable be in your command path. You can find GraphViz
+ * at http://www.graphviz.org.
+ * &lt;/p&gt;
+</code></pre>
+</div>
+
+<p><strong>Understanding the Output</strong></p>
+
+<p>There are several key things to notice when looking at the output from SiteGraph:</p>
+
+<ul>
+  <li>
+    <p>Boxes: those shaded red indicate an action; those shaded green indicate a view file (JSP, etc).</p>
+  </li>
+  <li>
+    <p>Links: arrows colored green imply that no new HTTP request is being made; black arrows indicate a new HTTP request.</p>
+  </li>
+  <li>
+    <p>Link labels: labels may sometimes contain additional useful information. For example, a label of <strong>href</strong> means that the link behavior is that of a hyper-text reference. The complete label behaviors are provided:</p>
+
+    <ul>
+      <li>
+        <p><strong>href</strong> - a view file references an action by name (typically ending with the extension “.action”)</p>
+      </li>
+      <li>
+        <p><strong>action</strong> - a view file makes a call to the <em>action</em>  tag</p>
+      </li>
+      <li>
+        <p><strong>form</strong> - a view file is linked to an action using the <em>form</em>  tag</p>
+      </li>
+      <li>
+        <p><strong>redirect</strong> - an action is redirecting to another view or action</p>
+      </li>
+      <li>
+        <p><strong>! notation</strong> - a link to an action overrides the method to invoke</p>
+      </li>
+    </ul>
+  </li>
+</ul>
+
+<p><strong>Requirements</strong></p>
+
+<p>SiteGraph requires that your view files be structured in a very specific way. Because it has to read these files, only certain styles are supported. The requirements are:</p>
+
+<ul>
+  <li>
+    <p>The JSP tags must use the “s” namespace.</p>
+
+    <ul>
+      <li>
+        <p>In JSP: &lt;s:xxx/&gt;</p>
+      </li>
+      <li>
+        <p>In FreeMarker: &lt;@s.xxx/&gt;</p>
+      </li>
+      <li>
+        <p>In Velocity: N/A</p>
+      </li>
+    </ul>
+  </li>
+  <li>
+    <p>Use of the <em>form</em>  tag and <em>action</em>  tag must be linking directly to the action name (and optional namespace). This means that &lt;s:form action=”foo”/&gt; is OK, but &lt;s:form action=”foo.action”/&gt; is not.
+ Here is also a short overview of what it does and why a developer would want to use it.</p>
+  </li>
+</ul>
+
+<p><strong>Features</strong></p>
+
+<ul>
+  <li>Generates a graphical view of your web application</li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>You can use SiteGraph with the following command:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>java -cp ... -jar struts2-sitegraph-plugin-x.x.x.jar
+     -config CONFIG_DIR
+     -views VIEWS_DIRS
+     -output OUTPUT
+     [-ns NAMESPACE]
+
+</code></pre>
+</div>
+
+<p>Where:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>Usage: -config CONFIG_DIR -views VIEWS_DIRS -output OUTPUT [-ns NAMESPACE]
+       CONFIG_DIR =&gt; a directory containing struts.xml
+       VIEWS_DIRS =&gt; comma seperated list of dirs containing JSPs, VMs, etc
+       OUPUT      =&gt; the directory where the output should go
+       NAMESPACE  =&gt; the namespace path restriction (/, /foo, etc)
+</code></pre>
+</div>
+
+<p>You must either supply the correct classpath when invoking the SiteGraph tool or place the Sitegraph plugin in the same directory as the dependent jars. Specifically, the XWork jar, Struts jar, and their dependencies must be included in the classpath. Futhermore, <strong>you must also include your Action class files referenced in</strong> struts.xml. Without the proper class path entries, SiteGraph will not function properly.</p>
+
+<p>Once you have run SiteGraph, check the directory specified in the “output” argument (OUTPUT). In there you will find two files: <strong>out.dot</strong> and <strong>out.gif</strong>. You may immediately open up <strong>out.gif</strong> and view the web application flow. However, you may also wish to either run the <strong>out.dot</strong> file through a different GraphVis layout engine (neato, twopi, etc), so the original dot file is provided as well. You may also wish to edit the dot [...]
+
+<p><strong>Automatic Execution</strong></p>
+
+<p>Some advanced users may wish to execute SiteGraph from within their application - this could be required if you are developing an application that supports plugin capabilities. This can easily be done. See the JavaDocs for more info:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code> * &lt;p&gt;
+ * If you wish to use SiteGraph through its API rather than through the command line,
+ * you can do that as well. All you need to do is create a new SiteGraph instance,
+ * optionally specify a {@link Writer} to output the dot content to, and then call
+ * {@link #prepare()}.
+ * &lt;/p&gt;
+</code></pre>
+</div>
+
+<p>The command line version of SiteGraph does exactly this (except for overriding the Writer):</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>        <span class="n">SiteGraph</span> <span class="n">siteGraph</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SiteGraph</span><span class="o">(</span><span class="n">configDir</span><span class="o">,</span> <span class="n">views</span><span class="o">,</span> <span class="n">output</span><span class="o">,</span> <span class="n">namespace</span><span class="o">);</span>
+        <span class="n">siteGraph</span><span class="o">.</span><span class="na">prepare</span><span class="o">();</span>
+        <span class="n">siteGraph</span><span class="o">.</span><span class="na">render</span><span class="o">();</span>
+</code></pre>
+</div>
+
+<p><strong>Example</strong></p>
+
+<p><strong>Settings</strong></p>
+
+<p>This plugin doesn’t allow for any global settings.</p>
+
+<p><strong>Installation</strong></p>
+
+<p>The SiteGraph plugin jar is distributed with Struts, so if you’re up and running, you don’t need to do download any additional Java packages. However, SiteGraph does require the “dot” package by <a href="http://www.graphviz.org">GraphViz</a>.</p>
+
+<p>You’ll need to download the latest version of GraphViz and make sure that the dot executable (dot.exe in Windows) is in your command path. In Windows the GraphViz installer typically automatically adds <code class="highlighter-rouge">dot.exe</code> to your path. However, you may need to do this by hand depending on your system configuration.</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>
diff --git a/content/plugins/sitemesh/index.html b/content/plugins/sitemesh/index.html
new file mode 100644
index 0000000..98ec22b
--- /dev/null
+++ b/content/plugins/sitemesh/index.html
@@ -0,0 +1,498 @@
+<!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>SiteMesh Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/sitemesh/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="sitemesh-plugin">SiteMesh Plugin</h1>
+
+<blockquote>
+  <p>About SiteMesh</p>
+
+  <p><a href="http://www.sitemesh.org/">SiteMesh</a> is a web-page layout and decoration framework and web application integration framework to aid in creating large sites consisting of many pages for which a consistent look/feel, navigation and layout scheme is required.</p>
+</blockquote>
+
+<p>The Sitemesh plugin allows Sitemesh templates to access framework resources.</p>
+
+<p>The framework stores all its value stack information as request attributes, meaning that if you wish to display data that is on the stack (or even the ActionContext), you can do so by using the normal tag libraries that come with the framework. That’s it!</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Can use Struts tags in Sitemesh decorator templates</p>
+  </li>
+  <li>
+    <p>Sitemesh decorators can be written in FreeMarker as well as Velocity and JSP</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>From 2.2+ the new <code class="highlighter-rouge">com.opensymphony.sitemesh.webapp.SiteMeshFilter</code> filter and Struts <code class="highlighter-rouge">org.apache.struts2.dispatcher.ng.listener.StrutsListener</code> context listener must be added to <code class="highlighter-rouge">web.xml</code>, like:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>com.opensymphony.sitemesh.webapp.SiteMeshFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span> 
+...
+<span class="nt">&lt;listener&gt;</span>
+    <span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.dispatcher.ng.listener.StrutsListener<span class="nt">&lt;/listener-class&gt;</span>
+<span class="nt">&lt;/listener&gt;</span> 
+
+</code></pre>
+</div>
+
+<h2 id="freemarker--and-velocity-decorators">FreeMarker  and Velocity Decorators</h2>
+
+<p>The plugin provides an extension of the SiteMesh <em>Velocity</em>  and <em>FreeMarker</em>  servlets. These servlets provide the standard variables and <em>Struts Tags</em>  that you used to create views in your favourite template language.</p>
+
+<h3 id="freemarker">FreeMarker</h3>
+
+<p>From 2.2+ the recommended way to use Freemarker with Sitemesh is through the <code class="highlighter-rouge">org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</code> servlet, which can be configured like this in <code class="highlighter-rouge">web.xml</code>:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;servlet&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet<span class="nt">&lt;/servlet-class&gt;</span>
+    <span class="nt">&lt;init-param&gt;</span>
+ 	<span class="nt">&lt;param-name&gt;</span>default_encoding<span class="nt">&lt;/param-name&gt;</span>
+ 	<span class="nt">&lt;param-value&gt;</span>UTF-8<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/init-param&gt;</span>
+    <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span> 
+
+<span class="nt">&lt;servlet-mapping&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>*.ftl<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/servlet-mapping&gt;</span> 
+
+</code></pre>
+</div>
+
+<h3 id="velocity">Velocity</h3>
+
+<p>From 2.2+ the recommended way to use Velocity with Sitemesh is through the <code class="highlighter-rouge">org.apache.struts2.sitemesh.VelocityDecoratorServlet</code> servlet, which can be configured like this in <code class="highlighter-rouge">web.xml</code>:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;servlet&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.sitemesh.VelocityDecoratorServlet<span class="nt">&lt;/servlet-class&gt;</span>
+    <span class="nt">&lt;init-param&gt;</span>
+ 	<span class="nt">&lt;param-name&gt;</span>default_encoding<span class="nt">&lt;/param-name&gt;</span>
+ 	<span class="nt">&lt;param-value&gt;</span>UTF-8<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/init-param&gt;</span>
+    <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span> 
+
+<span class="nt">&lt;servlet-mapping&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>*.ftl<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/servlet-mapping&gt;</span> 
+
+</code></pre>
+</div>
+
+<h3 id="full-integration-with-sitemesh-2--freemarker-242--velocity-13--including-struts-2-tags-valuestack-and-freemarkermanager-statics">Full integration with SiteMesh 2 + Freemarker 2.4.2 + Velocity 1.3 , including Struts 2 Tags, ValueStack, and FreemarkerManager statics.</h3>
+
+<p>Such configuration is available as from Struts 2.2.0, please refer to <a href="https://issues.apache.org/jira/browse/WW-3296">WW-3296</a> for me details.</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+    <span class="nt">&lt;filter&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter<span class="nt">&lt;/filter-class&gt;</span>
+    <span class="nt">&lt;/filter&gt;</span>
+
+    <span class="nt">&lt;filter&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;filter-class&gt;</span>com.opensymphony.sitemesh.webapp.SiteMeshFilter<span class="nt">&lt;/filter-class&gt;</span>
+    <span class="nt">&lt;/filter&gt;</span>
+
+    <span class="nt">&lt;filter&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter<span class="nt">&lt;/filter-class&gt;</span>
+    <span class="nt">&lt;/filter&gt;</span>
+
+    <span class="nt">&lt;filter-mapping&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;/filter-mapping&gt;</span>
+
+    <span class="nt">&lt;filter-mapping&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+        <span class="nt">&lt;dispatcher&gt;</span>REQUEST<span class="nt">&lt;/dispatcher&gt;</span>
+        <span class="nt">&lt;dispatcher&gt;</span>FORWARD<span class="nt">&lt;/dispatcher&gt;</span>
+        <span class="nt">&lt;dispatcher&gt;</span>INCLUDE<span class="nt">&lt;/dispatcher&gt;</span>
+    <span class="nt">&lt;/filter-mapping&gt;</span>
+
+    <span class="nt">&lt;filter-mapping&gt;</span>
+        <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;/filter-mapping&gt;</span>
+
+    <span class="nt">&lt;servlet&gt;</span>
+        <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+        <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet<span class="nt">&lt;/servlet-class&gt;</span>
+        <span class="nt">&lt;init-param&gt;</span>
+            <span class="nt">&lt;param-name&gt;</span>default_encoding<span class="nt">&lt;/param-name&gt;</span>
+            <span class="nt">&lt;param-value&gt;</span>UTF-8<span class="nt">&lt;/param-value&gt;</span>
+        <span class="nt">&lt;/init-param&gt;</span>
+        <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+    <span class="nt">&lt;/servlet&gt;</span>
+
+    <span class="nt">&lt;servlet-mapping&gt;</span>
+        <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+        <span class="nt">&lt;url-pattern&gt;</span>*.ftl<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;/servlet-mapping&gt;</span>
+
+    <span class="nt">&lt;servlet&gt;</span>
+        <span class="nt">&lt;servlet-name&gt;</span>JspSupportServlet<span class="nt">&lt;/servlet-name&gt;</span>
+        <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.views.JspSupportServlet<span class="nt">&lt;/servlet-class&gt;</span>
+        <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+    <span class="nt">&lt;/servlet&gt;</span>
+
+    <span class="nt">&lt;listener&gt;</span>
+        <span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.dispatcher.ng.listener.StrutsListener<span class="nt">&lt;/listener-class&gt;</span>
+    <span class="nt">&lt;/listener&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="example">Example</h2>
+
+<p>Here is an example of how to configure the filter chains in <code class="highlighter-rouge">web.xml</code>:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>com.opensymphony.sitemesh.webapp.SiteMeshFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;listener&gt;</span>
+    <span class="nt">&lt;listener-class&gt;</span>org.apache.struts2.dispatcher.ng.listener.StrutsListener<span class="nt">&lt;/listener-class&gt;</span>
+<span class="nt">&lt;/listener&gt;</span>
+
+<span class="nt">&lt;servlet&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet<span class="nt">&lt;/servlet-class&gt;</span>
+    <span class="nt">&lt;init-param&gt;</span>
+        <span class="nt">&lt;param-name&gt;</span>default_encoding<span class="nt">&lt;/param-name&gt;</span>
+        <span class="nt">&lt;param-value&gt;</span>UTF-8<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/init-param&gt;</span>
+    <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span>
+
+<span class="nt">&lt;servlet&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-velocity<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;servlet-class&gt;</span>org.apache.struts2.sitemesh.VelocityDecoratorServlet<span class="nt">&lt;/servlet-class&gt;</span>
+    <span class="nt">&lt;init-param&gt;</span>
+        <span class="nt">&lt;param-name&gt;</span>default_encoding<span class="nt">&lt;/param-name&gt;</span>
+        <span class="nt">&lt;param-value&gt;</span>UTF-8<span class="nt">&lt;/param-value&gt;</span>
+    <span class="nt">&lt;/init-param&gt;</span>
+    <span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
+<span class="nt">&lt;/servlet&gt;</span>
+
+<span class="nt">&lt;servlet-mapping&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-freemarker<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>*.ftl<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/servlet-mapping&gt;</span>
+
+<span class="nt">&lt;servlet-mapping&gt;</span>
+    <span class="nt">&lt;servlet-name&gt;</span>sitemesh-velocity<span class="nt">&lt;/servlet-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>*.vm<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/servlet-mapping&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Struts 2.1 web.xml filter chain example:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>com.opensymphony.module.sitemesh.filter.PageFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+</code></pre>
+</div>
+
+<p>You do not need the struts2-sitmesh-plugin if you are using JSP for your decorators.</p>
+
+<p>Here are the only only changes needed to web.xml</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts2-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>com.opensymphony.sitemesh.webapp.SiteMeshFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts2-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;filter-class&gt;</span>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter<span class="nt">&lt;/filter-class&gt;</span>
+<span class="nt">&lt;/filter&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts2-prepare<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>sitemesh<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+    <span class="nt">&lt;dispatcher&gt;</span>REQUEST<span class="nt">&lt;/dispatcher&gt;</span>
+    <span class="nt">&lt;dispatcher&gt;</span>FORWARD<span class="nt">&lt;/dispatcher&gt;</span>
+    <span class="nt">&lt;dispatcher&gt;</span>INCLUDE<span class="nt">&lt;/dispatcher&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+<span class="nt">&lt;filter-mapping&gt;</span>
+    <span class="nt">&lt;filter-name&gt;</span>struts2-execute<span class="nt">&lt;/filter-name&gt;</span>
+    <span class="nt">&lt;url-pattern&gt;</span>/*<span class="nt">&lt;/url-pattern&gt;</span>
+<span class="nt">&lt;/filter-mapping&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="settings">Settings</h2>
+
+<p>This plugin doesn’t support any global settings.</p>
+
+<h2 id="installation">Installation</h2>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/spring/index.html b/content/plugins/spring/index.html
new file mode 100644
index 0000000..958f774
--- /dev/null
+++ b/content/plugins/spring/index.html
@@ -0,0 +1,492 @@
+<!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>Spring Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/spring/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 class="no_toc" id="spring-plugin">Spring Plugin</h1>
+
+<ul id="markdown-toc">
+  <li><a href="#description" id="markdown-toc-description">Description</a></li>
+  <li><a href="#usage" id="markdown-toc-usage">Usage</a></li>
+</ul>
+
+<h2 id="description">Description</h2>
+
+<p><a href="http://www.springframework.org">Spring</a> is a lightweight container, providing centralized, automated configuration and wiring of your application objects, using a technique called “Dependency Injection”.</p>
+
+<p>The Spring Plugin works by overriding the Struts <a href="/core-developers/object-factory.html">ObjectFactory</a> to enhance the creation of core framework objects. When an object is to be created, it uses the <code class="highlighter-rouge">class</code> attribute in the Struts configuration to correspond to the <code class="highlighter-rouge">id</code> attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the c [...]
+
+<blockquote>
+  <p>Remember:</p>
+
+  <p><strong>registering Actions with Spring is not required</strong>. The Spring alternative is there if you need it, but the framework will automatically create Actions objects from the action mappings. But, if you want to use Spring to inject your Actions, the option is there.</p>
+</blockquote>
+
+<p><strong>Features</strong></p>
+
+<ul>
+  <li>
+    <p>Allow Actions, Interceptors, and Results to be created by Spring</p>
+  </li>
+  <li>
+    <p>Struts-created objects can be autowired by Spring after creation</p>
+  </li>
+  <li>
+    <p>Provides two interceptors that autowire actions, if not using the Spring ObjectFactory</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To enable Spring integration, simply include struts2-spring-plugin-x-x-x.jar in your application.</p>
+
+<p>If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in <a href="/core-developers/default-properties.html">default.properties</a>  or in one of several XML files via <a href="/core-developers/constant-configuration.html">Constant Configuration</a>:</p>
+
+<p><strong>struts.properties</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>struts.objectFactory = spring
+</code></pre>
+</div>
+
+<p><strong>struts.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;struts&gt;</span>
+  <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.objectFactory"</span> <span class="na">value=</span><span class="s">"spring"</span> <span class="nt">/&gt;</span>
+  ... 
+<span class="nt">&lt;/struts&gt;</span>
+
+</code></pre>
+</div>
+
+<p><strong>Autowiring</strong></p>
+
+<p>The framework enables “autowiring” by default. (Autowiring means to look for objects defined in Spring with the same name as your object property). To change the wiring mode, modify the <code class="highlighter-rouge">spring.autowire</code> property.</p>
+
+<p><strong>Wiring Mode</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>struts.objectFactory.spring.autoWire = type
+</code></pre>
+</div>
+
+<p>The <code class="highlighter-rouge">autowire</code> property can be set to several options.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>option</th>
+      <th>description</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>name</td>
+      <td>Auto-wire by matching the name of the bean in Spring with the name of the property in your action. <strong>This is the default</strong></td>
+    </tr>
+    <tr>
+      <td>type</td>
+      <td>Auto-wire by looking for a bean registered with Spring of the same type as the property in your action. This requires you to have only one bean of this type registered with Spring</td>
+    </tr>
+    <tr>
+      <td>auto</td>
+      <td>Spring will attempt to auto-detect the best method for auto-wiring your action</td>
+    </tr>
+    <tr>
+      <td>constructor</td>
+      <td>Spring will auto-wire the parameters of the bean’s constructor</td>
+    </tr>
+    <tr>
+      <td>no</td>
+      <td>Turn off externally defined autowiring. Annotation-driven injection and injection based on Springs *Aware-interfaces still applies</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>By default, the framework will at least try to use Spring to create all its objects. If the object cannot be created by Spring, then the framework will create the object itself.</p>
+
+<p>Enabling Spring integration for other application objects is a two-step process.</p>
+
+<ol>
+  <li>Configure the Spring listener</li>
+</ol>
+
+<p><strong>web.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;listener&gt;</span>
+    <span class="nt">&lt;listener-class&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="nt">&lt;/listener-class&gt;</span>
+<span class="nt">&lt;/listener&gt;</span>
+
+</code></pre>
+</div>
+
+<ol start="2">
+  <li>Register your objects via the Spring configuration</li>
+</ol>
+
+<p><strong>applicationContext.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+<span class="cp">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span>
+<span class="nt">&lt;beans</span> <span class="na">default-autowire=</span><span class="s">"autodetect"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"personManager"</span> <span class="na">class=</span><span class="s">"com.acme.PersonManager"</span> <span class="na">scope=</span><span class="s">"prototype"</span><span class="nt">/&gt;</span>
+    ...
+<span class="nt">&lt;/beans&gt;</span>
+
+</code></pre>
+</div>
+
+<p>More applicationContext configuration files needed?</p>
+
+<p>Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than applicationContext.xml. Adding the following to your web.xml will cause Spring’s ApplicationContext to be inititalized from all files matching the given pattern:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="c">&lt;!-- Context Configuration locations for Spring XML files --&gt;</span>
+ <span class="nt">&lt;context-param&gt;</span>
+     <span class="nt">&lt;param-name&gt;</span>contextConfigLocation<span class="nt">&lt;/param-name&gt;</span>
+     <span class="nt">&lt;param-value&gt;</span>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml<span class="nt">&lt;/param-value&gt;</span>
+ <span class="nt">&lt;/context-param&gt;</span>
+</code></pre>
+</div>
+
+<p>See the Spring documentation for a full description of this parameter.</p>
+
+<p><strong>Initializing Actions from Spring</strong></p>
+
+<p>Normally, in <code class="highlighter-rouge">struts.xml</code> you specify the class for each Action. When using the default SpringObjectFactory, the framework will ask Spring to create the Action and wire up dependencies as specified by the default auto-wire behavior.</p>
+
+<p>We <strong>strongly</strong> recommend that you find declarative ways of letting Spring know what to provide for your actions. This includes making your beans able to be autowired by either naming your dependent properties on your action the same as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type and only having one of the required type registered with Spring. It also can include using JDK5 annotations to declare tran [...]
+
+<p>However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring <code class="highlighter-rouge">applicationContext.xml</code> and then <em>change</em>  the class attribute from your Action in the <code class="highlighter-rouge">struts.xml</code> to use the bean name defined in [...]
+
+<p>Your <code class="highlighter-rouge">struts.xml</code> file would then have the Action class attributes changed.</p>
+
+<p><strong>struts.xml</strong></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;include</span> <span class="na">file=</span><span class="s">"struts-default.xml"</span><span class="nt">/&gt;</span>
+
+    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"default"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"foo"</span> <span class="na">class=</span><span class="s">"com.acme.Foo"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;result&gt;</span>foo.ftl<span class="nt">&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+    <span class="nt">&lt;/package&gt;</span>
+
+    <span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"secure"</span> <span class="na">namespace=</span><span class="s">"/secure"</span> <span class="na">extends=</span><span class="s">"default"</span><span class="nt">&gt;</span>
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"bar"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;result&gt;</span>bar.ftl<span class="nt">&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+    <span class="nt">&lt;/package&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Where you have a Spring bean defined in your <code class="highlighter-rouge">applicationContext.xml</code> named “bar”. Note that the <code class="highlighter-rouge">com.acme.Foo</code> Action did not need to be changed, because it can be autowired.</p>
+
+<p>A typical spring configuration for bar could look as following.</p>
+
+<p><strong>applicationConext.xml</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
+<span class="cp">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span>
+<span class="nt">&lt;beans</span> <span class="na">default-autowire=</span><span class="s">"autodetect"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"com.my.BarClass"</span> <span class="na">singleton=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
+    ...
+<span class="nt">&lt;/beans&gt;</span>
+
+</code></pre>
+</div>
+
+<p>To use session-scoped components with Spring and Struts, see the <a href="spring-session-components-workarounds.html">Spring Session Components Workarounds</a> analysis.</p>
+
+<p><strong>Class Reloading</strong></p>
+
+<p>The Spring plugin can be configured to automatically reload classes that change in the file system. This feature will enable code changes to be “hot deployed” without having to restart the web container. To enable this feature follow these steps:</p>
+
+<ol>
+  <li>
+    <p>Set “struts.devMode” to “true”</p>
+  </li>
+  <li>
+    <p>Set “struts.class.reloading.watchList” to a comma separated list of directories, or jar files (absolute or relative paths)</p>
+  </li>
+  <li>
+    <p>Add this to web.xml:</p>
+  </li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>   <span class="nt">&lt;context-param&gt;</span>
+       <span class="nt">&lt;param-name&gt;</span>contextClass<span class="nt">&lt;/param-name&gt;</span>
+       <span class="nt">&lt;param-value&gt;</span>org.apache.struts2.spring.ClassReloadingXMLWebApplicationContext<span class="nt">&lt;/param-value&gt;</span>
+   <span class="nt">&lt;/context-param&gt;</span> 
+
+</code></pre>
+</div>
+
+<ol start="4">
+  <li>Add Apache Commons JCI FAM to the classpath. If you are using maven, add this to pom.xml</li>
+</ol>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>   <span class="nt">&lt;dependency&gt;</span>
+       <span class="nt">&lt;groupId&gt;</span>org.apache.commons<span class="nt">&lt;/groupId&gt;</span>
+       <span class="nt">&lt;artifactId&gt;</span>commons-jci-fam<span class="nt">&lt;/artifactId&gt;</span>
+       <span class="nt">&lt;version&gt;</span>1.0<span class="nt">&lt;/version&gt;</span>
+   <span class="nt">&lt;/dependency&gt;</span> 
+
+</code></pre>
+</div>
+
+<p>Letting the reloading class loader handle all the classes can lead to ClassCastException(s) because instances of the same classes loaded by different class loaders can not be assigned to each other. To prevent this problem we suggest that <code class="highlighter-rouge">struts.class.reloading.acceptClasses</code> is used to limit the classes loaded by the reloading class loader, so only actions are handled by it. This constant supports a comma separated list of regular expressions:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.class.reloading.acceptClasses"</span> <span class="na">value=</span><span class="s">"com.myproject.example.actions..*"</span> <span class="nt">/&gt;</span>
+
+</code></pre>
+</div>
+
+<blockquote>
+  <p>This feature is experimental, and <strong>should never</strong> be used in production systems.</p>
+</blockquote>
+
+<p><strong>Settings</strong></p>
+
+<p>The following settings can be customized. See the <a href="/core-developers/configuration-files.html">developer guide</a>.</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>Setting</th>
+      <th>Description</th>
+      <th>Default</th>
+      <th>Possible Values</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>struts.objectFactory.spring.autoWire</td>
+      <td>The autowire strategy</td>
+      <td>name</td>
+      <td>name,type,auto, or constructor</td>
+    </tr>
+    <tr>
+      <td>struts.objectFactory.spring.autoWire.alwaysRespect</td>
+      <td>Whether the autowire strategy should always be used, or if the framework should try to guess the best strategy based on the situation</td>
+      <td>false for backwards-compatibility</td>
+      <td>true or false</td>
+    </tr>
+    <tr>
+      <td>struts.objectFactory.spring.useClassCache</td>
+      <td>Whether to have Spring use its class cache or not</td>
+      <td>true</td>
+      <td>true or false</td>
+    </tr>
+    <tr>
+      <td>struts.class.reloading.watchList</td>
+      <td>List of jar files or directories to watch for changes</td>
+      <td>null</td>
+      <td>Comma separated list of absolute or relative paths to jars or directories</td>
+    </tr>
+    <tr>
+      <td>struts.class.reloading.acceptClasses</td>
+      <td>List of regular expressions of accepted class names</td>
+      <td>null</td>
+      <td>Comma separated list of regular expressions of classes that will be loaded by the reloading class loader(we suggest to add regular expressions so only action classes are handled by the reloading class loader)</td>
+    </tr>
+    <tr>
+      <td>struts.class.reloading.reloadConfig</td>
+      <td>Reload the runtime configuration (action mappings, results etc) when a change is detected in one of the watched directories</td>
+      <td>false</td>
+      <td>true or false</td>
+    </tr>
+    <tr>
+      <td>DEPRECATED: struts.objectFactory.spring.enableAopSupport</td>
+      <td>Uses different logic to construct beans to allow support AOP, it uses an old approach to create a bean, switch this flag if you have problems with Spring beans and AOP</td>
+      <td>false</td>
+      <td>true or false</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Installation</strong></p>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory. No other files need to be copied or created.</p>
+
+  </section>
+</article>
+
+
+<footer class="container">
+  <div class="col-md-12">
+    Copyright &copy; 2000-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>
diff --git a/content/plugins/spring/spring-session-components-workarounds.html b/content/plugins/spring/spring-session-components-workarounds.html
new file mode 100644
index 0000000..766791a
--- /dev/null
+++ b/content/plugins/spring/spring-session-components-workarounds.html
@@ -0,0 +1,186 @@
+<!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>Spring Session Components Workarounds</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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/spring/spring-session-components-workarounds.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="spring-session-components-workarounds">Spring Session Components Workarounds</h1>
+
+  </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>
diff --git a/content/plugins/struts-1/index.html b/content/plugins/struts-1/index.html
new file mode 100644
index 0000000..ec9f48b
--- /dev/null
+++ b/content/plugins/struts-1/index.html
@@ -0,0 +1,347 @@
+<!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>Struts 1 Plugin</title>
+
+  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
+  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
+  <link href="/css/main.css" rel="stylesheet">
+  <link href="/css/custom.css" rel="stylesheet">
+  <link href="/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="/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 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="/docs/tutorials.html">Tutorials - DEPRECATED</a></li>
+                <li><a href="/docs/faqs.html">FAQs - DEPRECATED</a></li>
+                <li><a href="/docs/guides.html">Guides - DEPRECATED</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="../" title="back to Plugins"><< back to Plugins</a>
+    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/plugins/struts-1/index.md" title="Edit this page on GitHub">Edit on GitHub</a>
+    <h1 id="struts-1-plugin">Struts 1 Plugin</h1>
+
+<p>The Struts 1 plugin allows you to use existing Struts 1 Actions and ActionForms in Struts 2 applications</p>
+
+<p>This plugin provides a generic Struts 2 Action class to wrap an existing Struts 1 Action, <code class="highlighter-rouge">org.apache.struts2.s1.Struts1Action</code>.  The wrapper class provides the expected calls to the legacy Struts 1 Action and ActionForm, converting incoming and outgoing objects into the expected forms.  It works by using the <a href="/core-developers/scoped-model-driven-interceptor.html">scoped model driven</a>  technique that uses a single Object as the model for [...]
+
+<ul>
+  <li>
+    <p><code class="highlighter-rouge">org.apache.struts2.s1.ActionFormValidatorInterceptor</code> - Integrates the validation of ActionForms into the workflow of Struts 2</p>
+  </li>
+  <li>
+    <p><code class="highlighter-rouge">org.apache.struts2.s1.ActionFormResetInterceptor</code> - Calls the <code class="highlighter-rouge">reset()</code> method on any discovered ActionForms</p>
+  </li>
+</ul>
+
+<p>The Struts 1 plugin is currently only intended to allow you to run Strust 1 actions inside a Struts 2 application. It DOES NOT allow you to continue to use the Struts 1 tag libraries in your JSPs. Your JSPs must be converted to use the Struts 2 tag library.</p>
+
+<p>There is a <a href="https://issues.apache.org/struts/browse/WW-2157">JIRA ticket</a> open for enhancing this plugin to allow a more seamless transition from Struts 1 to Struts 2 by supporting continued use of the Struts 1 tag libraries in JSPs, however, there is not a scheduled time frame for that functionality to be made available. (Patches are welcomed!)</p>
+
+<h2 id="features">Features</h2>
+
+<ul>
+  <li>
+    <p>Can use Struts 1 Actions and ActionForms with no code changes</p>
+  </li>
+  <li>
+    <p>Supports Commons Validator-enabled ActionForms</p>
+  </li>
+</ul>
+
+<h2 id="usage">Usage</h2>
+
+<p>To use existing Struts 1 Actions and ActionForms in a Struts 2 application, create a normal Struts 2 configuration package in <code class="highlighter-rouge">struts.xml</code>, but have it extend <code class="highlighter-rouge">struts1-default</code>.  The <code class="highlighter-rouge">struts1-default</code> package contains several interceptors and a default interceptor stack that work the plugin into the Struts 2 request process.</p>
+
+<p>In the most simple case, where you have a Struts 1 Action that you want to use in Struts 2, configure a Struts 2 action using the wrapper:</p>
+
+<p><strong>Simple Struts 1 configuration</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"myAction"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.s1.Struts1Action"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"className"</span><span class="nt">&gt;</span>com.mycompany.myapp.MyAction<span class="nt">&lt;/param&gt;</span>
+  <span class="nt">&lt;result&gt;</span>myAction.jsp<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<p>Most likely, you will have an ActionForm that your Struts 1 Action expects.  To use an ActionForm, the setup is a little more complicated because you’ll need an interceptor that manages the creation and scope (to support request and session scoping like Struts 1) of the ActionForm.</p>
+
+<p><strong>Struts 1 Action with a session-scoped ActionForm</strong></p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code>
+
+<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"myFormAction"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.s1.Struts1Action"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"className"</span><span class="nt">&gt;</span>com.mycompany.myapp.MyAction<span class="nt">&lt;/param&gt;</span>
+
+  <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"scopedModelDriven"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"className"</span><span class="nt">&gt;</span>com.mycompany.myapp.MyForm<span class="nt">&lt;/param&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"name"</span><span class="nt">&gt;</span>gangsterForm<span class="nt">&lt;/param&gt;</span>
+    <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"scope"</span><span class="nt">&gt;</span>session<span class="nt">&lt;/param&gt;</span>
+  <span class="nt">&lt;/interceptor-ref&gt;</span>
+  <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"struts1-default"</span><span class="nt">/&gt;</span>
+
+  <span class="nt">&lt;result&gt;</span>myAction.jsp<span class="nt">&lt;/result&gt;</span>
+<span class="nt">&lt;/action&gt;</span>
+
+</code></pre>
+</div>
+
+<h2 id="example">Example</h2>
+
+<p>This example shows a few Struts 1 Actions, a session-scoped ActionForm, and validation that uses Commons Validator:</p>
+
+<div class="highlighter-rouge"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
+<span class="cp">&lt;!DOCTYPE struts PUBLIC
+	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
+	"http://struts.apache.org/dtds/struts-2.5.dtd"&gt;</span>
+	
+<span class="nt">&lt;struts&gt;</span>
+	<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"conversion"</span> <span class="na">namespace=</span><span class="s">"/conversion"</span> <span class="na">extends=</span><span class="s">"struts-default"</span><span class="nt">&gt;</span>
+	
+        <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"index"</span><span class="nt">&gt;</span>
+            <span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/index.jsp<span class="nt">&lt;/result&gt;</span>
+        <span class="nt">&lt;/action&gt;</span>
+        
+		<span class="c">&lt;!-- Example populating a List inside an Action --&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"enterPersonsInfo"</span> <span class="na">method=</span><span class="s">"input"</span>
+				<span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.PersonAction"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/enterPersonInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"submitPersonInfo"</span> <span class="na">method=</span><span class="s">"submit"</span>
+				<span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.PersonAction"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/showPersonInfo.jsp<span class="nt">&lt;/result&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/conversion/enterPersonInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showPersonJspCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/enterPersonInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showPersonActionJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/PersonAction.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showPersonJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/Person.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		
+		
+		<span class="c">&lt;!-- Example populating a Set inside an Action --&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"enterAddressesInfo"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.AddressAction"</span> <span class="na">method=</span><span class="s">"input"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/enterAddressInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"submitAddressesInfo"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.AddressAction"</span> <span class="na">method=</span><span class="s">"submit"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/showAddressInfo.jsp<span class="nt">&lt;/result&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/conversion/enterAddressInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showAddressJspCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/enterAddressInfo.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showAddressActionJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/AddressAction.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showAddressJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/Address.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		
+		
+		<span class="c">&lt;!-- Example populating a List with Tiger 5 Enum  --&gt;</span>		
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"enterOperationEnumInfo"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.OperationsEnumAction"</span> <span class="na">method=</span><span class="s">"input"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/enterOperations.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"submitOperationEnumInfo"</span> <span class="na">class=</span><span class="s">"org.apache.struts2.showcase.conversion.OperationsEnumAction"</span> <span class="na">method=</span><span class="s">"submit"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result&gt;</span>/WEB-INF/conversion/showOperations.jsp<span class="nt">&lt;/result&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/conversion/enterOperations.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showEnumJspCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/enterOperations.jsp<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showOperationsEnumJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/OperationsEnum.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showOperationEnumActionJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/OperationsEnumAction.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showEnumTypeConverterJavaCode"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/EnumTypeConverter.java.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"showOperationsEnumActionConversionProperties"</span><span class="nt">&gt;</span>
+			<span class="nt">&lt;result</span> <span class="na">type=</span><span class="s">"plainText"</span><span class="nt">&gt;</span>/WEB-INF/conversion/OperationsEnumActionConversion.txt<span class="nt">&lt;/result&gt;</span>
+		<span class="nt">&lt;/action&gt;</span>
+		
+	<span class="nt">&lt;/package&gt;</span>
+<span class="nt">&lt;/struts&gt;</span>	
+
+</code></pre>
+</div>
+
+<h2 id="settings">Settings</h2>
+
+<p>This plugin doesn’t support any global settings.</p>
+
+<h2 id="installation">Installation</h2>
+
+<p>This plugin can be installed by copying the plugin jar into your application’s <code class="highlighter-rouge">/WEB-INF/lib</code> directory.  It will need the Struts 1 jar in order to function correctly.</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.
+  <