You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2016/09/02 05:58:25 UTC

svn commit: r996489 [1/2] - in /websites/production/struts/content/docs: action-configuration.html actionmapper.html interceptors.html migration-guide.html struts-23-to-25-migration.html webxml.html

Author: lukaszlenart
Date: Fri Sep  2 05:58:25 2016
New Revision: 996489

Log:
Updates production

Added:
    websites/production/struts/content/docs/struts-23-to-25-migration.html
Modified:
    websites/production/struts/content/docs/action-configuration.html
    websites/production/struts/content/docs/actionmapper.html
    websites/production/struts/content/docs/interceptors.html
    websites/production/struts/content/docs/migration-guide.html
    websites/production/struts/content/docs/webxml.html

Modified: websites/production/struts/content/docs/action-configuration.html
==============================================================================
--- websites/production/struts/content/docs/action-configuration.html (original)
+++ websites/production/struts/content/docs/action-configuration.html Fri Sep  2 05:58:25 2016
@@ -139,12 +139,14 @@ under the License.
     <div class="pagecontent">
         <div class="wiki-content">
             <div id="ConfluenceContent"><p>The action mappings are the basic "unit-of-work" in the framework. Essentially, the action maps an identifier to a handler class. When a request matches the action's name, the framework uses the mapping to determine how to process the request.</p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1462940751946 {padding: 0px;}
-div.rbtoc1462940751946 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1462940751946 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1472795634518 {padding: 0px;}
+div.rbtoc1472795634518 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1472795634518 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1462940751946">
-<ul class="toc-indentation"><li><a shape="rect" href="#ActionConfiguration-ActionMappings">Action Mappings</a></li><li><a shape="rect" href="#ActionConfiguration-ActionNames">Action Names</a></li><li><a shape="rect" href="#ActionConfiguration-ActionMethods">Action Methods</a></li><li><a shape="rect" href="#ActionConfiguration-WildcardMethod">Wildcard Method</a></li><li><a shape="rect" href="#ActionConfiguration-DynamicMethodInvocation">Dynamic Method Invocation</a>
+/*]]>*/</style></p><div class="toc-macro rbtoc1472795634518">
+<ul class="toc-indentation"><li><a shape="rect" href="#ActionConfiguration-ActionMappings">Action Mappings</a></li><li><a shape="rect" href="#ActionConfiguration-ActionNames">Action Names</a>
+<ul class="toc-indentation"><li><a shape="rect" href="#ActionConfiguration-ActionNamesWithSlashes">Action Names With Slashes</a></li><li><a shape="rect" href="#ActionConfiguration-ActionNameswithDotsandDashes">Action Names with Dots and Dashes</a></li><li><a shape="rect" href="#ActionConfiguration-Allowedactionnames">Allowed action names</a></li></ul>
+</li><li><a shape="rect" href="#ActionConfiguration-ActionMethods">Action Methods</a></li><li><a shape="rect" href="#ActionConfiguration-WildcardMethod">Wildcard Method</a></li><li><a shape="rect" href="#ActionConfiguration-DynamicMethodInvocation">Dynamic Method Invocation</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#ActionConfiguration-StrictDMI">Strict DMI</a></li><li><a shape="rect" href="#ActionConfiguration-StrictMethodInvocation">Strict Method Invocation</a></li></ul>
 </li><li><a shape="rect" href="#ActionConfiguration-ActionSupportDefault">ActionSupport Default</a></li><li><a shape="rect" href="#ActionConfiguration-Post-BackDefault">Post-Back Default</a></li><li><a shape="rect" href="#ActionConfiguration-ActionDefault">Action Default</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#ActionConfiguration-WildcardDefault">Wildcard Default</a></li></ul>
@@ -154,7 +156,7 @@ div.rbtoc1462940751946 li {margin-left:
   &lt;result type="redirectAction"&gt;Menu&lt;/result&gt;
   &lt;result name="input"&gt;/Logon.jsp&lt;/result&gt;
 &lt;/action&gt; </pre>
-</div></div><p>&#160;</p><p>When using <a shape="rect" href="convention-plugin.html">Convention Plugin</a> the action mapping can be configured with annotations:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>A Logon Action with annotations</b></div><div class="codeContent panelContent pdl">
+</div></div><p>When using <a shape="rect" href="convention-plugin.html">Convention Plugin</a> the action mapping can be configured with annotations:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>A Logon Action with annotations</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">package tutorial
 
 @Action("Logon") // actually that is not necessary as it is added by convention
@@ -169,7 +171,12 @@ public class Logon {</pre>
     &lt;s:submit/&gt;
 &lt;/s:form&gt;
 </pre>
-</div></div><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Action Names With Slashes</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>If your action names have slashes in them (for example, <code>&lt;action name="admin/home" class="tutorial.Admin"/&gt;</code>) you need to specifically allow slashes in your action names via a constant in the <code>struts.xml</code> file by specifying <code>&lt;constant name="struts.enable.SlashesInActionNames" value="true"/&gt;</code>. See <a shape="rect" class="external-link" href="https://issues.apache.org/jira/browse/WW-1383">JIRA Issue WW-1383</a> for discussion as there are side effects to setting this property to <code>true</code>.</p></div></div><div class="confluence-information-macro confluence-information-macro-note"><p class="title">Action Names with Dots and Dashes</p><span class="aui-ic
 on aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Although action naming is pretty flexible, one should pay attention when using dots (eg. <code>create.user</code>) and/or dashes (eg. <code>my-action</code>). While the dot notation has no known side effects at this time, the dash notation will cause problems with the generated JavaScript for certain tags and themes. Use with caution, and always try to use camelcase action names (eg. <code>createUser</code>) or underscores (eg. <code>my_action</code>).</p></div></div><h2 id="ActionConfiguration-ActionMethods">Action Methods</h2><p>The default entry method to the handler class is defined by the Action interface.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Action interface</b></div><div class="codeContent panelContent pdl">
+</div></div><h3 id="ActionConfiguration-ActionNamesWithSlashes">Action Names With Slashes</h3><p><span>If your action names have slashes in them (for example, </span><code>&lt;action name="admin/home" class="tutorial.Admin"/&gt;</code><span>) you need to specifically allow slashes in your action names via a constant in the </span><code>struts.xml</code><span> file by specifying </span><code>&lt;constant name="struts.enable.SlashesInActionNames" value="true"/&gt;</code><span>. See </span><a shape="rect" class="external-link" href="https://issues.apache.org/jira/browse/WW-1383">JIRA Issue WW-1383</a><span> for discussion as there are side effects to setting this property to </span><code>true</code><span>.</span></p><h3 id="ActionConfiguration-ActionNameswithDotsandDashes">Action Names with Dots and Dashes</h3><p>Although action naming is pretty flexible, one should pay attention when using dots (eg. create.user) and/or dashes (eg. my-action). While the dot notation has no known side e
 ffects at this time, the dash notation will cause problems with the generated JavaScript for certain tags and themes. Use with caution, and always try to use camelcase action names (eg. createUser) or underscores (eg. my_action).</p><h3 id="ActionConfiguration-Allowedactionnames">Allowed action names</h3><p><code>DefaultActionMapper</code> is using pre-defined RegEx to check if action name matches allowed names. The default RegEx is defined as follow:&#160;<code>[a-zA-Z0-9._!/\-]*</code> - if at some point this doesn't match your action naming schema you can define your own RegEx and override the default using constant named&#160;<code>struts.allowed.action.names</code>, e.g.:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;struts&gt;
+  &lt;constant name="struts.allowed.action.names" value="[a-z{}]"*/&gt;
+  ...
+&lt;/struts&gt;</pre>
+</div></div><p><strong>NOTE</strong>: Please be aware that action names not matching the RegEx will rise an exception.</p><h2 id="ActionConfiguration-ActionMethods">Action Methods</h2><p>The default entry method to the handler class is defined by the Action interface.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>Action interface</b></div><div class="codeContent panelContent pdl">
 <pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">public interface Action {
     public String execute() throws Exception;
 }

Modified: websites/production/struts/content/docs/actionmapper.html
==============================================================================
--- websites/production/struts/content/docs/actionmapper.html (original)
+++ websites/production/struts/content/docs/actionmapper.html Fri Sep  2 05:58:25 2016
@@ -139,85 +139,33 @@ under the License.
     <div class="pagecontent">
         <div class="wiki-content">
             <div id="ConfluenceContent"><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1464698209808 {padding: 0px;}
-div.rbtoc1464698209808 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1464698209808 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1472795636335 {padding: 0px;}
+div.rbtoc1472795636335 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1472795636335 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1464698209808">
+/*]]>*/</style></p><div class="toc-macro rbtoc1472795636335">
 <ul class="toc-indentation"><li><a shape="rect" href="#ActionMapper-Description">Description</a></li><li><a shape="rect" href="#ActionMapper-DefaultActionMapper">DefaultActionMapper</a>
-<ul class="toc-indentation"><li><a shape="rect" href="#ActionMapper-Methodprefix">Method prefix</a></li><li><a shape="rect" href="#ActionMapper-Actionprefix">Action prefix</a></li></ul>
+<ul class="toc-indentation"><li><a shape="rect" href="#ActionMapper-Methodprefix">Method prefix</a></li><li><a shape="rect" href="#ActionMapper-Actionprefix">Action prefix</a></li><li><a shape="rect" href="#ActionMapper-AllowedactionnameRegEx">Allowed action name RegEx</a></li><li><a shape="rect" href="#ActionMapper-AllowedmethodnameRegEx">Allowed method name RegEx</a></li></ul>
 </li><li><a shape="rect" href="#ActionMapper-CustomActionMapper">Custom ActionMapper</a></li><li><a shape="rect" href="#ActionMapper-CompositeActionMapper">CompositeActionMapper</a></li><li><a shape="rect" href="#ActionMapper-PrefixBasedActionMapper">PrefixBasedActionMapper</a></li><li><a shape="rect" href="#ActionMapper-ActionMapperandActionMappingobjects">ActionMapper and ActionMapping objects</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#ActionMapper-Customize">Customize</a></li></ul>
 </li><li><a shape="rect" href="#ActionMapper-Next:ActionProxy&amp;ActionProxyFactory">Next: Action Proxy &amp; ActionProxy Factory</a></li></ul>
-</div><h2 id="ActionMapper-Description">Description</h2><p></p><p></p><p>
-The ActionMapper interface provides a mapping between HTTP requests and action invocation requests and vice-versa.
-</p>
-
-<p></p><p>
-When given an HttpServletRequest, the ActionMapper may return null if no action invocation request matches,
-or it may return an ActionMapping that describes an action invocation for the framework to try.
-</p>
-
-<p></p><p>
-The ActionMapper is not required to guarantee that the ActionMapping returned be a real action or otherwise
-ensure a valid request.
-Accordingly, most ActionMappers do not need to consult the Struts configuration
-just to determine if a request should be mapped.
-</p>
-
-<p></p><p>
-Just as requests can be mapped from HTTP to an action invocation, the opposite is true as well.
-However, because HTTP requests (when shown in HTTP responses) must be in String form,
-a String is returned rather than an actual request object.
-</p><h2 id="ActionMapper-DefaultActionMapper">DefaultActionMapper</h2><p>By default, the DefaultActionMapper is used:</p><p></p><p>
-Default action mapper implementation, using the standard *.[ext] (where ext
-usually "action") pattern. The extension is looked up from the Struts
-configuration key <b>struts.action.extension</b>.
-</p>
-
-<p></p><p>
-To help with dealing with buttons and other related requirements, this
-mapper (and other ActionMappers, we hope) has the ability to name a
-button with some predefined prefix and have that button name alter the
-execution behaviour. The four prefixes are:
-</p>
-
-<p></p><ul><li>Method prefix - <i>method:default</i></li><li>Action prefix - <i>action:dashboard</i></li></ul>
-
-<p></p><p>
-In addition to these four prefixes, this mapper also understands the
-action naming pattern of <i>foo!bar</i> in either the extension form (eg:
-foo!bar.action) or in the prefix form (eg: action:foo!bar). This syntax tells
-this mapper to map to the action named <i>foo</i> and the method <i>bar</i>.
-</p><h3 id="ActionMapper-Methodprefix">Method prefix</h3><p></p><p></p><p>
-With method-prefix, instead of calling baz action's execute() method (by
-default if it isn't overriden in struts.xml to be something else), the baz
-action's anotherMethod() will be called. A very elegant way determine which
-button is clicked. Alternatively, one would have submit button set a
-particular value on the action when clicked, and the execute() method decides
-on what to do with the setted value depending on which button is clicked.
-</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
-&lt;s:form action=&quot;baz&quot;&gt;
-    &lt;s:textfield label=&quot;Enter your name&quot; name=&quot;person.name&quot;/&gt;
-    &lt;s:submit value=&quot;Create person&quot;/&gt;
-    &lt;s:submit method=&quot;anotherMethod&quot; value=&quot;Cancel&quot;/&gt;
+</div><h2 id="ActionMapper-Description">Description</h2><p>The ActionMapper interface provides a mapping between HTTP requests and action invocation requests and vice-versa.</p><p>When given an HttpServletRequest, the ActionMapper may return null if no action invocation request matches&#160;or it may return an {{ActionMapping}} that describes an action invocation for the framework to try.</p><p>The ActionMapper is not required to guarantee that the {{ActionMapping}} returned be a real action or otherwise&#160;ensure a valid request.&#160;Accordingly, most ActionMappers do not need to consult the Struts configuration&#160;just to determine if a request should be mapped.</p><p>Just as requests can be mapped from HTTP to an action invocation, the opposite is true as well.&#160;However, because HTTP requests (when shown in HTTP responses) must be in String form,&#160;a String is returned rather than an actual request object.</p><h2 id="ActionMapper-DefaultActionMapper">DefaultActionMapp
 er</h2><p>Default action mapper implementation, using the standard <code>*.[ext]</code>&#160;(where ext&#160;usually <strong>action</strong>) pattern. The extension is looked up from the Struts&#160;configuration key {&lt;b&gt;{struts.action.extension}}.</p><p>To help with dealing with buttons and other related requirements, this&#160;mapper (and other {{ActionMapper}}s, we hope) has the ability to name a&#160;button with some predefined prefix and have that button name alter the&#160;execution behaviour. The four prefixes are:</p><ul style="list-style-type: square;"><li>Method prefix -&#160;<code>method:default</code></li><li>Action prefix -&#160;<code>action:dashboard</code></li></ul><p>In addition to these four prefixes, this mapper also understands the&#160;action naming pattern of <code>foo!bar</code>&#160;in either the extension form (eg:&#160;<code>foo!bar.action</code>) or in the prefix form (eg: <code>action:foo!bar</code>). This syntax tells&#160;this mapper to map to the 
 action named <code>foo</code>&#160;and the method <code>bar</code>.</p><h3 id="ActionMapper-Methodprefix">Method prefix</h3><p>With method-prefix, instead of calling baz action's <code>execute()</code>&#160;method (by&#160;default if it isn't overridden in <code>struts.xml</code>&#160;to be something else), the baz&#160;action's <code>anotherMethod()</code>&#160;will be called. A very elegant way determine which&#160;button is clicked. Alternatively, one would have submit button set a&#160;particular value on the action when clicked, and the <code>execute()</code>&#160;method decides&#160;on what to do with the setted value depending on which button is clicked.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;!-- START SNIPPET: method-example --&gt;
+&lt;s:form action="baz"&gt;
+    &lt;s:textfield label="Enter your name" name="person.name"/&gt;
+    &lt;s:submit value="Create person"/&gt;
+    &lt;s:submit method="anotherMethod" value="Cancel"/&gt;
 &lt;/s:form&gt;
-]]></script>
-</div></div><h3 id="ActionMapper-Actionprefix">Action prefix</h3><p></p><p></p><p>
-With action-prefix, instead of executing baz action's execute() method (by
-default if it isn't overridden in struts.xml to be something else), the
-anotherAction action's execute() method (assuming again if it isn't overridden
-with something else in struts.xml) will be executed.
-</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
-&lt;s:form action=&quot;baz&quot;&gt;
-    &lt;s:textfield label=&quot;Enter your name&quot; name=&quot;person.name&quot;/&gt;
-    &lt;s:submit value=&quot;Create person&quot;/&gt;
-    &lt;s:submit action=&quot;anotherAction&quot; value=&quot;Cancel&quot;/&gt;
+&lt;!-- END SNIPPET: method-example --&gt;</pre>
+</div></div><h3 id="ActionMapper-Actionprefix">Action prefix</h3><p>With action-prefix, instead of executing baz action's <code>execute()</code>&#160;method (by&#160;default if it isn't overridden in struts.xml to be something else), the&#160;anotherAction action's <code>execute()</code>&#160;method (assuming again if it isn't overridden&#160;with something else in <code>struts.xml</code>) will be executed.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;!-- START SNIPPET: action-example --&gt;
+&lt;s:form action="baz"&gt;
+    &lt;s:textfield label="Enter your name" name="person.name"/&gt;
+    &lt;s:submit value="Create person"/&gt;
+    &lt;s:submit action="anotherAction" value="Cancel"/&gt;
 &lt;/s:form&gt;
-]]></script>
-</div></div><h2 id="ActionMapper-CustomActionMapper">Custom ActionMapper</h2><p>You can define your own ActionMapper by implementing <code>org.apache.struts2.dispatcher.mapper.ActionMapper</code> then configuring Struts 2 to use the new class in struts.xml</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+&lt;!-- END SNIPPET: action-example --&gt;</pre>
+</div></div><h3 id="ActionMapper-AllowedactionnameRegEx">Allowed action name RegEx</h3><p>By default the mapper will check if extracted action name matches provided RegEx, i.e.&#160;<code>[a-zA-Z0-9._!/\-]*</code>. You redefine this RegEx by defining a constant in&#160;<code>struts.xml</code> named&#160;<code>struts.allowed.action.names</code>. If action name doesn't match the RegEx a default action name will be returned which is defined as&#160;<code>index</code>. You can also redefine this by specifying constant&#160;<code>struts.default.action.name</code> in&#160;<code>struts.xml</code></p><h3 id="ActionMapper-AllowedmethodnameRegEx">Allowed method name RegEx</h3><p>The same logic as above is used for extracted methods, the default RegEx <code>(</code><code>[a-zA-Z_]*[0-9]*)</code> is used to check if method is allowed, you can change this by setting constant&#160;<code>struts.allowed.method.names</code> in&#160;<code>struts.xml</code>. If method doesn't match the RegEx a default
  method is returned, i.e.&#160;<code>execute</code>. This can be changed by defining constant&#160;<code>struts.default.method.name</code> in&#160;<code>struts.xml</code>.</p><p>Please note that this funcionallity only works when&#160;<a shape="rect" href="https://cwiki.apache.org/confluence/display/WW/Action+Configuration#ActionConfiguration-DynamicMethodInvocation">Dynamic Method Invocation</a> is enabled.</p><h2 id="ActionMapper-CustomActionMapper">Custom ActionMapper</h2><p>You can define your own ActionMapper by implementing <code>org.apache.struts2.dispatcher.mapper.ActionMapper</code> then configuring Struts 2 to use the new class in struts.xml</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">&lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="mymapper" class="com.mycompany.myapp.MyActionMapper" /&gt;
 &lt;constant name="struts.mapper.class" value="mymapper" /&gt;
 </pre>

Modified: websites/production/struts/content/docs/interceptors.html
==============================================================================
--- websites/production/struts/content/docs/interceptors.html (original)
+++ websites/production/struts/content/docs/interceptors.html Fri Sep  2 05:58:25 2016
@@ -139,11 +139,11 @@ under the License.
     <div class="pagecontent">
         <div class="wiki-content">
             <div id="ConfluenceContent"><div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>The default Interceptor stack is designed to serve the needs of most applications. Most applications will <strong>not</strong> need to add Interceptors or change the Interceptor stack.</p></div></div><p>Many Actions share common concerns. Some Actions need input validated. Other Actions may need a file upload to be pre-processed. Another Action might need protection from a double submit. Many Actions need drop-down lists and other controls pre-populated before the page displays.</p><p>The framework makes it easy to share solutions to these concerns using an "Interceptor" strategy. When you request a resource that maps to an "action", the framework invokes the Action object. But, before the Action is executed, the invocatio
 n can be intercepted by another object. After the Action executes, the invocation could be intercepted again. Unsurprisingly, we call these objects "Interceptors."</p><p><style type="text/css">/*<![CDATA[*/
-div.rbtoc1464698104770 {padding: 0px;}
-div.rbtoc1464698104770 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1464698104770 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1472795632122 {padding: 0px;}
+div.rbtoc1472795632122 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1472795632122 li {margin-left: 0px;padding-left: 0px;}
 
-/*]]>*/</style></p><div class="toc-macro rbtoc1464698104770">
+/*]]>*/</style></p><div class="toc-macro rbtoc1472795632122">
 <ul class="toc-indentation"><li><a shape="rect" href="#Interceptors-UnderstandingInterceptors">Understanding Interceptors</a></li><li><a shape="rect" href="#Interceptors-ConfiguringInterceptors">Configuring Interceptors</a></li><li><a shape="rect" href="#Interceptors-StackingInterceptors">Stacking Interceptors</a>
 <ul class="toc-indentation"><li><a shape="rect" href="#Interceptors-TheDefaultConfiguration">The Default Configuration</a></li></ul>
 </li><li><a shape="rect" href="#Interceptors-FrameworkInterceptors">Framework Interceptors</a>
@@ -186,7 +186,7 @@ div.rbtoc1464698104770 li {margin-left:
 &lt;/action&gt;
 &lt;/package&gt;
 </pre>
-</div></div><p>Looking inside <code>struts-default.xml</code>, we can see how it's done.</p><h3 id="Interceptors-TheDefaultConfiguration">The Default Configuration</h3><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>Looking inside <code>struts-default.xml</code>, we can see how it's done.</p><h3 id="Interceptors-TheDefaultConfiguration">The Default Configuration</h3><p></p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
 <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
 &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
 &lt;!--
@@ -563,8 +563,8 @@ div.rbtoc1464698104770 li {margin-left:
 
 &lt;/struts&gt;
 ]]></script>
-</div></div><p>Since the <code>struts-default.xml</code> is included in the application's configuration by default, all of the predefined interceptors and stacks are available "out of the box".</p><h2 id="Interceptors-FrameworkInterceptors">Framework Interceptors</h2><p>Interceptor classes are also defined using a key-value pair specified in the Struts configuration file. The names specified below come specified in <a shape="rect" href="struts-defaultxml.html">struts-default.xml</a>. If you extend the <code>struts-default</code> package, then you can use the names below. Otherwise, they must be defined in your package with a name-class pair specified in the &lt;interceptors&gt; tag.</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Interceptor</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Name</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" ro
 wspan="1" class="confluenceTd"><p><a shape="rect" href="alias-interceptor.html">Alias Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>alias</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Converts similar parameters that may be named differently between requests.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="chaining-interceptor.html">Chaining Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>chain</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes the previous Action's properties available to the current Action. Commonly used together with &lt;result type="chain"&gt; (in the previous Action).</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="checkbox-interceptor.html">Checkbox Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>checkbox</p></td><td colspan="1" rowspan="1" class="confluenceTd"><
 p>Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="cookie-interceptor.html">Cookie Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>cookie</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Inject cookie with a certain configurable name / value into action. (Since 2.0.7.)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="cookieprovider-interceptor.html">CookieProvider Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>cookieProvider</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Transfer cookies from action to response (Since 2.3.15.)</p></td></tr
 ><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="conversion-error-interceptor.html">Conversion Error Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>conversionError</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Adds conversion errors from the ActionContext to the Action's field errors</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="create-session-interceptor.html">Create Session Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>createSession</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="debugginginterceptor.html">DebuggingInterceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>debug
 ging</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Provides several different debugging screens to provide insight into the data behind the page.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="deprecationinterceptor.html">DeprecationInterceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>deprecation</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>When devMode is on, logs all unknown or deprecated settings</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="execute-and-wait-interceptor.html">Execute and Wait Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>execAndWait</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Executes the Action in the background and then sends the user off to an intermediate waiting page.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="exception-interce
 ptor.html">Exception Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>exception</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Maps exceptions to a result.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="file-upload-interceptor.html">File Upload Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>fileUpload</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>An Interceptor that adds easy access to file upload support.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="i18n-interceptor.html">I18n Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>i18n</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Remembers the locale selected for a user's session.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="logger-interceptor.html">Logger Interceptor</a></p></td><
 td colspan="1" rowspan="1" class="confluenceTd"><p>logger</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Outputs the name of the Action.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="message-store-interceptor.html">Message Store Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>store</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="model-driven-interceptor.html">Model Driven Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>modelDriven</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If the Action implements ModelDriven, pushes the <code>getModel</code> Result onto the Value Stack.</p></td></tr><tr><td colspan="1" rowspan="1" class="conflue
 nceTd"><p><a shape="rect" href="scoped-model-driven-interceptor.html">Scoped Model Driven Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>scopedModelDriven</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scope and sets it on the action calling <code>setModel</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="parameters-interceptor.html">Parameters Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>params</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets the request parameters onto the Action.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="prepare-interceptor.html">Prepare Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If t
 he Action implements Preparable, calls its <code>prepare</code> method.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="scope-interceptor.html">Scope Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>scope</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Simple mechanism for storing Action state in the session or application scope.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="servlet-config-interceptor.html">Servlet Config Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>servletConfig</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Provide access to Maps representing HttpServletRequest and HttpServletResponse.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="static-parameters-interceptor.html">Static Parameters Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluence
 Td"><p>staticParams</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets the <code>struts.xml</code> defined parameters onto the action. These are the &lt;param&gt; tags that are direct children of the &lt;action&gt; tag.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="roles-interceptor.html">Roles Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>roles</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Action will only be executed if the user has the correct JAAS role.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="timer-interceptor.html">Timer Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>timer</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Outputs how long the Action takes to execute (including nested Interceptors and View)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect
 " href="token-interceptor.html">Token Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>token</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Checks for valid token presence in Action, prevents duplicate form submission.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="token-session-interceptor.html">Token Session Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>tokenSession</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Same as Token Interceptor, but stores the submitted data in session when handed an invalid token</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="validation-interceptor.html">Validation Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>validation</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Performs validation using the validators defined in <em>action</em>-validatio
 n.xml</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="default-workflow-interceptor.html">Default Workflow Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>workflow</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Calls the <code>validate</code> method in your Action class. If Action errors are created then it returns the <code>INPUT</code> view.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="parameter-filter-interceptor.html">Parameter Filter Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>N/A</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Removes parameters from the list of those available to Actions</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="profiling-interceptor.html">Profiling Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>profiling</p></td
 ><td colspan="1" rowspan="1" class="confluenceTd"><p>Activate profiling through parameter</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="multiselect-interceptor.html">Multiselect Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>multiselect</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter</p></td></tr></tbody></table></div><div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Since 2.0.7, Interceptors and Results with hyphenated names were converted to camelCase. (The former model-driven is now modelDriven.) The original hyphenated names are retained as "aliases" until Struts 2.1.0. For clarity
 , the hyphenated versions are not listed here, but might be referenced in prior versions of the documentation.</p></div></div><h3 id="Interceptors-MethodFiltering">Method Filtering</h3>
-<p></p><p>
+</div></div>Since the <code>struts-default.xml</code> is included in the application's configuration by default, all of the predefined interceptors and stacks are available "out of the box".<h2 id="Interceptors-FrameworkInterceptors">Framework Interceptors</h2><p>Interceptor classes are also defined using a key-value pair specified in the Struts configuration file. The names specified below come specified in <a shape="rect" href="struts-defaultxml.html">struts-default.xml</a>. If you extend the <code>struts-default</code> package, then you can use the names below. Otherwise, they must be defined in your package with a name-class pair specified in the &lt;interceptors&gt; tag.</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Interceptor</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Name</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" rowspan="
 1" class="confluenceTd"><p><a shape="rect" href="alias-interceptor.html">Alias Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>alias</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Converts similar parameters that may be named differently between requests.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="chaining-interceptor.html">Chaining Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>chain</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Makes the previous Action's properties available to the current Action. Commonly used together with &lt;result type="chain"&gt; (in the previous Action).</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="checkbox-interceptor.html">Checkbox Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>checkbox</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Adds 
 automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="cookie-interceptor.html">Cookie Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>cookie</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Inject cookie with a certain configurable name / value into action. (Since 2.0.7.)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="cookieprovider-interceptor.html">CookieProvider Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>cookieProvider</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Transfer cookies from action to response (Since 2.3.15.)</p></td></tr><tr><t
 d colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="conversion-error-interceptor.html">Conversion Error Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>conversionError</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Adds conversion errors from the ActionContext to the Action's field errors</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="create-session-interceptor.html">Create Session Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>createSession</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="debugginginterceptor.html">DebuggingInterceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>debugging</p
 ></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Provides several different debugging screens to provide insight into the data behind the page.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="execute-and-wait-interceptor.html">Execute and Wait Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>execAndWait</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Executes the Action in the background and then sends the user off to an intermediate waiting page.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="exception-interceptor.html">Exception Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>exception</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Maps exceptions to a result.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="file-upload-interceptor.html">File Upload Interceptor</a></
 p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>fileUpload</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>An Interceptor that adds easy access to file upload support.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="i18n-interceptor.html">I18n Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>i18n</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Remembers the locale selected for a user's session.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="logger-interceptor.html">Logger Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>logger</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Outputs the name of the Action.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="message-store-interceptor.html">Message Store Interceptor</a></p></td><td colspan="1" rowspan="1" class="
 confluenceTd"><p>store</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="model-driven-interceptor.html">Model Driven Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>modelDriven</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If the Action implements ModelDriven, pushes the <code>getModel</code> Result onto the Value Stack.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="scoped-model-driven-interceptor.html">Scoped Model Driven Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>scopedModelDriven</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scop
 e and sets it on the action calling <code>setModel</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="parameters-interceptor.html">Parameters Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>params</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets the request parameters onto the Action.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="prepare-interceptor.html">Prepare Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>prepare</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>If the Action implements Preparable, calls its <code>prepare</code> method.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="scope-interceptor.html">Scope Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>scope</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Simple mech
 anism for storing Action state in the session or application scope.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="servlet-config-interceptor.html">Servlet Config Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>servletConfig</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Provide access to Maps representing HttpServletRequest and HttpServletResponse.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="static-parameters-interceptor.html">Static Parameters Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>staticParams</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets the <code>struts.xml</code> defined parameters onto the action. These are the &lt;param&gt; tags that are direct children of the &lt;action&gt; tag.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="roles-interceptor.htm
 l">Roles Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>roles</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Action will only be executed if the user has the correct JAAS role.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="timer-interceptor.html">Timer Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>timer</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Outputs how long the Action takes to execute (including nested Interceptors and View)</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="token-interceptor.html">Token Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>token</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Checks for valid token presence in Action, prevents duplicate form submission.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" hr
 ef="token-session-interceptor.html">Token Session Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>tokenSession</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Same as Token Interceptor, but stores the submitted data in session when handed an invalid token</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="validation-interceptor.html">Validation Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>validation</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Performs validation using the validators defined in <em>action</em>-validation.xml</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="default-workflow-interceptor.html">Default Workflow Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>workflow</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Calls the <code>validate</code> method in your Actio
 n class. If Action errors are created then it returns the <code>INPUT</code> view.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="parameter-filter-interceptor.html">Parameter Filter Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>N/A</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Removes parameters from the list of those available to Actions</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="profiling-interceptor.html">Profiling Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>profiling</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Activate profiling through parameter</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect" href="multiselect-interceptor.html">Multiselect Interceptor</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>multiselect</p></td><td colspan="1" rowspan="1"
  class="confluenceTd"><p>Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter</p></td></tr></tbody></table></div><div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Since 2.0.7, Interceptors and Results with hyphenated names were converted to camelCase. (The former model-driven is now modelDriven.) The original hyphenated names are retained as "aliases" until Struts 2.1.0. For clarity, the hyphenated versions are not listed here, but might be referenced in prior versions of the documentation.</p></div></div><h3 id="Interceptors-MethodFiltering">Method Filtering</h3><p>
+</p><p></p><p>
 MethodFilterInterceptor is an abstract <code>Interceptor</code> used as
 a base class for interceptors that will filter execution based on method 
 names according to specified included/excluded method lists.</p>
@@ -683,9 +683,6 @@ thisWillRunFirstInterceptor
                     <span class="smalltext">(Apache Struts 2 Documentation)</span>
                     <br>
                                     $page.link($child)
-                    <span class="smalltext">(Apache Struts 2 Documentation)</span>
-                    <br>
-                                    $page.link($child)
                     <span class="smalltext">(Apache Struts 2 Documentation)</span>
                     <br>
                                     $page.link($child)

Modified: websites/production/struts/content/docs/migration-guide.html
==============================================================================
--- websites/production/struts/content/docs/migration-guide.html (original)
+++ websites/production/struts/content/docs/migration-guide.html Fri Sep  2 05:58:25 2016
@@ -125,7 +125,7 @@ under the License.
 
     <div class="pagecontent">
         <div class="wiki-content">
-            <div id="ConfluenceContent"><p>Getting here from there.</p><h3 id="MigrationGuide-VersionNotes2.5.x">Version Notes 2.5.x</h3><ul><li><a shape="rect" href="version-notes-252.html">Version Notes 2.5.2</a></li><li><a shape="rect" href="version-notes-251.html">Version Notes 2.5.1</a></li><li><a shape="rect" href="version-notes-25.html">Version Notes 2.5</a></li></ul><h3 id="MigrationGuide-VersionNotes2.3.x">Version Notes 2.3.x</h3><ul><li><a shape="rect" href="version-notes-2330.html">Version Notes 2.3.30</a></li><li><a shape="rect" href="version-notes-2329.html">Version Notes 2.3.29</a></li><li><a shape="rect" href="version-notes-23281.html">Version Notes 2.3.28.1</a></li><li><a shape="rect" href="version-notes-2328.html">Version Notes 2.3.28</a></li><li><a shape="rect" href="version-notes-23243.html">Version Notes 2.3.24.3</a></li><li><a shape="rect" href="version-notes-23241.html">Version Notes 2.3.24.1</a></li><li><a shape="rect" href="version-notes-2324.html">Version No
 tes 2.3.24</a></li><li><a shape="rect" href="version-notes-23203.html">Version Notes 2.3.20.3</a></li><li><a shape="rect" href="version-notes-23201.html">Version Notes 2.3.20.1</a></li><li><a shape="rect" href="version-notes-2320.html">Version Notes 2.3.20</a></li><li><a shape="rect" href="version-notes-23163.html">Version Notes 2.3.16.3</a></li><li><a shape="rect" href="version-notes-23162.html">Version Notes 2.3.16.2</a></li><li><a shape="rect" href="version-notes-2316.html">Version Notes 2.3.16.1</a></li><li><a shape="rect" href="version-notes-2316.html">Version Notes 2.3.16</a></li><li><a shape="rect" href="version-notes-23153.html">Version Notes 2.3.15.3</a></li><li><a shape="rect" href="version-notes-23152.html">Version Notes 2.3.15.2</a></li><li><a shape="rect" href="version-notes-23151.html">Version Notes 2.3.15.1</a></li><li><a shape="rect" href="version-notes-2315.html">Version Notes 2.3.15</a></li><li><a shape="rect" href="version-notes-23143.html">Version Notes 2.3.14.3<
 /a></li><li><a shape="rect" href="version-notes-23142.html">Version Notes 2.3.14.2</a></li><li><a shape="rect" href="version-notes-23141.html">Version Notes 2.3.14.1</a></li><li><a shape="rect" href="version-notes-2314.html">Version Notes 2.3.14</a></li><li><a shape="rect" href="version-notes-23120.html">Version Notes 2.3.12.0</a></li><li><a shape="rect" href="version-notes-238.html">Version Notes 2.3.8</a></li><li><a shape="rect" href="version-notes-237.html">Version Notes 2.3.7</a></li><li><a shape="rect" href="version-notes-2341.html">Version Notes 2.3.4.1</a></li><li><a shape="rect" href="version-notes-234.html">Version Notes 2.3.4</a></li><li><a shape="rect" href="version-notes-233.html">Version Notes 2.3.3</a></li><li><a shape="rect" href="version-notes-2312.html">Version Notes 2.3.1.2</a></li><li><a shape="rect" href="version-notes-2311.html">Version Notes 2.3.1.1</a></li><li><a shape="rect" href="version-notes-231.html">Version Notes 2.3.1</a></li></ul><h3 id="MigrationGuide
 -VersionNotes2.2.x">Version Notes 2.2.x</h3><ul><li><a shape="rect" href="version-notes-2231.html">Version Notes 2.2.3.1</a></li><li><a shape="rect" href="version-notes-223.html">Version Notes 2.2.3</a></li><li><a shape="rect" href="version-notes-2211.html">Version Notes 2.2.1.1</a></li><li><a shape="rect" href="version-notes-221.html">Version Notes 2.2.1</a></li></ul><h3 id="MigrationGuide-VersionNotes2.1.x">Version Notes 2.1.x</h3><ul><li><a shape="rect" href="version-notes-2181.html">Version Notes 2.1.8.1</a></li><li><a shape="rect" href="version-notes-218.html">Version Notes 2.1.8</a></li><li><a shape="rect" href="version-notes-216.html">Version Notes 2.1.6</a></li><li><a shape="rect" href="version-notes-215.html">Version Notes 2.1.5</a></li><li><a shape="rect" href="version-notes-214.html">Version Notes 2.1.4</a></li><li><a shape="rect" href="version-notes-213.html">Version Notes 2.1.3</a></li><li><a shape="rect" href="version-notes-212.html">Version Notes 2.1.2</a></li><li><a 
 shape="rect" href="version-notes-211.html">Version Notes 2.1.1</a></li><li><a shape="rect" href="version-notes-210.html">Version Notes 2.1.0</a></li></ul><h3 id="MigrationGuide-ReleaseNotes2.0.x">Release Notes 2.0.x</h3><ul><li><a shape="rect" href="release-notes-2014.html">Release Notes 2.0.14</a></li><li><a shape="rect" href="release-notes-2013.html">Release Notes 2.0.13</a></li><li><a shape="rect" href="release-notes-2012.html">Release Notes 2.0.12</a></li><li><a shape="rect" href="release-notes-20112.html">Release Notes 2.0.11.2</a></li><li><a shape="rect" href="release-notes-20111.html">Release Notes 2.0.11.1</a></li><li><a shape="rect" href="release-notes-2011.html">Release Notes 2.0.11</a></li><li><a shape="rect" href="release-notes-2010.html">Release Notes 2.0.10</a></li><li><a shape="rect" href="release-notes-209.html">Release Notes 2.0.9</a></li><li><a shape="rect" href="release-notes-208.html">Release Notes 2.0.8</a></li><li><a shape="rect" href="release-notes-207.html">R
 elease Notes 2.0.7</a></li><li><a shape="rect" href="release-notes-206.html">Release Notes 2.0.6</a></li><li><a shape="rect" href="release-notes-205.html">Release Notes 2.0.5</a></li><li><a shape="rect" href="release-notes-204.html">Release Notes 2.0.4</a></li><li><a shape="rect" href="release-notes-203.html">Release Notes 2.0.3</a></li><li><a shape="rect" href="release-notes-202.html">Release Notes 2.0.2</a></li><li><a shape="rect" href="release-notes-201.html">Release Notes 2.0.1</a></li><li><a shape="rect" href="release-notes-200.html">Release Notes 2.0.0</a></li></ul><h3 id="MigrationGuide-Struts1toStruts2">Struts 1 to Struts 2</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="comparing-struts-1-and-2.html">Comparing Struts 1 and 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>How are Struts 1 and Struts 2 alike? How are they different?</p></td></tr><tr><th colspan="1"
  rowspan="1" class="confluenceTh"><p><a shape="rect" href="struts-1-solutions.html">Struts 1 Solutions</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Various issues (and hopefully their solutions!) encountered during migrations to Struts 2.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="migration-strategies.html">Migration Strategies</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Steps and overall strategies for migrating Struts 1 applications to Struts 2.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="migration-tools.html">Migration Tools</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Development tools to help aid the migration process.</p></td></tr></tbody></table></div><h4 id="MigrationGuide-Tutorials">Tutorials</h4><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="r
 ect" class="external-link" href="http://www.infoq.com/news/migrating-struts2" rel="nofollow">Migrating Applications to Struts 2 </a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>A three-part series by Ian Roughley (Sep 2006)</p></td></tr></tbody></table></div><h4 id="MigrationGuide-Roadmap">Roadmap</h4><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" class="external-link" href="http://struts.apache.org/roadmap.html#new">Roadmap FAQ</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>What's in store for Struts 2?</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" class="external-link" href="http://www.oreillynet.com/onjava/blog/2006/10/my_history_of_struts_2.html" rel="nofollow">A History of Struts 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Don Brown's summary of events</p></td></tr></tbody></table></div><h3 id="Migra
 tionGuide-Webwork2.2toStruts2">Webwork 2.2 to Struts 2</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="key-changes-from-webwork-2.html">Key Changes From WebWork 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>What has been removed or changed from WebWork 2.2 to Struts 2</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="webwork-2-migration-strategies.html">WebWork 2 Migration Strategies</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Steps and overall strategies for migrating WebWork 2 applications to Struts 2.</p></td></tr></tbody></table></div><h2 id="MigrationGuide-FAQs">FAQs</h2><ul><li><a shape="rect" href="where-do-we-get-the-latest-version-the-framework.html">Where do we get the latest version the framework</a>?</li><li><a shape="rect" href="what-are-some-of-the-frameworks-best-features.html">What are some of
  the framework's best features</a>?</li><li><a shape="rect" href="what-is-the-actioncontext.html">What is the ActionContext?</a></li></ul><h2 id="MigrationGuide-Next:">Next: <a shape="rect" href="contributors-guide.html">Contributors Guide</a></h2></div>
+            <div id="ConfluenceContent"><p>Getting here from there.</p><h3 id="MigrationGuide-VersionNotes2.5.x">Version Notes 2.5.x</h3><ul><li><a shape="rect" href="version-notes-252.html">Version Notes 2.5.2</a></li><li><a shape="rect" href="version-notes-251.html">Version Notes 2.5.1</a></li><li><a shape="rect" href="version-notes-25.html">Version Notes 2.5</a></li></ul><h3 id="MigrationGuide-VersionNotes2.3.x">Version Notes 2.3.x</h3><ul><li><a shape="rect" href="version-notes-2330.html">Version Notes 2.3.30</a></li><li><a shape="rect" href="version-notes-2329.html">Version Notes 2.3.29</a></li><li><a shape="rect" href="version-notes-23281.html">Version Notes 2.3.28.1</a></li><li><a shape="rect" href="version-notes-2328.html">Version Notes 2.3.28</a></li><li><a shape="rect" href="version-notes-23243.html">Version Notes 2.3.24.3</a></li><li><a shape="rect" href="version-notes-23241.html">Version Notes 2.3.24.1</a></li><li><a shape="rect" href="version-notes-2324.html">Version No
 tes 2.3.24</a></li><li><a shape="rect" href="version-notes-23203.html">Version Notes 2.3.20.3</a></li><li><a shape="rect" href="version-notes-23201.html">Version Notes 2.3.20.1</a></li><li><a shape="rect" href="version-notes-2320.html">Version Notes 2.3.20</a></li><li><a shape="rect" href="version-notes-23163.html">Version Notes 2.3.16.3</a></li><li><a shape="rect" href="version-notes-23162.html">Version Notes 2.3.16.2</a></li><li><a shape="rect" href="version-notes-2316.html">Version Notes 2.3.16.1</a></li><li><a shape="rect" href="version-notes-2316.html">Version Notes 2.3.16</a></li><li><a shape="rect" href="version-notes-23153.html">Version Notes 2.3.15.3</a></li><li><a shape="rect" href="version-notes-23152.html">Version Notes 2.3.15.2</a></li><li><a shape="rect" href="version-notes-23151.html">Version Notes 2.3.15.1</a></li><li><a shape="rect" href="version-notes-2315.html">Version Notes 2.3.15</a></li><li><a shape="rect" href="version-notes-23143.html">Version Notes 2.3.14.3<
 /a></li><li><a shape="rect" href="version-notes-23142.html">Version Notes 2.3.14.2</a></li><li><a shape="rect" href="version-notes-23141.html">Version Notes 2.3.14.1</a></li><li><a shape="rect" href="version-notes-2314.html">Version Notes 2.3.14</a></li><li><a shape="rect" href="version-notes-23120.html">Version Notes 2.3.12.0</a></li><li><a shape="rect" href="version-notes-238.html">Version Notes 2.3.8</a></li><li><a shape="rect" href="version-notes-237.html">Version Notes 2.3.7</a></li><li><a shape="rect" href="version-notes-2341.html">Version Notes 2.3.4.1</a></li><li><a shape="rect" href="version-notes-234.html">Version Notes 2.3.4</a></li><li><a shape="rect" href="version-notes-233.html">Version Notes 2.3.3</a></li><li><a shape="rect" href="version-notes-2312.html">Version Notes 2.3.1.2</a></li><li><a shape="rect" href="version-notes-2311.html">Version Notes 2.3.1.1</a></li><li><a shape="rect" href="version-notes-231.html">Version Notes 2.3.1</a></li></ul><h3 id="MigrationGuide
 -VersionNotes2.2.x">Version Notes 2.2.x</h3><ul><li><a shape="rect" href="version-notes-2231.html">Version Notes 2.2.3.1</a></li><li><a shape="rect" href="version-notes-223.html">Version Notes 2.2.3</a></li><li><a shape="rect" href="version-notes-2211.html">Version Notes 2.2.1.1</a></li><li><a shape="rect" href="version-notes-221.html">Version Notes 2.2.1</a></li></ul><h3 id="MigrationGuide-VersionNotes2.1.x">Version Notes 2.1.x</h3><ul><li><a shape="rect" href="version-notes-2181.html">Version Notes 2.1.8.1</a></li><li><a shape="rect" href="version-notes-218.html">Version Notes 2.1.8</a></li><li><a shape="rect" href="version-notes-216.html">Version Notes 2.1.6</a></li><li><a shape="rect" href="version-notes-215.html">Version Notes 2.1.5</a></li><li><a shape="rect" href="version-notes-214.html">Version Notes 2.1.4</a></li><li><a shape="rect" href="version-notes-213.html">Version Notes 2.1.3</a></li><li><a shape="rect" href="version-notes-212.html">Version Notes 2.1.2</a></li><li><a 
 shape="rect" href="version-notes-211.html">Version Notes 2.1.1</a></li><li><a shape="rect" href="version-notes-210.html">Version Notes 2.1.0</a></li></ul><h3 id="MigrationGuide-ReleaseNotes2.0.x">Release Notes 2.0.x</h3><ul><li><a shape="rect" href="release-notes-2014.html">Release Notes 2.0.14</a></li><li><a shape="rect" href="release-notes-2013.html">Release Notes 2.0.13</a></li><li><a shape="rect" href="release-notes-2012.html">Release Notes 2.0.12</a></li><li><a shape="rect" href="release-notes-20112.html">Release Notes 2.0.11.2</a></li><li><a shape="rect" href="release-notes-20111.html">Release Notes 2.0.11.1</a></li><li><a shape="rect" href="release-notes-2011.html">Release Notes 2.0.11</a></li><li><a shape="rect" href="release-notes-2010.html">Release Notes 2.0.10</a></li><li><a shape="rect" href="release-notes-209.html">Release Notes 2.0.9</a></li><li><a shape="rect" href="release-notes-208.html">Release Notes 2.0.8</a></li><li><a shape="rect" href="release-notes-207.html">R
 elease Notes 2.0.7</a></li><li><a shape="rect" href="release-notes-206.html">Release Notes 2.0.6</a></li><li><a shape="rect" href="release-notes-205.html">Release Notes 2.0.5</a></li><li><a shape="rect" href="release-notes-204.html">Release Notes 2.0.4</a></li><li><a shape="rect" href="release-notes-203.html">Release Notes 2.0.3</a></li><li><a shape="rect" href="release-notes-202.html">Release Notes 2.0.2</a></li><li><a shape="rect" href="release-notes-201.html">Release Notes 2.0.1</a></li><li><a shape="rect" href="release-notes-200.html">Release Notes 2.0.0</a></li></ul><h3 id="MigrationGuide-Struts2.3toStruts2.5">Struts 2.3 to Struts 2.5</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="struts-23-to-25-migration.html">Struts 2.3 to 2.5 migration</a></p></th><td colspan="1" rowspan="1" class="confluenceTd">Migration guide.</td></tr></tbody></table></div><h3 id="MigrationGuide-Struts1toStru
 ts2">Struts 1 to Struts 2</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="comparing-struts-1-and-2.html">Comparing Struts 1 and 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>How are Struts 1 and Struts 2 alike? How are they different?</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="struts-1-solutions.html">Struts 1 Solutions</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Various issues (and hopefully their solutions!) encountered during migrations to Struts 2.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="migration-strategies.html">Migration Strategies</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Steps and overall strategies for migrating Struts 1 applications to Struts 2.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a sha
 pe="rect" href="migration-tools.html">Migration Tools</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Development tools to help aid the migration process.</p></td></tr></tbody></table></div><h4 id="MigrationGuide-Tutorials">Tutorials</h4><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" class="external-link" href="http://www.infoq.com/news/migrating-struts2" rel="nofollow">Migrating Applications to Struts 2 </a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>A three-part series by Ian Roughley (Sep 2006)</p></td></tr></tbody></table></div><h4 id="MigrationGuide-Roadmap">Roadmap</h4><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" class="external-link" href="http://struts.apache.org/roadmap.html#new">Roadmap FAQ</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>What's in stor
 e for Struts 2?</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" class="external-link" href="http://www.oreillynet.com/onjava/blog/2006/10/my_history_of_struts_2.html" rel="nofollow">A History of Struts 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Don Brown's summary of events</p></td></tr></tbody></table></div><h3 id="MigrationGuide-Webwork2.2toStruts2">Webwork 2.2 to Struts 2</h3><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="key-changes-from-webwork-2.html">Key Changes From WebWork 2</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>What has been removed or changed from WebWork 2.2 to Struts 2</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p><a shape="rect" href="webwork-2-migration-strategies.html">WebWork 2 Migration Strategies</a></p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>Steps 
 and overall strategies for migrating WebWork 2 applications to Struts 2.</p></td></tr></tbody></table></div><h2 id="MigrationGuide-FAQs">FAQs</h2><ul><li><a shape="rect" href="where-do-we-get-the-latest-version-the-framework.html">Where do we get the latest version the framework</a>?</li><li><a shape="rect" href="what-are-some-of-the-frameworks-best-features.html">What are some of the framework's best features</a>?</li><li><a shape="rect" href="what-is-the-actioncontext.html">What is the ActionContext?</a></li></ul><h2 id="MigrationGuide-Next:">Next: <a shape="rect" href="contributors-guide.html">Contributors Guide</a></h2></div>
         </div>
 
                     <div class="tabletitle">
@@ -140,6 +140,9 @@ under the License.
                     <span class="smalltext">(Apache Struts 2 Documentation)</span>
                     <br>
                                     $page.link($child)
+                    <span class="smalltext">(Apache Struts 2 Documentation)</span>
+                    <br>
+                                    $page.link($child)
                     <span class="smalltext">(Apache Struts 2 Documentation)</span>
                     <br>
                                     $page.link($child)