Modified: websites/production/struts/content/docs/security.html
==============================================================================
--- websites/production/struts/content/docs/security.html (original)
+++ websites/production/struts/content/docs/security.html Tue Aug 25 07:18:20
2015
@@ -138,14 +138,14 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><h3
id="Security-/*<![CDATA[*/div.rbtoc1438274444920{padding:0px;}div.rbtoc1438274444920ul{list-style:disc;margin-left:0px;}div.rbtoc1438274444920li{margin-left:0px;padding-left:0px;}/*]]>*/#Security-Securitytips#Security-SecuritytipsRestrictaccesstotheConfigBrow"><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1438274444920 {padding: 0px;}
-div.rbtoc1438274444920 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1438274444920 li {margin-left: 0px;padding-left: 0px;}
+ <div id="ConfluenceContent"><h3
id="Security-/*<![CDATA[*/div.rbtoc1440486694001{padding:0px;}div.rbtoc1440486694001ul{list-style:disc;margin-left:0px;}div.rbtoc1440486694001li{margin-left:0px;padding-left:0px;}/*]]>*/#Security-Securitytips#Security-SecuritytipsRestrictaccesstotheConfigBrow"><style
type="text/css">/*<![CDATA[*/
+div.rbtoc1440486694001 {padding: 0px;}
+div.rbtoc1440486694001 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1440486694001 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></h3><div class="toc-macro rbtoc1438274444920">
+/*]]>*/</style></h3><div class="toc-macro rbtoc1440486694001">
<ul class="toc-indentation"><li><a shape="rect"
href="#Security-"></a></li><li><a shape="rect"
href="#Security-Securitytips">Security tips</a>
-<ul class="toc-indentation"><li><a shape="rect"
href="#Security-RestrictaccesstotheConfigBrowser">Restrict access to the Config
Browser</a></li><li><a shape="rect"
href="#Security-Don'tmixdifferentaccesslevelsinthesamenamespace">Don't mix
different access levels in the same namespace</a></li><li><a shape="rect"
href="#Security-NeverexposeJSPfilesdirectly">Never expose JSP files
directly</a></li></ul>
+<ul class="toc-indentation"><li><a shape="rect"
href="#Security-RestrictaccesstotheConfigBrowser">Restrict access to the Config
Browser</a></li><li><a shape="rect"
href="#Security-Don'tmixdifferentaccesslevelsinthesamenamespace">Don't mix
different access levels in the same namespace</a></li><li><a shape="rect"
href="#Security-NeverexposeJSPfilesdirectly">Never expose JSP files
directly</a></li><li><a shape="rect" href="#Security-DisabledevMode">Disable
devMode</a></li></ul>
</li><li><a shape="rect" href="#Security-Internalsecuritymechanism">Internal
security mechanism</a>
<ul class="toc-indentation"><li><a shape="rect"
href="#Security-Accessingstaticmethods">Accessing static methods</a></li><li><a
shape="rect" href="#Security-OGNLisusedtocallaction'smethods">OGNL is used to
call action's methods</a></li><li><a shape="rect"
href="#Security-Accepted/Excludedpatterns">Accepted / Excluded
patterns</a></li></ul>
</li></ul>
@@ -177,7 +177,7 @@ div.rbtoc1438274444920 li {margin-left:
<description>Don't assign users to this role</description>
<role-name>no-users</role-name>
</security-role></pre>
-</div></div><p>The best approach is to used the both solutions.</p><h3
id="Security-Internalsecuritymechanism">Internal security mechanism</h3><p>The
Apache Struts 2 contains internal security manager which blocks access to
particular classes and Java packages - it's a OGNL-wide mechanism which means
it affects any aspect of the framework ie. incoming parameters, expressions
used in JSPs, etc.</p><p>The defaults are as follow:</p><div class="code panel
pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
+</div></div><p>The best approach is to used the both solutions.</p><h4
id="Security-DisabledevMode">Disable devMode</h4><p>The <code
style="line-height: 1.4285715;">devMode</code> is very useful option back can
expose your application presenting too many informations of application's
internals. Please always disable the <code>devMode</code> before deploying
your application to a production environment.</p><h3
id="Security-Internalsecuritymechanism">Internal security mechanism</h3><p>The
Apache Struts 2 contains internal security manager which blocks access to
particular classes and Java packages - it's a OGNL-wide mechanism which means
it affects any aspect of the framework ie. incoming parameters, expressions
used in JSPs, etc.</p><p>The defaults are as follow:</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;"> <constant name="struts.excludedClasses"
value="
java.lang.Object,
Modified: websites/production/struts/content/docs/short-validator.html
==============================================================================
--- websites/production/struts/content/docs/short-validator.html (original)
+++ websites/production/struts/content/docs/short-validator.html Tue Aug 25
07:18:20 2015
@@ -139,16 +139,49 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
<div id="ConfluenceContent"><h1
id="shortvalidator-Description">Description</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p>Field Validator that checks if the short specified is within a certain
range.</p>
<h1 id="shortvalidator-Parameters">Parameters</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><ul><li>fieldName - The field name this validator is validating.
Required if using Plain-Validator Syntax otherwise not required</li><li>min -
the minimum value (if none is specified, it will not be checked) </li><li>max -
the maximum value (if none is specified, it will not be checked) </li><li>parse
- if set to true, minExpression and maxExpression will be evaluated to find
min/max</li><li>minExpression - expression to calculate the minimum value (if
none is specified, it will not be checked) </li><li>maxExpression - expression
to calculate the maximum value (if none is specified, it will not be checked)
</li></ul>
+
+<p>You can either use the min / max value or minExpression / maxExpression
(when parse is set to true) -
+using expression can be slightly slower, see the example below.</p>
<div class="confluence-information-macro
confluence-information-macro-warning"><p class="title">Warning</p><span
class="aui-icon aui-icon-small aui-iconfont-error
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span>
</div></div></div>
+<p>Do not use ${minExpression} and ${maxExpression} as an expression as this
will turn into infinitive loop!</p></div></div>
<h1 id="shortvalidator-Examples">Examples</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+ <validators>
+ <!-- Plain Validator Syntax -->
+ <validator type="short">
+ <param name="fieldName">age</param>
+ <param name="min">20</param>
+ <param name="max">50</param>
+ <message>Age needs to be between ${min} and
${max}</message>
+ </validator>
+
+ <!-- Field Validator Syntax -->
+ <field name="age">
+ <field-validator type="short">
+ <param name="min">20</param>
+ <param name="max">50</param>
+ <message>Age needs to be between ${min} and
${max}</message>
+ </field-validator>
+ </field>
+
+ <!-- Field Validator Syntax with expression -->
+ <field name="age">
+ <field-validator type="short">
+ <param
name="minExpression">${minValue}</param> <!-- will be
evaluated as: Short getMinValue() -->
+ <param
name="maxExpression">${maxValue}</param> <!-- will be
evaluated as: Short getMaxValue() -->
+ <message>Age needs to be between ${min} and
${max}</message>
+ </field-validator>
+ </field>
+ </validators>
+]]></script>
+</div></div></div>
</div>
Modified:
websites/production/struts/content/docs/static-parameters-interceptor.html
==============================================================================
--- websites/production/struts/content/docs/static-parameters-interceptor.html
(original)
+++ websites/production/struts/content/docs/static-parameters-interceptor.html
Tue Aug 25 07:18:20 2015
@@ -138,19 +138,39 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent">
+<p>This interceptor populates the action with the static parameters defined in
the action configuration. If the action
+implements Parameterizable, a map of the static parameters will be also be
passed directly to the action.
+The static params will be added to the request params map, unless "merge" is
set to false.</p>
+
+<p></p><p> Parameters are typically defined with <param> elements within
xwork.xml.</p>
+
<h2 id="StaticParametersInterceptor-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p></p><ul></ul><p></p><ul><li>None</li></ul><p></p>
+
<h2 id="StaticParametersInterceptor-ExtendingtheInterceptor">Extending the
Interceptor</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p></p><p>There are no extension points to this interceptor.</p>
+
<h2 id="StaticParametersInterceptor-Examples">Examples</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="staticParams">
+ <param name="parse">true</param>
+ <param name="overwrite">false</param>
+ </interceptor-ref>
+ <result name="success">good_result.ftl</result>
+</action>
+]]></script>
+</div></div></div>
</div>
Modified: websites/production/struts/content/docs/stringlength-validator.html
==============================================================================
--- websites/production/struts/content/docs/stringlength-validator.html
(original)
+++ websites/production/struts/content/docs/stringlength-validator.html Tue Aug
25 07:18:20 2015
@@ -139,16 +139,53 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
<div id="ConfluenceContent"><h1
id="stringlengthvalidator-Description">Description</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p>StringLengthFieldValidator checks that a String field is of a certain
length. If the "minLength"
+parameter is specified, it will make sure that the String has at least that
many characters. If
+the "maxLength" parameter is specified, it will make sure that the String has
at most that many
+characters. The "trim" parameter determines whether it will {@link
String#trim() trim} the
+String before performing the length check. If unspecified, the String will be
trimmed.</p>
<h1 id="stringlengthvalidator-Parameters">Parameters</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><ul><li>fieldName - The field name this validator is validating.
Required if using Plain-Validator Syntax otherwise not
required</li><li>maxLength - Integer. The max length of the field value.
Default ignore.</li><li>minLength - Integer. The min length of the field value.
Default ignore.</li><li>trim - (Optional) Boolean, default true. Trim the field
value before evaluating its min/max length. Default
true.</li><li>maxLengthExpression - (Optional) String. Defines the max length
param as an OGNL expression</li><li>minLengthExpression - (Optional) String.
Defines the min length param as an OGNL expression</li><li>trimExpression -
(Optional) String. Defines th trim param as an OGNL expression</li></ul>
<div class="confluence-information-macro
confluence-information-macro-warning"><p class="title">Warning</p><span
class="aui-icon aui-icon-small aui-iconfont-error
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span>
</div></div></div>
+<p>Do not use ${minLengthExpression}, ${maxLengthExpression} and
${trimExpression} as an expression as this will turn into infinitive
loop!</p></div></div>
<h1 id="stringlengthvalidator-Examples">Examples</h1>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+<validators>
+ <!-- Plain Validator Syntax -->
+ <validator type="stringlength">
+ <param name="fieldName">myPurchaseCode</param>
+ <param name="minLength">10</param>
+ <param name="maxLength">10</param>
+ <param name="trim">true</param>
+ <message>Your purchase code needs to be 10 characters
long</message>
+ </validator>
+
+ <!-- Field Validator Syntax -->
+ <field name="myPurchaseCode">
+ <field-validator type="stringlength">
+ <param name="minLength">10</param>
+ <param name="maxLength">10</param>
+ <param name="trim">true</param>
+ <message>Your purchase code needs to be 10 characters
long</message>
+ </field-validator>
+ </field>
+
+ <!-- Field Validator Syntax with expression -->
+ <field name="myPurchaseCode">
+ <field-validator type="stringlength">
+ <param
name="minLengthExpression">${minLengthValue}</param> <!--
will be evaluated as: Integer getMinLengthValue() -->
+ <param
name="maxLengthExpression">${maxLengthValue}</param> <!--
will be evaluated as: Integer getMaxLengthValue() -->
+ <param
name="trimExpression">${trimValue}</param> <!-- will be
evaluated as: boolean getTrimValue() -->
+ <message>Your purchase code needs to be 10 characters
long</message>
+ </field-validator>
+ </field>
+</validators>
+]]></script>
+</div></div></div>
</div>
Modified:
websites/production/struts/content/docs/stringlengthfieldvalidator-annotation.html
==============================================================================
---
websites/production/struts/content/docs/stringlengthfieldvalidator-annotation.html
(original)
+++
websites/production/struts/content/docs/stringlengthfieldvalidator-annotation.html
Tue Aug 25 07:18:20 2015
@@ -138,19 +138,27 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent"><p>This validator checks that a String
field is of the right length. It assumes that the field is a String.
+If neither minLength nor maxLength is set, nothing will be done.</p>
<h2 id="StringLengthFieldValidatorAnnotation-Usage">Usage</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>The annotation must be applied at method level.</p>
<h2 id="StringLengthFieldValidatorAnnotation-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<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">message</td><td colspan="1" rowspan="1"
class="confluenceTd">yes</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">field error message</td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd">key</td><td colspan="1" rowspan="1"
class="confluenceTd">no</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">i18n key from language specific properties
file.</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">messageParams</td><td colspan="1" rowspan="1"
class="confluenceTd">no</td><td colspan="1" row
span="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd">Additional params to be used to customize message - will
be evaluated against the Value Stack</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">fieldName</td><td colspan="1" rowspan="1"
class="confluenceTd">no</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">shortCircuit</td><td colspan="1" rowspan="1"
class="confluenceTd">no</td><td colspan="1" rowspan="1"
class="confluenceTd">false</td><td colspan="1" rowspan="1"
class="confluenceTd">If this validator should be used as
shortCircuit.</td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">type</td><td colspan="1" rowspan="1"
class="confluenceTd">yes</td><td colspan="1" rowspan="1"
class="confluenceTd">ValidatorType.FIELD</td><td colspan="1" rowspan="1"
class="confluenceTd">Enum value from Valida
torType. Either FIELD or SIMPLE can be used here.</td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"> trim </td><td colspan="1" rowspan="1"
class="confluenceTd"> no </td><td colspan="1" rowspan="1" class="confluenceTd">
true </td><td colspan="1" rowspan="1" class="confluenceTd"> Boolean property.
Determines whether the String is trimmed before performing the length check.
</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"> minLength
</td><td colspan="1" rowspan="1" class="confluenceTd"> no </td><td colspan="1"
rowspan="1" class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> Integer property. The minimum length the String must be.
</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">
minLengthExpression </td><td colspan="1" rowspan="1" class="confluenceTd"> no
</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd">OGNL expression used to obtain the
minimum lengt
h the String must be. </td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"> maxLength </td><td colspan="1" rowspan="1"
class="confluenceTd"> no </td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"> Integer property. The maximum length the String can be.
</td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">
maxLengthExpression </td><td colspan="1" rowspan="1" class="confluenceTd"> no
</td><td colspan="1" rowspan="1" class="confluenceTd"> </td><td
colspan="1" rowspan="1" class="confluenceTd">OGNL expression used to obtain the
maximum length the String can be. </td></tr></table></p>
+
+<p></p><p>If neither <em>minLength</em> nor <em>maxLength</em> is set, nothing
will be done.</p>
+
<h2 id="StringLengthFieldValidatorAnnotation-Examples">Examples</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+@StringLengthFieldValidator(message = "Default message", key =
"i18n.key", shortCircuit = true, trim = true, minLength =
"5", maxLength = "12")
+]]></script>
+</div></div></div>
</div>
Modified: websites/production/struts/content/docs/struts-2-blank-archetype.html
==============================================================================
--- websites/production/struts/content/docs/struts-2-blank-archetype.html
(original)
+++ websites/production/struts/content/docs/struts-2-blank-archetype.html Tue
Aug 25 07:18:20 2015
@@ -149,11 +149,11 @@ under the License.
<p><strong>Contents</strong></p>
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1438274335116 {padding: 0px;}
-div.rbtoc1438274335116 ul {list-style: none;margin-left: 0px;padding-left:
1em;}
-div.rbtoc1438274335116 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1440486562322 {padding: 0px;}
+div.rbtoc1440486562322 ul {list-style: none;margin-left: 0px;padding-left:
1em;}
+div.rbtoc1440486562322 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1438274335116">
+/*]]>*/</style><div class="toc-macro rbtoc1440486562322">
<ul class="toc-indentation"><li><span class="TOCOutline">1</span> <a
shape="rect"
href="#Struts2BlankArchetype-CreatingOurblank-archetypeProject">Creating Our
blank-archetype Project</a>
<ul class="toc-indentation"><li><span class="TOCOutline">1.1</span> <a
shape="rect" href="#Struts2BlankArchetype-Stagingrepository">Staging
repository</a></li></ul>
</li><li><span class="TOCOutline">2</span> <a shape="rect"
href="#Struts2BlankArchetype-ProjectStructure">Project Structure</a>
Modified: websites/production/struts/content/docs/struts-2-maven-archetypes.html
==============================================================================
--- websites/production/struts/content/docs/struts-2-maven-archetypes.html
(original)
+++ websites/production/struts/content/docs/struts-2-maven-archetypes.html Tue
Aug 25 07:18:20 2015
@@ -143,11 +143,11 @@ under the License.
<p><strong>Contents</strong></p>
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1438274332141 {padding: 0px;}
-div.rbtoc1438274332141 ul {list-style: none;margin-left: 0px;padding-left:
1em;}
-div.rbtoc1438274332141 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1440486563546 {padding: 0px;}
+div.rbtoc1440486563546 ul {list-style: none;margin-left: 0px;padding-left:
1em;}
+div.rbtoc1440486563546 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1438274332141">
+/*]]>*/</style><div class="toc-macro rbtoc1440486563546">
<ul class="toc-indentation"><li><span class="TOCOutline">1</span> <a
shape="rect"
href="#Struts2MavenArchetypes-Quickstart">Quickstart</a></li><li><span
class="TOCOutline">2</span> <a shape="rect"
href="#Struts2MavenArchetypes-AvailableArchetypes">Available Archetypes</a>
<ul class="toc-indentation"><li><span class="TOCOutline">2.1</span> <a
shape="rect"
href="#Struts2MavenArchetypes-TheBlankConventionArchetype(struts2-archetype-convention)">The
Blank Convention Archetype (struts2-archetype-convention)</a></li><li><span
class="TOCOutline">2.2</span> <a shape="rect"
href="#Struts2MavenArchetypes-TheBlankArchetype(struts2-archetype-blank)">The
Blank Archetype (struts2-archetype-blank)</a></li><li><span
class="TOCOutline">2.3</span> <a shape="rect"
href="#Struts2MavenArchetypes-TheStarterArchetype(struts2-archetype-starter)">The
Starter Archetype (struts2-archetype-starter)</a></li><li><span
class="TOCOutline">2.4</span> <a shape="rect"
href="#Struts2MavenArchetypes-TheAngularJSArchetype(struts2-archetype-angularjs)">The
AngularJS Archetype (struts2-archetype-angularjs)</a></li><li><span
class="TOCOutline">2.5</span> <a shape="rect"
href="#Struts2MavenArchetypes-ThePortletBlankArchetype(struts2-archetype-portlet)">The
Portlet Blank Archetype (struts2-ar
chetype-portlet)</a></li><li><span class="TOCOutline">2.6</span> <a
shape="rect"
href="#Struts2MavenArchetypes-ThePortletDatabaseArchetype(struts2-archetype-dbportlet)">The
Portlet Database Archetype (struts2-archetype-dbportlet)</a></li><li><span
class="TOCOutline">2.7</span> <a shape="rect"
href="#Struts2MavenArchetypes-ThePluginArchetype(struts2-archetype-plugin)">The
Plugin Archetype (struts2-archetype-plugin)</a></li></ul>
</li><li><span class="TOCOutline">3</span> <a shape="rect"
href="#Struts2MavenArchetypes-CreatinganApplicationUsingaMavenArchetype">Creating
an Application Using a Maven Archetype</a>
Modified:
websites/production/struts/content/docs/struts-2-spring-2-jpa-ajax.html
==============================================================================
--- websites/production/struts/content/docs/struts-2-spring-2-jpa-ajax.html
(original)
+++ websites/production/struts/content/docs/struts-2-spring-2-jpa-ajax.html Tue
Aug 25 07:18:20 2015
@@ -145,11 +145,11 @@ under the License.
<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>Following this tutorial verbatim
will require use of a Struts 2 deployment greater than 2.0.3</p></div></div>
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1438274224300 {padding: 0px;}
-div.rbtoc1438274224300 ul {list-style: none;margin-left: 0px;}
-div.rbtoc1438274224300 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1440486429793 {padding: 0px;}
+div.rbtoc1440486429793 ul {list-style: none;margin-left: 0px;}
+div.rbtoc1440486429793 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1438274224300">
+/*]]>*/</style><div class="toc-macro rbtoc1440486429793">
<ul class="toc-indentation"><li><a shape="rect"
href="#Struts2+Spring2+JPA+AJAX-Prerequisites">Prerequisites</a>
<ul class="toc-indentation"><li><a shape="rect"
href="#Struts2+Spring2+JPA+AJAX-Tomcat">Tomcat</a></li><li><a shape="rect"
href="#Struts2+Spring2+JPA+AJAX-MySql">MySql</a></li></ul>
</li><li><a shape="rect" href="#Struts2+Spring2+JPA+AJAX-Getthecode">Get the
code</a>
Modified: websites/production/struts/content/docs/struts-next.html
==============================================================================
--- websites/production/struts/content/docs/struts-next.html (original)
+++ websites/production/struts/content/docs/struts-next.html Tue Aug 25
07:18:20 2015
@@ -125,12 +125,12 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><h3
id="StrutsNext-/*<![CDATA[*/div.rbtoc1438274394124{padding:0px;}div.rbtoc1438274394124ul{list-style:disc;margin-left:0px;}div.rbtoc1438274394124li{margin-left:0px;padding-left:0px;}/*]]>*/#StrutsNext-Whatshouldbeimproved/changed#StrutsNext-Whatshouldbeimprove"><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1438274394124 {padding: 0px;}
-div.rbtoc1438274394124 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1438274394124 li {margin-left: 0px;padding-left: 0px;}
+ <div id="ConfluenceContent"><h3
id="StrutsNext-/*<![CDATA[*/div.rbtoc1440486666365{padding:0px;}div.rbtoc1440486666365ul{list-style:disc;margin-left:0px;}div.rbtoc1440486666365li{margin-left:0px;padding-left:0px;}/*]]>*/#StrutsNext-Whatshouldbeimproved/changed#StrutsNext-Whatshouldbeimprove"><style
type="text/css">/*<![CDATA[*/
+div.rbtoc1440486666365 {padding: 0px;}
+div.rbtoc1440486666365 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1440486666365 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></h3><div class="toc-macro rbtoc1438274394124">
+/*]]>*/</style></h3><div class="toc-macro rbtoc1440486666365">
<ul class="toc-indentation"><li><a shape="rect"
href="#StrutsNext-"></a></li></ul>
<ul><li><a shape="rect" href="#StrutsNext-Whatshouldbeimproved/changed">What
should be improved / changed</a></li><li><a shape="rect"
href="#StrutsNext-DevelopmentplanofStruts3">Development plan of Struts 3</a>
<ul class="toc-indentation"><li><a shape="rect"
href="#StrutsNext-M1(akaStruts2.5)">M1 (aka Struts 2.5)</a></li><li><a
shape="rect" href="#StrutsNext-M2(alphaStruts3)">M2 (alpha Struts
3)</a></li><li><a shape="rect" href="#StrutsNext-M3(alphaStruts3)">M3 (alpha
Struts 3)</a></li><li><a shape="rect" href="#StrutsNext-M4(beta1Struts3)">M4
(beta 1 Struts 3)</a></li></ul>
Modified: websites/production/struts/content/docs/struts-tags.html
==============================================================================
--- websites/production/struts/content/docs/struts-tags.html (original)
+++ websites/production/struts/content/docs/struts-tags.html Tue Aug 25
07:18:20 2015
@@ -129,7 +129,7 @@ under the License.
<p>The types of tags can be broken in to two types: generic and UI. Besides
function and responsibility, the biggest difference between the two is that the
HTML tags support <em>templates</em> and <em>themes</em>. In addition to the
general tag reference, we also provide examples for using these generic tags in
each of the support languages.</p>
-<p><img class="emoticon emoticon-tick"
src="https://cwiki.apache.org/confluence/s/en_GB-1988229788/4109/76e0dbb30bc8580e459c201f3535d84f9283a9ac.1/_/images/icons/emoticons/check.png"
data-emoticon-name="tick" alt="(tick)"> Be sure to read the <a shape="rect"
href="tag-syntax.html">Tag Syntax</a> document to learn how tag attribute
syntax works.</p>
+<p><img class="emoticon emoticon-tick"
src="https://cwiki.apache.org/confluence/s/en_GB/5982/f2b47fb3d636c8bc9fd0b11c0ec6d0ae18646be7.1/_/images/icons/emoticons/check.png"
data-emoticon-name="tick" alt="(tick)"> Be sure to read the <a shape="rect"
href="tag-syntax.html">Tag Syntax</a> document to learn how tag attribute
syntax works.</p>
<h2 id="StrutsTags-FAQs">FAQs </h2>
Modified: websites/production/struts/content/docs/themes-and-templates.html
==============================================================================
--- websites/production/struts/content/docs/themes-and-templates.html (original)
+++ websites/production/struts/content/docs/themes-and-templates.html Tue Aug
25 07:18:20 2015
@@ -131,7 +131,7 @@ under the License.
<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th
colspan="1" rowspan="1" class="confluenceTh"><p> tag </p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p> A small piece of code executed from within
<a shape="rect" href="jsp.html">JSP</a>, <a shape="rect"
href="freemarker.html">FreeMarker</a>, or <a shape="rect"
href="velocity.html">Velocity</a>. </p></td></tr><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p> template </p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p> A bit of code, usually written in <a
shape="rect" href="freemarker.html">FreeMarker</a>, that can be rendered by
certain tags (HTML tags) </p></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p> theme </p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p> A collection of <em>templates</em> packaged together
to provide common functionality </p></td></tr></tbody></table></div>
-<p><img class="emoticon emoticon-light-on"
src="https://cwiki.apache.org/confluence/s/en_GB-1988229788/4109/76e0dbb30bc8580e459c201f3535d84f9283a9ac.1/_/images/icons/emoticons/lightbulb_on.png"
data-emoticon-name="light-on" alt="(lightbulb)"> See <a shape="rect"
href="struts-tags.html">Struts Tags</a> for more about the HTML and other tags
provided by the framework.</p>
+<p><img class="emoticon emoticon-light-on"
src="https://cwiki.apache.org/confluence/s/en_GB/5982/f2b47fb3d636c8bc9fd0b11c0ec6d0ae18646be7.1/_/images/icons/emoticons/lightbulb_on.png"
data-emoticon-name="light-on" alt="(lightbulb)"> See <a shape="rect"
href="struts-tags.html">Struts Tags</a> for more about the HTML and other tags
provided by the framework.</p>
<h2 id="ThemesandTemplates-TemplateBasics">Template Basics</h2>
Modified: websites/production/struts/content/docs/timer-interceptor.html
==============================================================================
--- websites/production/struts/content/docs/timer-interceptor.html (original)
+++ websites/production/struts/content/docs/timer-interceptor.html Tue Aug 25
07:18:20 2015
@@ -138,19 +138,44 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent"><p>This interceptor logs the amount of
time in milliseconds. In order for this interceptor to work properly, the
+logging framework must be set to at least the <tt>INFO</tt> level.
+This interceptor relies on the <a shape="rect"
href="http://jakarta.apache.org/commons/logging/">Commons Logging API</a> to
+report its execution-time value.</p>
<h2 id="TimerInterceptor-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p></p><ul></ul><p></p><ul><li>logLevel (optional) - what log level should we
use (<code>trace, debug, info, warn, error, fatal</code>)? - defaut is
<code>info</code></li></ul><p></p><ul><li>logCategory (optional) - If provided
we would use this category (eg. <code>com.mycompany.app</code>).
+Default is to use
<code>com.opensymphony.xwork2.interceptor.TimerInterceptor</code>.</li></ul><p></p>
+
+<p>The parameters above enables us to log all action execution times in our
own logfile.</p>
+
<h2 id="TimerInterceptor-ExtendingtheInterceptor">Extending the
Interceptor</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p>This interceptor can be extended to provide custom message format. Users
should override the
+<code>invokeUnderTiming</code> method.</p>
<h2 id="TimerInterceptor-Examples">Examples</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+<!-- records only the action's execution time -->
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="completeStack"/>
+ <interceptor-ref name="timer"/>
+ <result name="success">good_result.ftl</result>
+</action>
+
+<!-- records action's execution time as well as other interceptors-->
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="timer"/>
+ <interceptor-ref name="completeStack"/>
+ <result name="success">good_result.ftl</result>
+</action>
+]]></script>
+</div></div></div>
</div>
Modified: websites/production/struts/content/docs/type-conversion.html
==============================================================================
--- websites/production/struts/content/docs/type-conversion.html (original)
+++ websites/production/struts/content/docs/type-conversion.html Tue Aug 25
07:18:20 2015
@@ -141,11 +141,11 @@ under the License.
<div id="ConfluenceContent"><p>Routine type conversion in the
framework is transparent. Generally, all you need to do is ensure that HTML
inputs have names that can be used in <a shape="rect" href="ognl.html">OGNL</a>
expressions. (HTML inputs are form elements and other GET/POST parameters.)</p>
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1438273942175 {padding: 0px;}
-div.rbtoc1438273942175 ul {list-style: none;margin-left: 0px;}
-div.rbtoc1438273942175 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1440486120543 {padding: 0px;}
+div.rbtoc1440486120543 ul {list-style: none;margin-left: 0px;}
+div.rbtoc1440486120543 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1438273942175">
+/*]]>*/</style><div class="toc-macro rbtoc1440486120543">
<ul class="toc-indentation"><li><span class="TOCOutline">1</span> <a
shape="rect" href="#TypeConversion-BuiltinTypeConversionSupport">Built in Type
Conversion Support</a></li><li><span class="TOCOutline">2</span> <a
shape="rect" href="#TypeConversion-RelationshiptoParameterNames">Relationship
to Parameter Names</a></li><li><span class="TOCOutline">3</span> <a
shape="rect" href="#TypeConversion-CreatingaTypeConverter">Creating a Type
Converter</a></li><li><span class="TOCOutline">4</span> <a shape="rect"
href="#TypeConversion-ApplyingaTypeConvertertoanAction">Applying a Type
Converter to an Action</a></li><li><span class="TOCOutline">5</span> <a
shape="rect"
href="#TypeConversion-ApplyingaTypeConvertertoabeanormodel">Applying a Type
Converter to a bean or model</a></li><li><span class="TOCOutline">6</span> <a
shape="rect"
href="#TypeConversion-ApplyingaTypeConverterforanapplication">Applying a Type
Converter for an application</a></li><li><span class="TOCOutline">7</span> <a
shape="r
ect" href="#TypeConversion-ASimpleExample">A Simple Example</a></li><li><span
class="TOCOutline">8</span> <a shape="rect"
href="#TypeConversion-AdvancedTypeConversion">Advanced Type Conversion</a>
<ul class="toc-indentation"><li><span class="TOCOutline">8.1</span> <a
shape="rect" href="#TypeConversion-NullPropertyHandling">Null Property
Handling</a></li><li><span class="TOCOutline">8.2</span> <a shape="rect"
href="#TypeConversion-CollectionandMapSupport">Collection and Map Support</a>
<ul class="toc-indentation"><li><span class="TOCOutline">8.2.1</span> <a
shape="rect"
href="#TypeConversion-Indexingacollectionbyapropertyofthatcollection">Indexing
a collection by a property of that collection</a></li></ul>
@@ -157,7 +157,19 @@ div.rbtoc1438273942175 li {margin-left:
<h2 id="TypeConversion-BuiltinTypeConversionSupport">Built in Type Conversion
Support</h2>
<p>Type Conversion is implemented by XWork.</p>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>
+XWork will automatically handle the most common type conversion for you. This
includes support for converting to
+and from Strings for each of the following:
+</p>
+
+<p></p><ul><li>String</li><li>boolean / Boolean</li><li>char /
Character</li><li>int / Integer, float / Float, long / Long, double /
Double</li><li>dates - uses the SHORT format for the Locale associated with the
current request</li><li>arrays - assuming the individual strings can be
coverted to the individual items</li><li>collections - if not object type can
be determined, it is assumed to be a String and a new ArrayList is
+created</li></ul>
+
+<p></p><p> Note that with arrays the type conversion will defer to the type of
the array elements and try to convert each
+item individually. As with any other type conversion, if the conversion can't
be performed the standard type
+conversion error reporting is used to indicate a problem occurred while
processing the type conversion.
+</p>
+
<ul><li>Enumerations</li><li>BigDecimal and BigInteger</li></ul>
@@ -233,9 +245,51 @@ java.math.BigDecimal = com.acme.MyBigDec
<h2 id="TypeConversion-ASimpleExample">A Simple Example</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p></p><p>
+Type conversion is great for situations where you need to turn a String in to
a more complex object. Because the web
+is type-agnostic (everything is a string in HTTP), Struts 2's type conversion
features are very useful. For instance,
+if you were prompting a user to enter in coordinates in the form of a string
(such as "3, 22"), you could have
+Struts 2 do the conversion both from String to Point and from Point to String.
+</p>
+
+<p></p><p>
+Using this "point" example, if your action (or another compound object in
which you are setting properties on)
+has a corresponding ClassName-conversion.properties file, Struts 2 will use
the configured type converters for
+conversion to and from strings. So turning "3, 22" in to new Point(3, 22) is
done by merely adding the following
+entry to <b>ClassName-conversion.properties</b> (Note that the PointConverter
should impl the TypeConverter
+interface):
+</p>
+<p><b>point = com.acme.PointConverter</b></p>
+
+<p></p><p>
+Your type converter should be sure to check what class type it is being
requested to convert. Because it is used
+for both to and from strings, you will need to split the conversion method in
to two parts: one that turns Strings in
+to Points, and one that turns Points in to Strings.
+</p>
+
+<p></p><p>
+After this is done, you can now reference your point (using <s:property
value="point"/> in JSP or ${point}
+in FreeMarker) and it will be printed as "3, 22" again. As such, if you submit
this back to an action, it will be
+converted back to a Point once again.
+</p>
+
+<p></p><p>
+In some situations you may wish to apply a type converter globally. This can
be done by editing the file
+<b>xwork-conversion.properties</b> in the root of your class path (typically
WEB-INF/classes) and providing a
+property in the form of the class name of the object you wish to convert on
the left hand side and the class name of
+the type converter on the right hand side. For example, providing a type
converter for all Point objects would mean
+adding the following entry:
+</p>
+
+<p></p><p><b>com.acme.Point = com.acme.PointConverter</b></p>
+
<div class="confluence-information-macro
confluence-information-macro-note"><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body">
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span>
</div></div></div>
+<p></p><p>
+Type conversion should not be used as a substitute for i18n. It is not
recommended to use this feature to print out
+properly formatted dates. Rather, you should use the i18n features of Struts 2
(and consult the JavaDocs for JDK's
+MessageFormat object) to see how a properly formatted date should be displayed.
+</p></div></div>
<p>The framework ships with a base helper class that simplifies converting to
and from Strings, <code>org.apache.struts2.util.StrutsTypeConverter</code>. The
helper class makes it easy to write type converters that handle converting
objects to Strings as well as from Strings.</p>
<p>From the JavaDocs:</p>
@@ -264,15 +318,43 @@ preferable a TypeConversionException.
<h3 id="TypeConversion-NullPropertyHandling">Null Property Handling</h3>
<p>Null property handling will automatically create objects where null
references are found.</p>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>
+Provided that the key ReflectionContextState#CREATE_NULL_OBJECTS is in the
action context with a value of true (this key is set
+only during the execution of the
com.opensymphony.xwork2.interceptor.ParametersInterceptor), OGNL expressions
+that have caused a NullPointerException will be temporarily stopped for
evaluation while the system automatically
+tries to solve the null references by automatically creating the object.
+</p>
+
+<p></p><p>The following rules are used when handling null references:</p>
+
+<p></p><ul><li>If the property is declared <i>exactly</i> as a Collection or
List, then an ArrayList shall be
+returned and assigned to the null references.</li><li>If the property is
declared as a Map, then a HashMap will be returned and assigned to the null
+references.</li><li>If the null property is a simple bean with a no-arg
constructor, it will simply be created using the {@link
+ObjectFactory#buildBean(java.lang.Class, java.util.Map)} method.</li></ul>
+
+<p></p><p>
+For example, if a form element has a text field named <b>person.name</b> and
the expression <i>person</i> evaluates
+to null, then this class will be invoked. Because the <i>person</i> expression
evaluates to a <i>Person</i> class, a
+new Person is created and assigned to the null reference. Finally, the name is
set on that object and the overall
+effect is that the system automatically created a Person object for you, set
it by calling setUsers() and then
+finally called getUsers().setName() as you would typically expect.
+</p>
<h3 id="TypeConversion-CollectionandMapSupport">Collection and Map Support</h3>
<p>Collection and Map support provides intelligent null handling and type
conversion for Java Collections.</p>
<p>The framework supports ways to discover the object type for elements in a
collection. The discover is made via an <em>ObjectTypeDeterminer</em>. A
default implementation is provided with the framework. The Javadocs explain how
Map and Collection support is discovered in the
<code>DefaultObjectTypeDeterminer</code>.</p>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p>This ObjectTypeDeterminer looks at the <b>Class-conversion.properties</b>
for entries that indicated what
+objects are contained within Maps and Collections. For Collections, such as
Lists, the element is specified using the
+pattern <b>Element_xxx</b>, where xxx is the field name of the collection
property in your action or object. For
+Maps, both the key and the value may be specified by using the pattern
<b>Key_xxx</b> and <b>Element_xxx</b>,
+respectively.</p>
+
+<p></p><p> From WebWork 2.1.x, the <b>Collection_xxx</b> format is still
supported and honored, although it is deprecated
+and will be removed eventually.</p>
+
<p>Additionally, you can create your own custom
<code>ObjectTypeDeterminer</code> by implementing the
<code>ObjectTypeDeterminer</code> interface. There is also an optional
ObjectTypeDeterminer that utilizes Java 5 generics. See the <a shape="rect"
href="annotations.html">Annotations</a> page for more information.</p>
<h4
id="TypeConversion-Indexingacollectionbyapropertyofthatcollection">Indexing a
collection by a property of that collection</h4>
@@ -407,7 +489,26 @@ CreateIfNull_beanList=true
<h2 id="TypeConversion-TypeConversionErrorHandling">Type Conversion Error
Handling</h2>
<p>Type conversion error handling provides a simple way to distinguish between
an input <em>validation</em> problem and an input <em>type conversion</em>
problem.</p>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>
+Any error that occurs during type conversion may or may not wish to be
reported. For example, reporting that the
+input "abc" could not be converted to a number might be important. On the
other hand, reporting that an empty string,
+"", cannot be converted to a number might not be important - especially in a
web environment where it is hard to
+distinguish between a user not entering a value vs. entering a blank value.
+</p>
+<p> By default, all conversion errors are reported using the generic i18n key
<b>xwork.default.invalid.fieldvalue</b>,
+which you can override (the default text is <i>Invalid field value for field
"xxx"</i>, where xxx is the field name)
+in your global i18n resource bundle.
+</p>
+
+<p></p><p>However, sometimes you may wish to override this message on a
per-field basis. You can do this by adding an i18n
+key associated with just your action (Action.properties) using the pattern
<b>invalid.fieldvalue.xxx</b>, where xxx
+is the field name.
+</p>
+
+<p></p><p>It is important to know that none of these errors are actually
reported directly. Rather, they are added to a map
+called <i>conversionErrors</i> in the ActionContext. There are several ways
this map can then be accessed and the
+errors can be reported accordingly.
+</p>
<p>There are two ways the error reporting can occur:</p>
<ol><li>Globally, using the <a shape="rect"
href="conversion-error-interceptor.html">Conversion Error
Interceptor</a></li><li>On a per-field basis, using the <a shape="rect"
href="conversion-validator.html">conversion validator</a></li></ol>
Modified: websites/production/struts/content/docs/typeconversion-annotation.html
==============================================================================
--- websites/production/struts/content/docs/typeconversion-annotation.html
(original)
+++ websites/production/struts/content/docs/typeconversion-annotation.html Tue
Aug 25 07:18:20 2015
@@ -138,19 +138,71 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent"><p>This annotation is used for class
and application wide conversion rules.</p>
+
+<p></p><p>
+Class wide conversion:<br clear="none">
+The conversion rules will be assembled in a file called
<code>XXXAction-conversion.properties</code>
+within the same package as the related action class.
+Set type to: <code>type = ConversionType.CLASS</code>
+</p>
+
+<p></p><p>
+Application wide conversion:<br clear="none">
+The conversion rules will be assembled within the
<code>xwork-conversion.properties</code> file within the classpath root.
+Set type to: <code>type = ConversionType.APPLICATION</code>
+</p>
<h2 id="TypeConversionAnnotation-Usage">Usage</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>The TypeConversion annotation can be applied at property and method
level.</p>
<h2 id="TypeConversionAnnotation-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p><table summary=""><thead><tr><th colspan="1" rowspan="1">Parameter</th><th
colspan="1" rowspan="1">Required</th><th colspan="1"
rowspan="1">Default</th><th colspan="1"
rowspan="1">Description</th></tr></thead><tbody><tr><td colspan="1"
rowspan="1">key</td><td colspan="1" rowspan="1">no</td><td colspan="1"
rowspan="1">The annotated property/key name</td><td colspan="1" rowspan="1">The
optional property name mostly used within TYPE level
annotations.</td></tr><tr><td colspan="1" rowspan="1">type</td><td colspan="1"
rowspan="1">no</td><td colspan="1" rowspan="1">ConversionType.CLASS</td><td
colspan="1" rowspan="1">Enum value of ConversionType. Determines whether the
conversion should be applied at application or class level.</td></tr><tr><td
colspan="1" rowspan="1">rule</td><td colspan="1" rowspan="1">no</td><td
colspan="1" rowspan="1">ConversionRule.PROPERTY</td><td colspan="1"
rowspan="1">Enum value of ConversionRule. The ConversionRule can be a property,
a Collection or a Map.</
td></tr><tr><td colspan="1" rowspan="1">converter</td><td colspan="1"
rowspan="1">either this or value</td><td colspan="1" rowspan="1"> </td><td
colspan="1" rowspan="1">The class name of the TypeConverter to be used as
converter.</td></tr><tr><td colspan="1" rowspan="1">value</td><td colspan="1"
rowspan="1">either converter or this</td><td colspan="1"
rowspan="1"> </td><td colspan="1" rowspan="1">The value to set for
ConversionRule.KEY_PROPERTY.</td></tr></tbody></table></p>
+
<h2 id="TypeConversionAnnotation-Examples">Examples</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+@Conversion()
+public class ConversionAction implements Action {
+
+ private String convertInt;
+
+ private String convertDouble;
+ private List users = null;
+
+ private HashMap keyValues = null;
+
+ @TypeConversion(type = ConversionType.APPLICATION, converter =
"com.opensymphony.xwork2.util.XWorkBasicConverter")
+ public void setConvertInt( String convertInt ) {
+ this.convertInt = convertInt;
+ }
+
+ @TypeConversion(converter =
"com.opensymphony.xwork2.util.XWorkBasicConverter")
+ public void setConvertDouble( String convertDouble ) {
+ this.convertDouble = convertDouble;
+ }
+
+ @TypeConversion(rule = ConversionRule.COLLECTION, converter =
"java.util.String")
+ public void setUsers( List users ) {
+ this.users = users;
+ }
+
+ @TypeConversion(rule = ConversionRule.MAP, converter =
"java.math.BigInteger")
+ public void setKeyValues( HashMap keyValues ) {
+ this.keyValues = keyValues;
+ }
+
+ @TypeConversion(type = ConversionType.APPLICATION, property =
"java.util.Date", converter =
"com.opensymphony.xwork2.util.XWorkBasicConverter")
+ public String execute() throws Exception {
+ return SUCCESS;
+ }
+}
+]]></script>
+</div></div></div>
</div>
Modified:
websites/production/struts/content/docs/using-freemarker-templates.html
==============================================================================
--- websites/production/struts/content/docs/using-freemarker-templates.html
(original)
+++ websites/production/struts/content/docs/using-freemarker-templates.html Tue
Aug 25 07:18:20 2015
@@ -141,11 +141,11 @@ under the License.
<div id="ConfluenceContent"><p><a shape="rect"
class="external-link" href="http://freemarker.sourceforge.net/"
rel="nofollow">FreeMarker</a> is a Java-based template engine that is a great
alternative to <a shape="rect" href="jsp.html">JSP</a>. FreeMarker is ideal for
situations where your action results can possibly be loaded from outside a
Servlet container. For example, if you wished to support plugins in your
application, you might wish to use FreeMarker so that the plugins could provide
the entire action class and view in a single jar that is loaded from the
classloader.</p>
<style type="text/css">/*<![CDATA[*/
-div.rbtoc1438274239530 {padding: 0px;}
-div.rbtoc1438274239530 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1438274239530 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1440486450795 {padding: 0px;}
+div.rbtoc1440486450795 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1440486450795 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style><div class="toc-macro rbtoc1438274239530">
+/*]]>*/</style><div class="toc-macro rbtoc1440486450795">
<ul class="toc-indentation"><li><a shape="rect"
href="#UsingFreemarkerTemplates-Configureyouractiontousethe"freemarker"resulttype">Configure
your action to use the "freemarker" result type</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-Usingproperties">Using
properties</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-Servlet/JSPScopedObjects">Servlet / JSP Scoped
Objects</a>
<ul class="toc-indentation"><li><a shape="rect"
href="#UsingFreemarkerTemplates-ApplicationScopeAttribute">Application Scope
Attribute</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-SessionScopeAttribute">Session Scope
Attribute</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-RequestScopeAttribute">Request Scope
Attribute</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-RequestParameter">Request
Parameter</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-Contextparameter">Context
parameter</a></li></ul>
</li><li><a shape="rect"
href="#UsingFreemarkerTemplates-TemplateLoading">Template
Loading</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-VariableResolution">Variable
Resolution</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-FreeMarkerconfiguration">FreeMarker
configuration</a></li><li><a shape="rect"
href="#UsingFreemarkerTemplates-Tags">Tags</a>
Modified: websites/production/struts/content/docs/validation-annotation.html
==============================================================================
--- websites/production/struts/content/docs/validation-annotation.html
(original)
+++ websites/production/struts/content/docs/validation-annotation.html Tue Aug
25 07:18:20 2015
@@ -138,15 +138,16 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent"><p>This annotation has been deprecated
since 2.1 as its previous purpose, to define classes that support annotation
validations,
+is no longer necessary.</p>
<h2 id="ValidationAnnotation-Usage">Usage</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<p></p><p>The Validation annotation must be applied at Type level.</p>
<h2 id="ValidationAnnotation-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<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">validations</td><td colspan="1" rowspan="1"
class="confluenceTd">yes</td><td colspan="1" rowspan="1"
class="confluenceTd"> </td><td colspan="1" rowspan="1"
class="confluenceTd"></td></tr></table></p>
<h2 id="ValidationAnnotation-Examples">Examples</h2>
@@ -154,9 +155,69 @@ under the License.
<ul><li>Mark the interface with @Validation()</li><li>Apply standard or custom
annoations at method level</li></ul>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<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[
+@Validation()
+public interface AnnotationDataAware {
+
+ void setBarObj(Bar b);
+
+ Bar getBarObj();
+
+ @RequiredFieldValidator(message = "You must enter a value for
data.")
+ @RequiredStringValidator(message = "You must enter a value for
data.")
+ void setData(String data);
+
+ String getData();
+}
+]]></script>
+</div></div>
<p><strong>An Annotated Class</strong></p>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+<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[
+@Validation()
+public class SimpleAnnotationAction extends ActionSupport {
+
+ @RequiredFieldValidator(type = ValidatorType.FIELD, message = "You
must enter a value for bar.")
+ @IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6",
max = "10", message = "bar must be between ${min} and ${max},
current value is ${bar}.")
+ public void setBar(int bar) {
+ this.bar = bar;
+ }
+
+ public int getBar() {
+ return bar;
+ }
+
+ @Validations(
+ requiredFields =
+ {@RequiredFieldValidator(type = ValidatorType.SIMPLE,
fieldName = "customfield", message = "You must enter a value for
field.")},
+ requiredStrings =
+ {@RequiredStringValidator(type = ValidatorType.SIMPLE,
fieldName = "stringisrequired", message = "You must enter a
value for string.")},
+ emails =
+ { @EmailValidator(type = ValidatorType.SIMPLE, fieldName =
"emailaddress", message = "You must enter a value for
email.")},
+ urls =
+ { @UrlValidator(type = ValidatorType.SIMPLE, fieldName =
"hreflocation", message = "You must enter a value for
email.")},
+ stringLengthFields =
+ {@StringLengthFieldValidator(type = ValidatorType.SIMPLE,
trim = true, minLength="10" , maxLength = "12", fieldName =
"needstringlength", message = "You must enter a
stringlength.")},
+ intRangeFields =
+ { @IntRangeFieldValidator(type = ValidatorType.SIMPLE,
fieldName = "intfield", min = "6", max = "10",
message = "bar must be between ${min} and ${max}, current value is
${bar}.")},
+ dateRangeFields =
+ {@DateRangeFieldValidator(type = ValidatorType.SIMPLE,
fieldName = "datefield", min = "-1", max = "99",
message = "bar must be between ${min} and ${max}, current value is
${bar}.")},
+ expressions = {
+ @ExpressionValidator(expression = "foo > 1",
message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar =
${bar}."),
+ @ExpressionValidator(expression = "foo > 2",
message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar =
${bar}."),
+ @ExpressionValidator(expression = "foo > 3",
message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar =
${bar}."),
+ @ExpressionValidator(expression = "foo > 4",
message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar =
${bar}."),
+ @ExpressionValidator(expression = "foo > 5",
message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar =
${bar}.")
+ }
+ )
+ public String execute() throws Exception {
+ return SUCCESS;
+ }
+}
+
+]]></script>
+</div></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>When multiple methods are used to map different actions on the same class,
and one of them is annotated with <em>@Validations</em>, those validators will
be triggered for all the actions, unless they are annotated with
@SkipValidation or <em>validateAnnotatedMethodOnly</em> is set to <em>true</em>
in the "validation" interceptor, like:</p>
Modified: websites/production/struts/content/docs/validation-interceptor.html
==============================================================================
--- websites/production/struts/content/docs/validation-interceptor.html
(original)
+++ websites/production/struts/content/docs/validation-interceptor.html Tue Aug
25 07:18:20 2015
@@ -138,19 +138,86 @@ under the License.
<div class="pagecontent">
<div class="wiki-content">
- <div id="ConfluenceContent"><div class="error"><span
class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+ <div id="ConfluenceContent">
+<p></p><p>
+This interceptor runs the action through the standard validation framework,
which in turn checks the action against
+any validation rules (found in files such as
<i>ActionClass-validation.xml</i>) and adds field-level and action-level
+error messages (provided that the action implements ValidationAware). This
interceptor
+is often one of the last (or second to last) interceptors applied in a stack,
as it assumes that all values have
+already been set on the action.
+</p>
+
+<p></p><p>
+This interceptor does nothing if the name of the method being invoked is
specified in the <b>excludeMethods</b>
+parameter. <b>excludeMethods</b> accepts a comma-delimited list of method
names. For example, requests to
+<b>foo!input.action</b> and <b>foo!back.action</b> will be skipped by this
interceptor if you set the
+<b>excludeMethods</b> parameter to "input, back".
+</p>
+
+<p></p><p>
+The workflow of the action request does not change due to this interceptor.
Rather,
+this interceptor is often used in conjunction with the <b>workflow</b>
interceptor.
+</p>
+
+<p></p><p>
+<b>NOTE:</b> As this method extends off MethodFilterInterceptor, it is capable
of
+deciding if it is applicable only to selective methods in the action class. See
+<code>MethodFilterInterceptor</code> for more info.
+</p>
+
<h2 id="ValidationInterceptor-Parameters">Parameters</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p></p><ul></ul><p></p><ul><li>alwaysInvokeValidate - Defaults to true. If
true validate() method will always
+be invoked, otherwise it will not.</li></ul><p></p><ul><li>programmatic -
Defaults to true. If true and the action is Validateable call validate(),
+and any method that starts with "validate".
+</li></ul><p></p><ul><li>declarative - Defaults to true. Perform validation
based on xml or annotations.</li></ul><p></p>
+
<h2 id="ValidationInterceptor-ExtendingtheInterceptor">Extending the
Interceptor</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div>
+
+<p>There are no known extension points for this interceptor.</p>
+
<h2 id="ValidationInterceptor-Examples">Examples</h2>
-<div class="error"><span class="error">Error formatting macro: snippet:
java.lang.IndexOutOfBoundsException: Index: 20, Size: 20</span> </div></div>
+<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[
+
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="params"/>
+ <interceptor-ref name="validation"/>
+ <interceptor-ref name="workflow"/>
+ <result name="success">good_result.ftl</result>
+</action>
+
+<-- in the following case myMethod of the action class will not
+ get validated -->
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="params"/>
+ <interceptor-ref name="validation">
+ <param name="excludeMethods">myMethod</param>
+ </interceptor-ref>
+ <interceptor-ref name="workflow"/>
+ <result name="success">good_result.ftl</result>
+</action>
+
+<-- in the following case only annotated methods of the action class will
+ be validated -->
+<action name="someAction"
class="com.examples.SomeAction">
+ <interceptor-ref name="params"/>
+ <interceptor-ref name="validation">
+ <param
name="validateAnnotatedMethodOnly">true</param>
+ </interceptor-ref>
+ <interceptor-ref name="workflow"/>
+ <result name="success">good_result.ftl</result>
+</action>
+
+
+]]></script>
+</div></div></div>
</div>