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 2017/07/24 07:44:03 UTC

[48/51] [abbrv] [partial] struts-site git commit: Adds exported docs

http://git-wip-us.apache.org/repos/asf/struts-site/blob/124e36c4/content/docs/actionmapper.html
----------------------------------------------------------------------
diff --git a/content/docs/actionmapper.html b/content/docs/actionmapper.html
new file mode 100644
index 0000000..92f26ec
--- /dev/null
+++ b/content/docs/actionmapper.html
@@ -0,0 +1,257 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+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. 
+-->
+<html>
+<head>
+    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
+    <style type="text/css">
+        .dp-highlighter {
+            width:95% !important;
+        }
+    </style>
+    <style type="text/css">
+        .footer {
+            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
+            background-repeat:     repeat-x;
+            background-position:   left top;
+            padding-top:           4px;
+            color:                 #666;
+        }
+    </style>
+    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
+    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
+    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushCss.js' type='text/javascript'></script>
+    <script type="text/javascript">
+        SyntaxHighlighter.defaults['toolbar'] = false;
+        SyntaxHighlighter.all();
+    </script>
+    <script type="text/javascript" language="javascript">
+        var hide = null;
+        var show = null;
+        var children = null;
+
+        function init() {
+            /* Search form initialization */
+            var form = document.forms['search'];
+            if (form != null) {
+                form.elements['domains'].value = location.hostname;
+                form.elements['sitesearch'].value = location.hostname;
+            }
+
+            /* Children initialization */
+            hide = document.getElementById('hide');
+            show = document.getElementById('show');
+            children = document.all != null ?
+                    document.all['children'] :
+                    document.getElementById('children');
+            if (children != null) {
+                children.style.display = 'none';
+                show.style.display = 'inline';
+                hide.style.display = 'none';
+            }
+        }
+
+        function showChildren() {
+            children.style.display = 'block';
+            show.style.display = 'none';
+            hide.style.display = 'inline';
+        }
+
+        function hideChildren() {
+            children.style.display = 'none';
+            show.style.display = 'inline';
+            hide.style.display = 'none';
+        }
+    </script>
+    <title>ActionMapper</title>
+</head>
+<body onload="init()">
+<table border="0" cellpadding="2" cellspacing="0" width="100%">
+    <tr class="topBar">
+        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
+            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="actionmapper.html">ActionMapper</a>
+        </td>
+        <td align="right" valign="middle" nowrap>
+            <form name="search" action="https://www.google.com/search" method="get">
+                <input type="hidden" name="ie" value="UTF-8" />
+                <input type="hidden" name="oe" value="UTF-8" />
+                <input type="hidden" name="domains" value="" />
+                <input type="hidden" name="sitesearch" value="" />
+                <input type="text" name="q" maxlength="255" value="" />
+                <input type="submit" name="btnG" value="Google Search" />
+            </form>
+        </td>
+    </tr>
+</table>
+
+<div id="PageContent">
+    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
+        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
+        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
+        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
+        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">ActionMapper</div>
+
+        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14128">
+                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14128">Edit Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
+                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14128">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14128">Add Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14128">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14128">Add News</a>
+        </div>
+    </div>
+
+    <div class="pagecontent">
+        <div class="wiki-content">
+            <div id="ConfluenceContent"><p><style type="text/css">/*<![CDATA[*/
+div.rbtoc1499928310561 {padding: 0px;}
+div.rbtoc1499928310561 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1499928310561 li {margin-left: 0px;padding-left: 0px;}
+
+/*]]>*/</style></p><div class="toc-macro rbtoc1499928310561">
+<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><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>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;
+&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;
+&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>
+</div></div><p>Possible uses of the ActionMapper include defining your own, cleaner namespaces, such as URLs like <strong>/person/1</strong>, which would be similar to a request to <strong>/getPerson.action?personID=1</strong> using the DefaultActionMapper.</p><h2 id="ActionMapper-CompositeActionMapper">CompositeActionMapper</h2><p>A composite action mapper that is capable of delegating to a series of <a shape="rect" href="actionmapper.html">ActionMapper</a> if the former failed to obtained a valid <a shape="rect" class="createlink" href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&amp;title=ActionMapping&amp;linkCreation=true&amp;fromPageId=14128">ActionMapping</a> or uri.</p><p>It is configured through <a shape="rect" href="strutsxml.html">struts.xml</a>. For example, with the following entries 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;constant name="struts.mapper.class" value="composite" /&gt;
+&lt;constant name="struts.mapper.composite" value="struts,restful,restful2" /&gt;
+</pre>
+</div></div><p>When <code>CompositeActionMapper#getMapping(HttpServletRequest, ConfigurationManager)</code> or <code>CompositeActionMapper#getUriFromActionMapping(ActionMapping)</code> is invoked, <code>CompositeActionMapper</code> would go through these <a shape="rect" href="actionmapper.html">ActionMapper</a>s in sequence starting from <a shape="rect" href="actionmapper.html">ActionMapper</a> identified by <code>struts.mapper.composite.1</code>, followed by <code>struts.mapper.composite.2</code> and finally <code>struts.mapper.composite.3</code> (in this case) until either one of the <a shape="rect" href="actionmapper.html">ActionMapper</a> return a valid result (not null) or it runs out of <a shape="rect" href="actionmapper.html">ActionMapper</a> in which case it will just return null for both <code>CompositeActionMapper#getMapping(HttpServletRequest, ConfigurationManager)</code> and <code>CompositeActionMapper#getUriFromActionMapping(ActionMapping)</code> methods.</p><p>For exam
 ple with the following 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;constant name="struts.mapper.class" value="composite" /&gt;
+&lt;constant name="struts.mapper.composite" value="struts,restful" /&gt;
+</pre>
+</div></div><p><code>CompositeActionMapper</code> will be configured with 2 ActionMapper, namely "struts" which is <code>org.apache.struts2.dispatcher.mapper.DefaultActionMapper</code> and "restful" which is <code>org.apache.struts2.dispatcher.mapper.RestfulActionMapperRestfulActionMapper</code>. <code>CompositeActionMapper</code> would consult each of them in order described above.</p><h2 id="ActionMapper-PrefixBasedActionMapper">PrefixBasedActionMapper</h2><p></p><p></p><p>
+A prefix based action mapper that is capable of delegating to other ActionMappers based on the request's prefix.<br clear="none">
+It is configured through struts.xml<br clear="none">
+For example, with the following entries in struts.properties
+</p>
+
+<p></p><pre>
+&lt;constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper"/&gt;
+&lt;constant name="struts.mapper.prefixMapping" value="/communities:pseudoRestful,/communityTags:pseudoRestful,/events:pseudoRestful,/mediaList:pseudoRestful,/users:pseudoRestful,/community:struts,/communityTag:struts,/event:struts,/media:struts,/user:struts,:struts"/&gt;
+</pre>
+
+<p></p><p>
+When {@link PrefixBasedActionMapper#getMapping(HttpServletRequest, ConfigurationManager)} or
+PrefixBasedActionMapper#getUriFromActionMapping(ActionMapping) is invoked,
+PrefixBasedActionMapper will check each possible prefix (url prefix terminating just before a /) to find the most specific ActionMapper that returns a mapping when asked to map the request.  If none are found, null is returned for both
+{@link PrefixBasedActionMapper#getMapping(HttpServletRequest, ConfigurationManager)} and
+PrefixBasedActionMapper#getUriFromActionMapping(ActionMapping) methods.
+</p>
+<h4 id="ActionMapper-PrefixBasedActionProxyFactory">PrefixBasedActionProxyFactory</h4><p></p><p></p><p>
+Prefix based factory should be used with org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper
+to use appropriate com.opensymphony.xwork2.ActionProxyFactory connected with given
+org.apache.struts2.dispatcher.mapper.ActionMapper
+</p>
+
+<p></p><p>
+Add below entry to struts.xml to enable the factory:
+</p>
+
+<p></p><pre>
+&lt;constant name="struts.actionProxyFactory" value="prefix"/&gt;
+</pre>
+
+<p></p><p>
+The factory will use the same set of patterns as defined with:
+</p>
+
+<p></p><pre>
+&lt;constant name="struts.mapper.prefixMapping" value="..."/&gt;
+</pre><h2 id="ActionMapper-ActionMapperandActionMappingobjects">ActionMapper and ActionMapping objects</h2><p>The ActionMapper fetches the ActionMapping object corresponding to a given request. Essentially, the ActionMapping is a data transfer object that collects together details such as the Action class and method to execute. The mapping is utilized by the Dispatcher and various user interface components. It is customizable through <code>struts.mapper.class</code> entry in <code>struts.properties</code> or <code>struts.xml</code>. Note that the value of this constant is the name of the bean of the new mapper.</p><h3 id="ActionMapper-Customize">Customize</h3><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>Custom ActionMapper must implement ActionMapper interface and have a default constructor.</p></div></d
 iv><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>
+</div></div><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">public class MyCustomActionMapper implements ActionMapper {
+  public ActionMapping getMapping(HttpServletRequest request,
+                                  ConfigurationManager configManager) {
+    ....
+  }
+
+  public String getUriFromActionMapping(ActionMapping mapping) {
+    ....
+  }
+}
+</pre>
+</div></div><p><img class="emoticon emoticon-light-on" src="https://cwiki.apache.org/confluence/s/en_GB/5997/6f42626d00e36f53fe51440403446ca61552e2a2.1/_/images/icons/emoticons/lightbulb_on.png" data-emoticon-name="light-on" alt="(lightbulb)"> See also: <a shape="rect" href="restfulactionmapper.html">RestfulActionMapper</a></p><h2 id="ActionMapper-Next:ActionProxy&amp;ActionProxyFactory">Next: <a shape="rect" href="action-proxy-actionproxy-factory.html">Action Proxy &amp; ActionProxy Factory</a></h2></div>
+        </div>
+
+                    <div class="tabletitle">
+                Children
+            <span class="smalltext" id="show" style="display: inline;">
+              <a href="javascript:showChildren()">Show Children</a></span>
+            <span class="smalltext" id="hide" style="display: none;">
+              <a href="javascript:hideChildren()">Hide Children</a></span>
+            </div>
+            <div class="greybox" id="children" style="display: none;">
+                                                    $page.link($child)
+                    <span class="smalltext">(Apache Struts 2 Documentation)</span>
+                    <br>
+                            </div>
+        
+    </div>
+</div>
+<div class="footer">
+    Generated by CXF SiteExporter
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/struts-site/blob/124e36c4/content/docs/actionmessage.html
----------------------------------------------------------------------
diff --git a/content/docs/actionmessage.html b/content/docs/actionmessage.html
new file mode 100644
index 0000000..f4bbfa3
--- /dev/null
+++ b/content/docs/actionmessage.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+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. 
+-->
+<html>
+<head>
+    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
+    <style type="text/css">
+        .dp-highlighter {
+            width:95% !important;
+        }
+    </style>
+    <style type="text/css">
+        .footer {
+            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
+            background-repeat:     repeat-x;
+            background-position:   left top;
+            padding-top:           4px;
+            color:                 #666;
+        }
+    </style>
+    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
+    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
+    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushCss.js' type='text/javascript'></script>
+    <script type="text/javascript">
+        SyntaxHighlighter.defaults['toolbar'] = false;
+        SyntaxHighlighter.all();
+    </script>
+    <script type="text/javascript" language="javascript">
+        var hide = null;
+        var show = null;
+        var children = null;
+
+        function init() {
+            /* Search form initialization */
+            var form = document.forms['search'];
+            if (form != null) {
+                form.elements['domains'].value = location.hostname;
+                form.elements['sitesearch'].value = location.hostname;
+            }
+
+            /* Children initialization */
+            hide = document.getElementById('hide');
+            show = document.getElementById('show');
+            children = document.all != null ?
+                    document.all['children'] :
+                    document.getElementById('children');
+            if (children != null) {
+                children.style.display = 'none';
+                show.style.display = 'inline';
+                hide.style.display = 'none';
+            }
+        }
+
+        function showChildren() {
+            children.style.display = 'block';
+            show.style.display = 'none';
+            hide.style.display = 'inline';
+        }
+
+        function hideChildren() {
+            children.style.display = 'none';
+            show.style.display = 'inline';
+            hide.style.display = 'none';
+        }
+    </script>
+    <title>actionmessage</title>
+</head>
+<body onload="init()">
+<table border="0" cellpadding="2" cellspacing="0" width="100%">
+    <tr class="topBar">
+        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
+            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="tag-developers-guide.html">Tag Developers Guide</a>&nbsp;&gt;&nbsp;<a href="struts-tags.html">Struts Tags</a>&nbsp;&gt;&nbsp;<a href="tag-reference.html">Tag Reference</a>&nbsp;&gt;&nbsp;<a href="ui-tag-reference.html">UI Tag Reference</a>&nbsp;&gt;&nbsp;<a href="actionmessage.html">actionmessage</a>
+        </td>
+        <td align="right" valign="middle" nowrap>
+            <form name="search" action="https://www.google.com/search" method="get">
+                <input type="hidden" name="ie" value="UTF-8" />
+                <input type="hidden" name="oe" value="UTF-8" />
+                <input type="hidden" name="domains" value="" />
+                <input type="hidden" name="sitesearch" value="" />
+                <input type="text" name="q" maxlength="255" value="" />
+                <input type="submit" name="btnG" value="Google Search" />
+            </form>
+        </td>
+    </tr>
+</table>
+
+<div id="PageContent">
+    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
+        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
+        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
+        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
+        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">actionmessage</div>
+
+        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14023">
+                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14023">Edit Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
+                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14023">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14023">Add Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14023">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14023">Add News</a>
+        </div>
+    </div>
+
+    <div class="pagecontent">
+        <div class="wiki-content">
+            <div id="ConfluenceContent"><h2 id="actionmessage-Description">Description</h2>
+
+
+<p>Render action messages if they exists, specific rendering layout depends on the
+theme itself. Empty (null or blank string) messages will not be printed. The action message
+strings will be html escaped by default.</p>
+
+
+<h2 id="actionmessage-Parameters">Parameters</h2>
+
+<p><table width="100%"><tr><td colspan="6" rowspan="1"><h4>Dynamic Attributes Allowed:</h4> false</td></tr><tr><td colspan="6" rowspan="1">&#160;</td></tr><tr><th align="left" colspan="1" rowspan="1" valign="top"><h4>Name</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Required</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Default</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Evaluated</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Type</h4></th><th align="left" colspan="1" rowspan="1" valign="top"><h4>Description</h4></th></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">accesskey</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set 
 the html accesskey attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">class</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css class to use for element - it's an alias of cssClass attribute.</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">cssClass</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css class to use for element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">cs
 sErrorClass</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css error class to use for element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">cssErrorStyle</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css error style definitions for element to use</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">cssStyle</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="t
 op"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css style definitions for element to use</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">disabled</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html disabled attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">errorPosition</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" vali
 gn="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Define error position of form element (top|bottom)</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">escape</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">true</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Boolean</td><td align="left" colspan="1" rowspan="1" valign="top">Whether to escape HTML</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">id</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">HTML id attribute</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="
 top">javascriptTooltip</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Boolean</td><td align="left" colspan="1" rowspan="1" valign="top">Use JavaScript to generate tooltips</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">key</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the key (name, value, label) for this particular component</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">label</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan=
 "1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Label expression used for rendering an element specific label</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">labelSeparator</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">:</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">String that will be appended to the label</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">labelposition</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspa
 n="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Define label position of form element (top/left)</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">name</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The name to set for element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onblur</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top"> Set the html onblur attribute on rendered html element</t
 d></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onchange</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onchange attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onclick</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onclick attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">ondblclick</td><td align="left" colspan="1" rows
 pan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html ondblclick attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onfocus</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onfocus attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onkeydown</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" col
 span="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onkeydown attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onkeypress</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onkeypress attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onkeyup</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</t
 d><td align="left" colspan="1" rowspan="1" valign="top">Set the html onkeyup attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onmousedown</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onmousedown attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onmousemove</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onmousemove attribute on rendered 
 html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onmouseout</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onmouseout attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onmouseover</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onmouseover attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onmouseup</td><td ali
 gn="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onmouseup attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">onselect</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html onselect attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">requiredLabel</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign=
 "top">false</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Boolean</td><td align="left" colspan="1" rowspan="1" valign="top">If set to true, the rendered element will indicate that input is required</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">requiredPosition</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Define required position of required form element (left|right)</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">style</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><t
 d align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The css style definitions for element to use - it's an alias of cssStyle attribute.</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tabindex</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html tabindex attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">template</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" cols
 pan="1" rowspan="1" valign="top">The template (other than default) to use for rendering the element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">templateDir</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The template directory.</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">theme</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">The theme (other than default) to use for rendering the element</td></tr><tr><td align="left" colspan
 ="1" rowspan="1" valign="top">title</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the html title attribute on rendered html element</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tooltip</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Set the tooltip of this particular component</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tooltipConfig</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" c
 olspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Deprecated. Use individual tooltip configuration attributes instead.</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tooltipCssClass</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">StrutsTTClassic</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">CSS class applied to JavaScrip tooltips</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tooltipDelay</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">Classic</td><td align="left" colspan="1" rowspan="1" v
 align="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Delay in milliseconds, before showing JavaScript tooltips </td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">tooltipIconPath</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspan="1" rowspan="1" valign="top">Icon path used for image that will have the tooltip</td></tr><tr><td align="left" colspan="1" rowspan="1" valign="top">value</td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top"></td><td align="left" colspan="1" rowspan="1" valign="top">false</td><td align="left" colspan="1" rowspan="1" valign="top">String</td><td align="left" colspa
 n="1" rowspan="1" valign="top">Preset the value of input element.</td></tr></table></p>
+
+<h2 id="actionmessage-Examples">Examples</h2>
+
+<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:actionmessage /&gt;
+&lt;s:form .... &gt;
+   ....
+&lt;/s:form&gt;
+]]></script>
+</div></div></div>
+        </div>
+
+        
+    </div>
+</div>
+<div class="footer">
+    Generated by CXF SiteExporter
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/struts-site/blob/124e36c4/content/docs/adminapp.html
----------------------------------------------------------------------
diff --git a/content/docs/adminapp.html b/content/docs/adminapp.html
new file mode 100644
index 0000000..b7ae3bc
--- /dev/null
+++ b/content/docs/adminapp.html
@@ -0,0 +1,359 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+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. 
+-->
+<html>
+<head>
+    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
+    <style type="text/css">
+        .dp-highlighter {
+            width:95% !important;
+        }
+    </style>
+    <style type="text/css">
+        .footer {
+            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
+            background-repeat:     repeat-x;
+            background-position:   left top;
+            padding-top:           4px;
+            color:                 #666;
+        }
+    </style>
+    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
+    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
+    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushCss.js' type='text/javascript'></script>
+    <script type="text/javascript">
+        SyntaxHighlighter.defaults['toolbar'] = false;
+        SyntaxHighlighter.all();
+    </script>
+    <script type="text/javascript" language="javascript">
+        var hide = null;
+        var show = null;
+        var children = null;
+
+        function init() {
+            /* Search form initialization */
+            var form = document.forms['search'];
+            if (form != null) {
+                form.elements['domains'].value = location.hostname;
+                form.elements['sitesearch'].value = location.hostname;
+            }
+
+            /* Children initialization */
+            hide = document.getElementById('hide');
+            show = document.getElementById('show');
+            children = document.all != null ?
+                    document.all['children'] :
+                    document.getElementById('children');
+            if (children != null) {
+                children.style.display = 'none';
+                show.style.display = 'inline';
+                hide.style.display = 'none';
+            }
+        }
+
+        function showChildren() {
+            children.style.display = 'block';
+            show.style.display = 'none';
+            hide.style.display = 'inline';
+        }
+
+        function hideChildren() {
+            children.style.display = 'none';
+            show.style.display = 'inline';
+            hide.style.display = 'none';
+        }
+    </script>
+    <title>AdminApp</title>
+</head>
+<body onload="init()">
+<table border="0" cellpadding="2" cellspacing="0" width="100%">
+    <tr class="topBar">
+        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
+            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="tutorials.html">Tutorials</a>&nbsp;&gt;&nbsp;<a href="adminapp.html">AdminApp</a>
+        </td>
+        <td align="right" valign="middle" nowrap>
+            <form name="search" action="https://www.google.com/search" method="get">
+                <input type="hidden" name="ie" value="UTF-8" />
+                <input type="hidden" name="oe" value="UTF-8" />
+                <input type="hidden" name="domains" value="" />
+                <input type="hidden" name="sitesearch" value="" />
+                <input type="text" name="q" maxlength="255" value="" />
+                <input type="submit" name="btnG" value="Google Search" />
+            </form>
+        </td>
+    </tr>
+</table>
+
+<div id="PageContent">
+    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
+        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
+        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
+        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
+        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">AdminApp</div>
+
+        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14086">
+                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14086">Edit Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
+                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14086">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14086">Add Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14086">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14086">Add News</a>
+        </div>
+    </div>
+
+    <div class="pagecontent">
+        <div class="wiki-content">
+            <div id="ConfluenceContent">
+
+<p>TODO: Documenting updated version (currently at <a shape="rect" class="external-link" href="http://www.i-tao.com/adminapp.html" rel="nofollow">http://www.i-tao.com/adminapp.html</a>). IN PROGRESS.</p>
+
+<h2 id="AdminApp-Introduction">Introduction</h2>
+<p>This page aims at providing some additional information about the <a shape="rect" class="external-link" href="http://www.hibernate.org" rel="nofollow">Hibernate</a> <a shape="rect" class="external-link" href="http://www.hibernate.org/159.html#a5" rel="nofollow">AdminApp</a>. The Hibernate AdminApp (hereafter referred to as AA) was created by the Hibernate developers to show a possible implementation strategy for Hibernate with Webwork. Although AA can still be used as a starting point for webapplications, most of its libraries become quite aged (WW 2.0 beta, Hibernate 2, XWork 1.0 beta). Therefore, a shiny <a shape="rect" class="external-link" href="http://www.i-tao.com/adminapp.html" rel="nofollow">new fork</a> (AA2) has been created by Ron Chan.</p>
+
+<p>AA2 relies on WW2.2, Hibernate 3.1, and Spring as its IoC container (rather than XWork's, which has been deprecated in WW 2.2). We'll first discuss the original AA. Later on, we'll show the differences with AA2. Ron, if you're reading this, feel free to point out any mistakes/edit this document.</p>
+
+<p>Like we pointed out before, AA shows a possible implementation strategy to use Hibernate in WebWork in combination with a so-called open-session-in-view pattern (<a shape="rect" class="external-link" href="http://www.hibernate.org/43.html" rel="nofollow">more info</a>, <a shape="rect" class="external-link" href="http://www.jroller.com/page/cardsharp?entry=open_session_in_view_pattern" rel="nofollow">even more</a>). This pattern allows maximum flexibility in our view layer by creating a Hibernate Session object that will live till the end of the request (after the view has been rendered). This allows lazy loading of objects in our view, rather than having to preload all objects and their associations in our business layer, and yet ensures the correct disposing of the Session object.</p>
+
+<p>To accomplish this, AA uses XWork's <a shape="rect" href="dependency-injection.html">components</a> and <a shape="rect" href="interceptors.html">interceptors</a>:</p>
+
+<ul><li><a shape="rect" href="dependency-injection.html">components</a>: XWork manages the lifecycle of objects in several scopes (application, session, request) and takes care of the IoC through the ..Aware interfaces (so called enablers). Hibernate's expensive-to-create SessionFactory will thus be created in the application scope (meaning it will only be initialised once when the application starts up), while the Session objects, used to load our models, is registered in the request scope (will be created once per request).</li></ul>
+
+
+<ul><li><a shape="rect" href="interceptors.html">interceptors</a>: AA uses an interceptor (the HibernateInterceptor) to extract the Session from the WebWork action, so it can control the transactions, redirect/rollback on errors and properly dispose the Session after the view is rendered.</li></ul>
+
+
+<h2 id="AdminApp-AdminAppSourceOverview">AdminApp Source Overview</h2>
+
+<p>Now, let's properly dissect the AA files:</p>
+<ul><li>/lib: contains the various jars for our application. Nothing special here.</li><li>/src/java/org/hibernate/admin/action: lists our WebWork actions. All actions extend an abstract AbstractAction file, which overrides the execute() method from our XWork's ActionSupport. This is where we define a setHibernateSession() method, which is the method we declared in our enabler interface (HibernateSessionAware). This will notify XWork to invoke its IoC magic to set the HibernateSession.</li></ul>
+
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>org.hibernate.admin.action.AbstractAction</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
+        public String execute() throws Exception {
+	
+		// We go to INPUT on field and data errors
+		if ( hasErrors() ) {
+			LOG.debug("action not executed, field or action errors");
+			LOG.debug( "Field errors: " + getFieldErrors() );
+			LOG.debug( "Action errors: " + getActionErrors() );
+			return INPUT;
+		}
+
+		LOG.debug("executing action");
+		return go();
+	}
+	
+	protected abstract String go() throws HibernateException;
+
+	public void setHibernateSession(HibernateSession session) {
+		this.session = session;
+	}
+
+	protected Session getSession() throws HibernateException {
+		return session.getSession();
+	}
+</pre>
+</div></div>
+<p>In this execute() method we'll simply call a abstract go() method (which is then defined in each of the actions). When we need the Hibernate Session, we use the getSession() method, inherited from our AbstractAction. Don't worry about transactions or saving so called dirty objects (our HibernateInterceptor takes care of all that). As you can see, this totally minimizes the LoC (lines of code) needed to retrieve or manipulated our models).</p>
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>org.hibernate.admin.action.EditUserAction</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
+public class EditUserAction extends AbstractAction {
+	//.. ommited for brevity
+	
+	protected String go() throws HibernateException {
+		..
+		getSession().update(user);
+		..
+		return SUCCESS;
+	}
+	
+	//.. getters and setters ommited
+
+}
+</pre>
+</div></div>
+
+<p>There are 3 more *-validation.xml files in this directory containing the validation logic for the Actions. XWork will validate your request before the action gets executed, so you can decouple your (simple) validation logic from your Action. For example, take a look at the CreateUserAction-validation.xml:</p>
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateUserAction-validation.xml</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+..
+    &lt;field name="user.name.lastName"&gt;
+        &lt;field-validator type="requiredstring"&gt;
+            &lt;message&gt;You must enter a last name.&lt;/message&gt;
+        &lt;/field-validator&gt;
+    &lt;/field&gt;
+    &lt;field name="user.email"&gt;
+        &lt;field-validator type="email"&gt;
+            &lt;message&gt;Please correct the e-mail address.&lt;/message&gt;
+        &lt;/field-validator&gt;
+        &lt;field-validator type="required"&gt;
+            &lt;message&gt;Please enter an e-mail address.&lt;/message&gt;
+        &lt;/field-validator&gt;
+    &lt;/field&gt;
+..
+</pre>
+</div></div>
+
+<p><a shape="rect" href="validation.html">Several validator types</a> are available. Here we rely on XWork to validate our Actions, but it's also possible to validate our object Models (see <a shape="rect" href="validation.html">WW Validation</a>). You will mostly use these to validate submitted forms in your webapp. </p>
+
+<p>When a validator fails, you will automatically be returned to the input page with a clear indication which field failed to validate if: </p>
+
+<p>a) actually provided an input type in your <a shape="rect" href="strutsxml.html">struts.xml</a> file</p>
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>xwork.xml</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+	..
+        &lt;result name="input" type="dispatcher"&gt;
+		&lt;param name="location"&gt;/editUser.jsp&lt;/param&gt;
+	&lt;/result&gt;
+	..
+</pre>
+</div></div>
+<p>b) you enabled the validation interceptor in your <a shape="rect" href="strutsxml.html">struts.xml</a></p>
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>xwork.xml</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+	..
+	&lt;interceptor-ref name="defaultStack"/&gt;
+	&lt;interceptor-ref name="validation"/&gt;
+	..
+</pre>
+</div></div>
+<p>c) you use the WebWork tag library (warning: this is the old syntax):</p>
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateUser.jsp</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+..
+&lt;ww:form name="'createUserForm'" action="'createUser.action'" method="'POST'"&gt;
+    &lt;ww:textfield label="'Username'" name="'user.handle'"/&gt;
+..
+</pre>
+</div></div>
+
+<p>New syntax (since 2.2):</p>
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>CreateUser.jsp</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+..
+&lt;ww:form name="createUserForm" action="createUser" method="POST"&gt;
+    &lt;ww:textfield label="Username" name="user.handle"/&gt;
+..
+</pre>
+</div></div>
+
+<ul><li>/src/java/org/hibernate/admin/component: contains the components and enablers for both the HibernateSessionFactory and the HibernateSession. These components are declared in the /src/java/<a shape="rect" href="dependency-injection.html">components.xml</a> file (which will be copied to the root of your compiled classes afterwards):</li></ul>
+
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>components.xml</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: xml; gutter: false; theme: Default" style="font-size:12px;">
+&lt;components&gt;
+
+    &lt;component&gt;
+        &lt;scope&gt;request&lt;/scope&gt;
+        &lt;class&gt;org.hibernate.admin.component.HibernateSession&lt;/class&gt;
+        &lt;enabler&gt;org.hibernate.admin.component.HibernateSessionAware&lt;/enabler&gt;
+    &lt;/component&gt;
+
+    &lt;component&gt;
+        &lt;scope&gt;application&lt;/scope&gt;
+        &lt;class&gt;org.hibernate.admin.component.HibernateSessionFactory&lt;/class&gt;
+        &lt;enabler&gt;org.hibernate.admin.component.HibernateSessionFactoryAware&lt;/enabler&gt;
+    &lt;/component&gt;
+
+&lt;/components&gt;
+</pre>
+</div></div>
+
+<ul><li>/src/java/org/hibernate/admin/interceptor: contains the Hibernate interceptor. <a shape="rect" href="interceptors.html">Interceptors</a> are an incredibly powerful feature of WebWork - it allows you to control invocations before and after they excute, manipulate their results, or, as in our case, extract the HibernateSession object and dispose it after the Action has been executed (and the view rendered). Because we use a try/catch/finally block, we're able to catch exceptions and yet make sure our Session gets closed properly (the number one cause of db connection leaks).</li></ul>
+
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>org.hibernate.admin.interceptor.HibernateInterceptor</b></div><div class="codeContent panelContent pdl">
+<pre class="brush: java; gutter: false; theme: Default" style="font-size:12px;">
+	public String intercept(ActionInvocation invocation) throws Exception {
+		Action action = invocation.getAction();
+		if ( !(action instanceof AbstractAction) ) return invocation.invoke();
+		
+		HibernateSession hs = ( (AbstractAction) action ).getHibernateSession();
+		try {
+			return invocation.invoke();
+		}
+		
+		// Note that all the cleanup is done
+		// after the view is rendered, so we
+		// have an open session in the view
+		
+		catch (Exception e) {	
+			hs.setRollBackOnly(true);
+			if (e instanceof HibernateException) {
+				LOG.error("HibernateException in execute()", e);
+				return Action.ERROR;
+			}
+			else {
+				LOG.error("Exception in execute()", e);
+				throw e;
+			}
+		}
+		
+		finally {
+			try {
+				hs.disposeSession();
+			}
+			catch (HibernateException e) {
+				LOG.error("HibernateException in dispose()", e);
+				return Action.ERROR;
+			}
+		}
+	}
+</pre>
+</div></div>
+
+
+<h2 id="AdminApp-Conclusion">Conclusion</h2>
+<p>In this document, we tried to point out several key features in the Hibernate AdminApp. In part II, we'll have a look at the new AdminApp, which is far more up to date, and uses Spring as its IoC container. No more implements ActionSupport or Aware interfaces, resulting in even cleaner code.</p>
+
+<p>AdminApp is a very good example of how a webapp can be structered, using as many advantages from the various frameworks as possible.</p></div>
+        </div>
+
+        
+    </div>
+</div>
+<div class="footer">
+    Generated by CXF SiteExporter
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/struts-site/blob/124e36c4/content/docs/after-annotation.html
----------------------------------------------------------------------
diff --git a/content/docs/after-annotation.html b/content/docs/after-annotation.html
new file mode 100644
index 0000000..3896e98
--- /dev/null
+++ b/content/docs/after-annotation.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+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. 
+-->
+<html>
+<head>
+    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
+    <style type="text/css">
+        .dp-highlighter {
+            width:95% !important;
+        }
+    </style>
+    <style type="text/css">
+        .footer {
+            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
+            background-repeat:     repeat-x;
+            background-position:   left top;
+            padding-top:           4px;
+            color:                 #666;
+        }
+    </style>
+    <link href='https://struts.apache.org/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
+    <link href='https://struts.apache.org/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
+    <script src='https://struts.apache.org/highlighter/js/shCore.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushXml.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJava.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushBash.js' type='text/javascript'></script>
+    <script src='https://struts.apache.org/highlighter/js/shBrushCss.js' type='text/javascript'></script>
+    <script type="text/javascript">
+        SyntaxHighlighter.defaults['toolbar'] = false;
+        SyntaxHighlighter.all();
+    </script>
+    <script type="text/javascript" language="javascript">
+        var hide = null;
+        var show = null;
+        var children = null;
+
+        function init() {
+            /* Search form initialization */
+            var form = document.forms['search'];
+            if (form != null) {
+                form.elements['domains'].value = location.hostname;
+                form.elements['sitesearch'].value = location.hostname;
+            }
+
+            /* Children initialization */
+            hide = document.getElementById('hide');
+            show = document.getElementById('show');
+            children = document.all != null ?
+                    document.all['children'] :
+                    document.getElementById('children');
+            if (children != null) {
+                children.style.display = 'none';
+                show.style.display = 'inline';
+                hide.style.display = 'none';
+            }
+        }
+
+        function showChildren() {
+            children.style.display = 'block';
+            show.style.display = 'none';
+            hide.style.display = 'inline';
+        }
+
+        function hideChildren() {
+            children.style.display = 'none';
+            show.style.display = 'inline';
+            hide.style.display = 'none';
+        }
+    </script>
+    <title>After Annotation</title>
+</head>
+<body onload="init()">
+<table border="0" cellpadding="2" cellspacing="0" width="100%">
+    <tr class="topBar">
+        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
+            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="core-developers-guide.html">Core Developers Guide</a>&nbsp;&gt;&nbsp;<a href="annotations.html">Annotations</a>&nbsp;&gt;&nbsp;<a href="after-annotation.html">After Annotation</a>
+        </td>
+        <td align="right" valign="middle" nowrap>
+            <form name="search" action="https://www.google.com/search" method="get">
+                <input type="hidden" name="ie" value="UTF-8" />
+                <input type="hidden" name="oe" value="UTF-8" />
+                <input type="hidden" name="domains" value="" />
+                <input type="hidden" name="sitesearch" value="" />
+                <input type="text" name="q" maxlength="255" value="" />
+                <input type="submit" name="btnG" value="Google Search" />
+            </form>
+        </td>
+    </tr>
+</table>
+
+<div id="PageContent">
+    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
+        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
+        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
+        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
+        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">After Annotation</div>
+
+        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14229">
+                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=14229">Edit Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
+                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14229">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=14229">Add Page</a>
+            &nbsp;
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14229">
+                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
+                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
+            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=14229">Add News</a>
+        </div>
+    </div>
+
+    <div class="pagecontent">
+        <div class="wiki-content">
+            <div id="ConfluenceContent"><h1 id="AfterAnnotation-AfterAnnotation">After Annotation</h1>
+
+<p>Marks a action method that needs to be called after the main action method and the result was
+executed. Return value is ignored.</p>
+
+<h2 id="AfterAnnotation-Usage">Usage</h2>
+
+<p>The After annotation can be applied at method level.</p>
+
+
+<h2 id="AfterAnnotation-Parameters">Parameters</h2>
+
+<p><table class="confluenceTable" summary=""><tr><th colspan="1" rowspan="1" class="confluenceTh"> Parameter </th><th colspan="1" rowspan="1" class="confluenceTh"> Required </th><th colspan="1" rowspan="1" class="confluenceTh"> Default </th><th colspan="1" rowspan="1" class="confluenceTh"> Notes </th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">priority</td><td colspan="1" rowspan="1" class="confluenceTd">no</td><td colspan="1" rowspan="1" class="confluenceTd">10</td><td colspan="1" rowspan="1" class="confluenceTd">Priority order of method execution</td></tr></table></p>
+
+<h2 id="AfterAnnotation-Examples">Examples</h2>
+
+<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+<script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
+public class SampleAction extends ActionSupport {
+
+ @After
+ public void isValid() throws ValidationException {
+   // validate model object, throw exception if failed
+ }
+
+ public String execute() {
+    // perform action
+    return SUCCESS;
+ }
+}
+]]></script>
+</div></div></div>
+        </div>
+
+        
+    </div>
+</div>
+<div class="footer">
+    Generated by CXF SiteExporter
+</div>
+</body>
+</html>