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/06/12 19:03:29 UTC

[3/9] struts-site git commit: Converts Core Developers guide into MD

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/static-content.md
----------------------------------------------------------------------
diff --git a/source/core-developers/static-content.md b/source/core-developers/static-content.md
new file mode 100644
index 0000000..4d1ad28
--- /dev/null
+++ b/source/core-developers/static-content.md
@@ -0,0 +1,93 @@
+---
+layout: core-developers
+title: Static Content
+---
+
+# Static Content
+
+Struts can serve static content like css and javascript files\. This feature is enabled by default, but can be disabled by setting:
+
+
+~~~~~~~
+
+<constant name="struts.serve.static" value="false" />
+
+~~~~~~~
+
+
+> 
+
+> 
+
+> If you disable this feature, but use the xhtml, or css\_xhtml theme, make sure that the javascript and css files shipped inside the core jar are extracted to your web application directory\.
+
+> 
+
+#####Custom Static Content Loaders#####
+
+Static content is served by an implementation of 
+
+~~~~~~~
+org.apache.struts2.dispatcher.StaticContentLoader
+~~~~~~~
+\. To write your own 
+
+~~~~~~~
+StaticContentLoader
+~~~~~~~
+, implement 
+
+~~~~~~~
+StaticContentLoader
+~~~~~~~
+ and define a bean for the class:
+
+
+~~~~~~~
+
+<bean type="org.apache.struts2.dispatcher.StaticContentLoader" class="MyStaticContentLoader" name="myLoader" />
+<constant name="struts.staticContentLoader" value="myLoader" />
+
+~~~~~~~
+
+#####Default Content Loader#####
+
+Struts provides a default implementation of 
+
+~~~~~~~
+StaticContentLoader
+~~~~~~~
+ which is 
+
+~~~~~~~
+org.apache.struts2.dispatcher.DefaultStaticContentLoader
+~~~~~~~
+\. This loader will handle urls that start with "/static/"\. 
+
+This content loader can serve static content from the classpath, so when writing a plugin, you can put a file inside your plugin's jar like "/static/image/banner\.jpg" and it will be served when the url "/static/image/banner\.jpg" is requested\. 
+
+
+
+| This loader is not optimized to handle static content, and to improve performance, it is recommended that you extract your static content to the web application directory, and let the container handle them\.
+
+| 
+
+#####Preventing Struts from Handling a Request#####
+
+If there is a request that Struts is handling as an action, and you wish to make Struts ignore it, you can do so by specifying a comma separated list of regular expressions like:
+
+
+~~~~~~~
+
+<constant name="struts.action.excludePattern" value="/some/conent/.*?" />
+
+~~~~~~~
+
+These regular expression will be evaluated against the request's URI (
+
+~~~~~~~
+HttpServletRequest.getRequestURI()
+~~~~~~~
+), and if any of them matches, then Struts will not handle the request\.
+
+To evaluate each pattern Pattern class from JDK will be used, you can find more about what kind of pattern you can use in the [Pattern class JavaDoc](http://docs\.oracle\.com/javase/1\.5\.0/docs/api/java/util/regex/Pattern\.html)^[http://docs\.oracle\.com/javase/1\.5\.0/docs/api/java/util/regex/Pattern\.html]\.

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/static-parameters-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/static-parameters-interceptor.md b/source/core-developers/static-parameters-interceptor.md
new file mode 100644
index 0000000..1d33257
--- /dev/null
+++ b/source/core-developers/static-parameters-interceptor.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: Static Parameters Interceptor
+---
+
+# Static Parameters Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.interceptor.StaticParametersInterceptor}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.interceptor.StaticParametersInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=com.opensymphony.xwork2.interceptor.StaticParametersInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.interceptor.StaticParametersInterceptor}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/stream-result.md
----------------------------------------------------------------------
diff --git a/source/core-developers/stream-result.md b/source/core-developers/stream-result.md
new file mode 100644
index 0000000..c5abb4b
--- /dev/null
+++ b/source/core-developers/stream-result.md
@@ -0,0 +1,158 @@
+---
+layout: core-developers
+title: Stream Result
+---
+
+# Stream Result
+
+A custom Result type for sending raw data (via an InputStream) directly to the HttpServletResponse\. Very useful for allowing users to download content\.
+
+
+
+| If you are running your app server under HTTPS and having issues with PDF's or other file streams you should take a look at [HTTPS and IE Issues](https-and-ie-issues.html)
+
+| 
+
+####Parameters####
+
++ **contentType** \- the stream mime\-type as sent to the web browser (default = 
+
+~~~~~~~
+text/plain
+~~~~~~~
+)\.
+
++ **contentLength** \- the stream length in bytes (the browser displays a progress bar)\.
+
++ **contentDisposition** \- the content disposition header value for specifying the file name (default = 
+
+~~~~~~~
+inline
+~~~~~~~
+, values are typically _attachment;filename="document\.pdf"_ \.
+
++ **inputName **\- the name of the InputStream property from the chained action (default = **inputStream**)\.
+
++ **bufferSize **\- the size of the buffer to copy from input to output (default = 
+
+~~~~~~~
+1024
+~~~~~~~
+)\.
+
++ **allowCaching** \- if set to 'false' it will set the headers 
+
+~~~~~~~
+Pragma
+~~~~~~~
+ and 
+
+~~~~~~~
+Cache-Control
+~~~~~~~
+ to 
+
+~~~~~~~
+no-cahce
+~~~~~~~
+, and prevent client from caching the content (default = 
+
+~~~~~~~
+true
+~~~~~~~
+)\.
+
++ **contentCharSet** \- if set to a string, ';charset=value' will be added to the content\-type header, where value is the string set\. If set to an expression, the result of evaluating the expression will be used\. If not set, then no charset will be set on the header
+
+These parameters can also be set by exposing a similarly named getter method on your Action\. For example, you can provide 
+
+~~~~~~~
+getContentType()
+~~~~~~~
+ to override that parameter for the current action\. To do it you you must explicitly define this param as an expression i\.e\.
+
+**parameter defined as an expression**
+
+
+~~~~~~~
+<param name="contentType">${contentType}</param>
+~~~~~~~
+
+
+
+| Please be aware that this was changed since Struts 2\.5\.2, previously each parameter was automagically resolved by looking throughout the ValueStack, now you must explicitly define wich parameter must be evaluated, even inputName\.
+
+| 
+
+####Examples####
+
+#####Annotation based Configuration#####
+
+To configure Actions and Results with Annotations you need to activate the Struts2 _Convention Plugin_  in your Struts2 application\.
+
+
+~~~~~~~
+package com.mycompany.webapp.actions;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+import org.apache.struts2.convention.annotation.Result;
+
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionSupport;
+
+@Result(
+	name = "success", 
+	type = "stream", 
+	params = { 
+		"contentType", "${type}", 
+		"inputName", "${stream}", 
+		"bufferSize", "1024", 
+		"contentDisposition", "attachment;filename=\"${filename}\"" 
+	}
+)
+public class FileDisplay extends ActionSupport {
+
+	private String type = "image/jpeg";
+	private String filename;
+	private InputStream stream;
+
+	public String execute() throws Exception {
+
+		filename = "myimage.jpg";
+		File img = new File("/path/to/image/image.jpg");
+		stream = new FileInputStream(img);
+
+		return Action.SUCCESS;
+	}
+	
+	private String getType() {
+		return this.type;
+	}
+	
+	private String getFilename() {
+		return this.filename;
+	}
+	
+	private String getStream() {
+		return this.stream;
+	}
+}
+
+~~~~~~~
+
+#####XML based Configuration#####
+
+**Example configuration**
+
+
+~~~~~~~
+<result name="success" type="stream">
+  <param name="contentType">image/jpeg</param>
+  <param name="inputName">${imageStream}</param>
+  <param name="contentDisposition">attachment;filename="document.pdf"</param>
+  <param name="bufferSize">1024</param>
+</result>
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/string-length-field-validator-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/string-length-field-validator-annotation.md b/source/core-developers/string-length-field-validator-annotation.md
new file mode 100644
index 0000000..29badcc
--- /dev/null
+++ b/source/core-developers/string-length-field-validator-annotation.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: StringLengthFieldValidator Annotation
+---
+
+# StringLengthFieldValidator Annotation
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator}
+~~~~~~~
+
+#####Usage#####
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/stringlength-validator.md
----------------------------------------------------------------------
diff --git a/source/core-developers/stringlength-validator.md b/source/core-developers/stringlength-validator.md
new file mode 100644
index 0000000..bcc9088
--- /dev/null
+++ b/source/core-developers/stringlength-validator.md
@@ -0,0 +1,35 @@
+---
+layout: core-developers
+title: stringlength validator
+---
+
+# stringlength validator
+
+####Description####
+
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator}
+~~~~~~~
+
+####Parameters####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator}
+~~~~~~~
+
+**(\!) Warning**
+
+
+> \{snippet:id=parameters\-warning|javadoc=true|url=com\.opensymphony\.xwork2\.validator\.validators\.StringLengthFieldValidator\}
+
+####Examples####
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=xml|url=com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/struts-default-vm.md
----------------------------------------------------------------------
diff --git a/source/core-developers/struts-default-vm.md b/source/core-developers/struts-default-vm.md
new file mode 100644
index 0000000..a4775fa
--- /dev/null
+++ b/source/core-developers/struts-default-vm.md
@@ -0,0 +1,38 @@
+---
+layout: core-developers
+title: struts-default.vm
+---
+
+# struts-default.vm
+
+If Velocity is being use, the 
+
+~~~~~~~
+struts-default.vm
+~~~~~~~
+ supplies some VelocityMacros that might be useful\.
+
+**struts\-default\.vm**
+
+
+~~~~~~~
+
+#macro(bean $bean_name $name)
+   #set ($name = $action.bean($bean_name))
+#end
+
+#macro(includeservlet $name)
+  $action.include($name,$req,$res)
+#end
+
+#macro(url $name)
+   #set ($name = $action.bean("org.apache.struts.util.URLBean"))
+   $name.setRequest($req)
+   $name.setResponse($res)
+#end
+
+#macro(property $object $property)
+$!{ognl.findValue($property, $object)}
+#end
+
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/struts-default-xml.md
----------------------------------------------------------------------
diff --git a/source/core-developers/struts-default-xml.md b/source/core-developers/struts-default-xml.md
new file mode 100644
index 0000000..9b65c14
--- /dev/null
+++ b/source/core-developers/struts-default-xml.md
@@ -0,0 +1,38 @@
+---
+layout: core-developers
+title: struts-default.xml
+---
+
+# struts-default.xml
+
+A base configuration file named 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+ is included in the 
+
+~~~~~~~
+struts2.jar
+~~~~~~~
+ file\. This file is automatically included into 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+ file to provide the standard configuration settings without having to copy them\.
+
+
+
+| To exclude the struts\-default\.xml or to provide your own version, see the struts\.configuration\.files setting in [struts.properties](struts-properties.html)\.
+
+| 
+
+The contents of struts\-default\.xml are here:
+
+
+~~~~~~~
+{snippet:id=all|lang=xml|url=struts2/core/src/main/resources/struts-default.xml}
+~~~~~~~
+
+This file defines all of the default bundled results and interceptors and many interceptor stacks which you can use either as\-is or as a basis for your own application\-specific interceptor stacks\. **Notice the name of the package is "struts\-default"**\.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/struts-properties.md
----------------------------------------------------------------------
diff --git a/source/core-developers/struts-properties.md b/source/core-developers/struts-properties.md
new file mode 100644
index 0000000..b0bc6df
--- /dev/null
+++ b/source/core-developers/struts-properties.md
@@ -0,0 +1,37 @@
+---
+layout: core-developers
+title: struts.properties
+---
+
+# struts.properties
+
+ (ok)  All properties can also be set using [Constant Configuration](#PAGE_29602) in an XML configuration file\.
+
+The framework uses a number of properties that can be changed to fit your needs\. To change any of these properties, specify the property key and value in an 
+
+~~~~~~~
+struts.properties
+~~~~~~~
+ file\. The properties file can be locate anywhere on the classpath, but it is typically found under 
+
+~~~~~~~
+/WEB-INF/classes
+~~~~~~~
+
+The list of properties can be found in 
+
+~~~~~~~
+struts-default.properties
+~~~~~~~
+ (inside 
+
+~~~~~~~
+struts2.jar
+~~~~~~~
+)\.
+
+**struts\-default\.properties**
+
+
+> \{snippet:lang=none|id=complete\_file|url=struts2/core/src/main/resources/org/apache/struts2/default\.properties\}
+

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/struts-xml.md
----------------------------------------------------------------------
diff --git a/source/core-developers/struts-xml.md b/source/core-developers/struts-xml.md
new file mode 100644
index 0000000..de06daa
--- /dev/null
+++ b/source/core-developers/struts-xml.md
@@ -0,0 +1,30 @@
+---
+layout: core-developers
+title: struts.xml
+---
+
+# struts.xml
+
+The core configuration file for the framework is the default (
+
+~~~~~~~
+struts.xml
+~~~~~~~
+) file and should reside on the classpath of the webapp (generally 
+
+~~~~~~~
+/WEB-INF/classes
+~~~~~~~
+)\.
+
++ The default file may include other configuration files as needed\.
+
++ A 
+
+~~~~~~~
+struts-plugin.xml
+~~~~~~~
+ file can be placed in a JAR and automatically plugged into an application, so that modules can be self\-contained and automatically configured\.
+	
+
+  + In the case of Freemarker and Velocity modules, the templates can also be loaded from the classpath, so the entire module can be plugged in as a single JAR\.

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/sunone-7-0.md
----------------------------------------------------------------------
diff --git a/source/core-developers/sunone-7-0.md b/source/core-developers/sunone-7-0.md
new file mode 100644
index 0000000..c855143
--- /dev/null
+++ b/source/core-developers/sunone-7-0.md
@@ -0,0 +1,53 @@
+---
+layout: core-developers
+title: SunOne 7.0
+---
+
+# SunOne 7.0
+
+To use SunOne wkith the framework, you will need to grant the appropriate permissions\. You can simply grant all permissions, or just the specific permissions the framework needs\.
+
+#####Granting All Permissions#####
+
+
+
+~~~~~~~
+
+grant {
+	permission java.security.AllPermission;
+};
+
+~~~~~~~
+
+#####Granting Specific Permissions#####
+
++ Grant Write Permissions to 
+
+~~~~~~~
+java.util.PropertyPermission
+~~~~~~~
+
++ Add 
+
+~~~~~~~
+java.lang.reflect.ReflectPermission
+~~~~~~~
+ "suppressAccessChecks"
+
++ Grant all permissions to 
+
+~~~~~~~
+OgnlInvokePermission
+~~~~~~~
+
+
+
+~~~~~~~
+
+grant {
+	permission java.util.PropertyPermission "*", "read, write";
+	permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
+	permission ognl.OgnlInvokePermission "*";
+};
+
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/timer-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/timer-interceptor.md b/source/core-developers/timer-interceptor.md
new file mode 100644
index 0000000..a7e059d
--- /dev/null
+++ b/source/core-developers/timer-interceptor.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: Timer Interceptor
+---
+
+# Timer Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.interceptor.TimerInterceptor}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.interceptor.TimerInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=com.opensymphony.xwork2.interceptor.TimerInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.interceptor.TimerInterceptor}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/token-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/token-interceptor.md b/source/core-developers/token-interceptor.md
new file mode 100644
index 0000000..6dab330
--- /dev/null
+++ b/source/core-developers/token-interceptor.md
@@ -0,0 +1,37 @@
+---
+layout: core-developers
+title: Token Interceptor
+---
+
+# Token Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=org.apache.struts2.interceptor.TokenInterceptor}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=org.apache.struts2.interceptor.TokenInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=org.apache.struts2.interceptor.TokenInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=org.apache.struts2.interceptor.TokenInterceptor}
+~~~~~~~
+

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/token-session-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/token-session-interceptor.md b/source/core-developers/token-session-interceptor.md
new file mode 100644
index 0000000..7b1bf2b
--- /dev/null
+++ b/source/core-developers/token-session-interceptor.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: Token Session Interceptor
+---
+
+# Token Session Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=org.apache.struts2.interceptor.TokenSessionStoreInterceptor}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=org.apache.struts2.interceptor.TokenSessionStoreInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=org.apache.struts2.interceptor.TokenSessionStoreInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=org.apache.struts2.interceptor.TokenSessionStoreInterceptor}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/type-conversion-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/type-conversion-annotation.md b/source/core-developers/type-conversion-annotation.md
new file mode 100644
index 0000000..e14dc6b
--- /dev/null
+++ b/source/core-developers/type-conversion-annotation.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: TypeConversion Annotation
+---
+
+# TypeConversion Annotation
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.conversion.annotations.TypeConversion}
+~~~~~~~
+
+#####Usage#####
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.conversion.annotations.TypeConversion}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.conversion.annotations.TypeConversion}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.conversion.annotations.TypeConversion}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/type-conversion.md
----------------------------------------------------------------------
diff --git a/source/core-developers/type-conversion.md b/source/core-developers/type-conversion.md
new file mode 100644
index 0000000..6fbe165
--- /dev/null
+++ b/source/core-developers/type-conversion.md
@@ -0,0 +1,533 @@
+---
+layout: core-developers
+title: Type Conversion
+---
+
+# Type Conversion
+
+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 _OGNL_  expressions\. (HTML inputs are form elements and other GET/POST parameters\.)
+
+####Built in Type Conversion Support####
+
+Type Conversion is implemented by XWork\.
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter}
+~~~~~~~
+
++ Enumerations
+
++ BigDecimal and BigInteger
+
+####Relationship to Parameter Names####
+
+There is no need to capture form values using intermediate Strings and primitives\. Instead, the framework can read from and write to properties of objects addressed via OGNL expressions and perform the appropriate type conversion for you\.
+
+Here are some tips for leveraging the framework's type conversion capabilities:
+
++ Use OGNL expressions \- the framework will automatically take care of creating the actual objects for you\.
+
++ Use JavaBeans\! The framework can only create objects that obey the JavaBean specification, provide no\-arg constructions and include getters and setters where appropriate\.
+
++ Remember that _person\.name_  will call **getPerson()\.setName()**\.  If the framework creates the Person object for you, it remember that a 
+
+~~~~~~~
+setPerson
+~~~~~~~
+ method must also exist\.
+
++ The framework will not instantiate an object if an instance already exists\.  The PrepareInterceptor or action's constructor can be used to create target objects before type conversion\.
+
++ For lists and maps, use index notation, such as _people\[0\]\.name_  or _friends\['patrick'\]\.name_ \. Often these HTML form elements are being rendered inside a loop\. For _JSP Tags_ , use the iterator tag's status attribute\. For _FreeMarker Tags_ , use the special property \$\{foo\_index\}\[\]\.
+
++ For multiple select boxes, it isn't possible to use index notation to name each individual item\. Instead, name your element _people\.name_  and the framework will understand that it should create a new Person object for each selected item and set its name accordingly\.
+
+####Creating a Type Converter####
+
+Create a type converter by extending StrutsTypeConverter\.  The Converter's role is to convert a String to an Object and an Object to a String\.
+
+
+~~~~~~~
+
+ public class MyConverter extends StrutsTypeConverter {
+    public Object convertFromString(Map context, String[] values, Class toClass) {
+       .....
+    }
+
+    public String convertToString(Map context, Object o) {
+       .....
+    }
+ }
+
+~~~~~~~
+
+
+
+| To allow Struts to recognize that a conversion error has occurred, the converter class needs to throw XWorkException or preferably TypeConversionException\.
+
+| 
+
+####Applying a Type Converter to an Action####
+
+Create a file called 'ActionClassName\-conversion\.properties' in the same location of the classpath as the Action class itself resides\. 
+
+Eg\. if the action class name is MyAction, the action\-level conversion properties file should be named 'MyAction\-conversion\.properties'\.  If the action's package is com\.myapp\.actions the conversion file should also be in the classpath at /com/myapp/actions/\.
+
+Within the conversion file, name the action's property and the Converter to apply to it:
+
+
+~~~~~~~
+
+# syntax: <propertyName> = <converterClassName>
+point = com.acme.PointConverter 
+person.phoneNumber = com.acme.PhoneNumberConverter
+
+~~~~~~~
+
+Type conversion can also be specified via [Annotations](#PAGE_14017) within the action\.
+
+####Applying a Type Converter to a bean or model####
+
+When getting or setting the property of a bean, the framework will look for "classname\-conversion\.properties" in the same location of the **classpath** as the target bean\.  This is the same mechanism as used for actions\.
+
+**Example:** A custom converter is required for the Amount property of a Measurement bean\.  The Measurement class cannot be modified as its located within one of the application's dependencies\.  The action using Measurement implements ModelDriven\<Measurement\> so it cannot apply converters to the properties directly\.
+**Solution:** The conversion file needs to be in the same location of the classpath as Measurement\.  Create a directory in your source or resources tree matching the package of Measurement and place the converters file there\.
+
+eg\. for com\.acme\.measurements\.Measurement, create a file in the application source/resources at /com/acme/measurements/Measurement\-conversion\.properties:
+
+
+~~~~~~~
+
+# syntax: <propertyName>=<converterClassName>
+amount=com.acme.converters.MyCustomBigDecimalConverter
+
+~~~~~~~
+
+####Applying a Type Converter for an application####
+
+Application\-wide converters can be specified in a file called xwork\-conversion\.properties located in the root of the classpath\.
+
+
+~~~~~~~
+
+# syntax: <type> = <converterClassName>
+java.math.BigDecimal = com.acme.MyBigDecimalConverter 
+
+~~~~~~~
+
+####A Simple Example####
+
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.XWorkConverter}
+~~~~~~~
+
+\{snippet:id=i18n\-note|javadoc=true|url=com\.opensymphony\.xwork2\.conversion\.impl\.XWorkConverter\}
+
+The framework ships with a base helper class that simplifies converting to and from Strings, 
+
+~~~~~~~
+org.apache.struts2.util.StrutsTypeConverter
+~~~~~~~
+\. The helper class makes it easy to write type converters that handle converting objects to Strings as well as from Strings\.
+
+From the JavaDocs:
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=org.apache.struts2.util.StrutsTypeConverter}
+~~~~~~~
+
+####Advanced Type Conversion####
+
+The framework also handles advanced type conversion cases, like null property handling and converting values in Maps and Collections, and type conversion error handling\.
+
+#####Null Property Handling#####
+
+Null property handling will automatically create objects where null references are found\.
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler}
+~~~~~~~
+
+#####Collection and Map Support#####
+
+Collection and Map support provides intelligent null handling and type conversion for Java Collections\.
+
+The framework supports ways to discover the object type for elements in a collection\. The discover is made via an _ObjectTypeDeterminer_ \. A default implementation is provided with the framework\. The Javadocs explain how Map and Collection support is discovered in the 
+
+~~~~~~~
+DefaultObjectTypeDeterminer
+~~~~~~~
+\.
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer}
+~~~~~~~
+
+Additionally, you can create your own custom 
+
+~~~~~~~
+ObjectTypeDeterminer
+~~~~~~~
+ by implementing the 
+
+~~~~~~~
+ObjectTypeDeterminer
+~~~~~~~
+ interface\. There is also an optional ObjectTypeDeterminer that utilizes Java 5 generics\. See the [Annotations](#PAGE_14017) page for more information\.
+
+__Indexing a collection by a property of that collection__
+
+It is also possible to obtain a unique element of a collection by passing the value of a given property of that element\. By default, the property of the element of the collection is determined in _Class_ \-conversion\.properties using 
+
+~~~~~~~
+KeyProperty_xxx=yyy
+~~~~~~~
+, where xxx is the property of the bean _Class_  that returns the collection and yyy is the property of the collection element that we want to index on\.
+
+For an example, see the following two classes:
+
+**MyAction\.java**
+
+
+~~~~~~~
+
+/**
+ * @return a Collection of Foo objects
+ */
+public Collection getFooCollection()
+{
+    return foo;
+}
+
+~~~~~~~
+
+**Foo\.java**
+
+
+~~~~~~~
+
+/**
+ * @return a unique identifier
+ */
+public Long getId()
+{
+    return id;
+}
+
+~~~~~~~
+
+To enable type conversion, put the instruction 
+
+~~~~~~~
+KeyProperty_fooCollection=id
+~~~~~~~
+ in the 
+
+~~~~~~~
+MyAction-conversion.properties
+~~~~~~~
+ file\. This technique allows use of the idiom 
+
+~~~~~~~
+fooCollection(someIdValue)
+~~~~~~~
+ to obtain the Foo object with value 
+
+~~~~~~~
+someIdValue
+~~~~~~~
+ in the Set 
+
+~~~~~~~
+fooCollection
+~~~~~~~
+\. For example, 
+
+~~~~~~~
+fooCollection(22)
+~~~~~~~
+ would return the Foo object in the 
+
+~~~~~~~
+fooCollection
+~~~~~~~
+ Collection whose 
+
+~~~~~~~
+id
+~~~~~~~
+ property value was 22\.
+
+This technique is useful, because it ties a collection element directly to its unique identifier\. You are not forced to use an index\. You can edit the elements of a collection associated to a bean without any additional coding\. For example, parameter name 
+
+~~~~~~~
+fooCollection(22).name
+~~~~~~~
+ and value 
+
+~~~~~~~
+Phil
+~~~~~~~
+ would set name the Foo Object in the 
+
+~~~~~~~
+fooCollection
+~~~~~~~
+ Collection whose 
+
+~~~~~~~
+id
+~~~~~~~
+ property value was 22 to be Phil\.
+
+The framework automatically converts the type of the parameter sent in to the type of the key property using type conversion\.
+
+Unlike Map and List element properties, if 
+
+~~~~~~~
+fooCollection(22)
+~~~~~~~
+ does not exist, it will not be created\. If you would like it created, use the notation 
+
+~~~~~~~
+fooCollection.makeNew[index]
+~~~~~~~
+ where _index_  is an integer 0, 1, and so on\. Thus, parameter value pairs 
+
+~~~~~~~
+fooCollection.makeNew[0]=Phil
+~~~~~~~
+ and 
+
+~~~~~~~
+fooCollection.makeNew[1]=John
+~~~~~~~
+ would add two new Foo Objects to 
+
+~~~~~~~
+fooCollection --
+~~~~~~~
+ one with name property value 
+
+~~~~~~~
+Phil
+~~~~~~~
+ and the other with name property value 
+
+~~~~~~~
+John
+~~~~~~~
+\. However, in the case of a Set, the 
+
+~~~~~~~
+equals
+~~~~~~~
+ and 
+
+~~~~~~~
+hashCode
+~~~~~~~
+ methods should be defined such that they don't only include the 
+
+~~~~~~~
+id
+~~~~~~~
+ property\. Otherwise, one element of the null 
+
+~~~~~~~
+id
+~~~~~~~
+ properties Foos to be removed from the Set\.
+
+####An advanced example for indexed Lists and Maps####
+
+Here is the model bean used within the list\. The KeyProperty for this bean is the 
+
+~~~~~~~
+id
+~~~~~~~
+ attribute\.
+
+**MyBean\.java**
+
+
+~~~~~~~
+
+public class MyBean implements Serializable {
+
+    private Long id;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+    public String toString() {
+        return "MyBean{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}
+
+~~~~~~~
+
+The Action has a 
+
+~~~~~~~
+beanList
+~~~~~~~
+ attribute initialized with an empty ArrayList\.
+
+**MyBeanAction\.java**
+
+
+~~~~~~~
+
+public class MyBeanAction implements Action {
+
+    private List beanList = new ArrayList();
+    private Map beanMap = new HashMap();
+
+    public List getBeanList() {
+        return beanList;
+    }
+
+    public void setBeanList(List beanList) {
+        this.beanList = beanList;
+    }
+
+    public Map getBeanMap() {
+        return beanMap;
+    }
+
+    public void setBeanMap(Map beanMap) {
+        this.beanMap = beanMap;
+    }
+
+    public String execute() throws Exception {
+        return SUCCESS;
+    }
+}
+
+~~~~~~~
+
+These 
+
+~~~~~~~
+conversion.properties
+~~~~~~~
+ tell the TypeConverter to use MyBean instances as elements of the List\.
+
+**MyBeanAction\-conversion\.properties**
+
+
+~~~~~~~
+
+KeyProperty_beanList=id
+Element_beanList=MyBean
+CreateIfNull_beanList=true
+
+~~~~~~~
+
++ When submitting this via a form, the 
+
+~~~~~~~
+id
+~~~~~~~
+ value is used as KeyProperty for the MyBean instances in the beanList\.
+
++ Notice the () notation\! Do not use \[\] notation, which is for Maps only\!
+
++ The value for name will be set to the MyBean instance with this special id\.
+
++ The List does not have null values added for unavailable id values\. This approach avoids the risk of OutOfMemoryErrors\!
+
+**MyBeanAction\.jsp**
+
+
+~~~~~~~
+
+<s:iterator value="beanList" id="bean">
+  <stextfield name="beanList(%{bean.id}).name" />
+</s:iterator>
+
+~~~~~~~
+
+####Type Conversion Error Handling####
+
+Type conversion error handling provides a simple way to distinguish between an input _validation_  problem and an input _type conversion_  problem\.
+
+
+~~~~~~~
+{snippet:id=error-reporting|javadoc=true|url=com.opensymphony.xwork2.conversion.impl.XWorkConverter}
+~~~~~~~
+
+There are two ways the error reporting can occur:
+
+1. Globally, using the [Conversion Error Interceptor](conversion-error-interceptor.html)
+
+2. On a per-field basis, using the [conversion validator](conversion-validator.html)
+
+By default, the conversion interceptor is included in 
+
+~~~~~~~
+
+~~~~~~~
+ in the default stack\. To keep conversion errors from reporting globally, change the interceptor stack, and add additional validation rules\.
+
+####Common Problems####
+
+#####Null and Blank Values#####
+
+Some properties cannot be set to null\. Primitives like boolean and int cannot be null\.  If your action needs to or will accept null or blank values, use the object equivalents Boolean and Integer\.  Similarly, a blank string "" cannot be set on a primitive\.  At the time of writing, a blank string also cannot be set on a BigDecimal or BigInteger\.  Use server\-side validation to prevent invalid values from being set on your properties (or handle the conversion errors appropriately)\.
+
+#####Interfaces#####
+
+The framework cannot instantiate an object if it can't determine an appropriate implementation\.  It recognizes well\-known collection interfaces (List, Set, Map, etc) but cannot instantiate MyCustomInterface when all it sees is the interface\. In this case, instantiate the target implementation first (eg\. in a prepare method) or substitute in an implementation\.
+
+#####Generics and Erasure#####
+
+The framework will inspect generics to determine the appropriate type for collections and array elements\.  However, in some cases Erasure can result in base types that cannot be converted (typically Object or Enum)\.
+
+The following is an example of this problem:
+
+
+~~~~~~~
+
+public abstract class Measurement<T extends Enum>
+   public void setUnits(T enumValue) {...}
+}
+
+public class Area extends Measurement<UnitsOfArea> {
+  @Override
+  public void setUnits(UnitsOfArea enumValue){...}
+}
+
+~~~~~~~
+
+Although to the developer the area\.setUnits(enumValue) method only accepts a UnitsOfArea enumeration, due to erasure the signature of this method is actually setUnits(java\.lang\.Enum)\. The framework does not know that the parameter is a UnitsOfArea and when it attempts to instantiate the Enum an exception is thrown (java\.lang\.IllegalArgumentException: java\.lang\.Enum is not an enum type)\.

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/unknown-handlers.md
----------------------------------------------------------------------
diff --git a/source/core-developers/unknown-handlers.md b/source/core-developers/unknown-handlers.md
new file mode 100644
index 0000000..fec6e6c
--- /dev/null
+++ b/source/core-developers/unknown-handlers.md
@@ -0,0 +1,63 @@
+---
+layout: core-developers
+title: Unknown Handlers
+---
+
+# Unknown Handlers
+
+Unknown Handler stacks are available from Struts 2\.1 on\.
+
+> 
+
+#####Unkown Handlers#####
+
+Unknown Handlers are classes that implement the 
+
+~~~~~~~
+com.opensymphony.xwork2.UnknownHandler
+~~~~~~~
+ interface, and are called by the framework, when an unknown action, result, or method are executed\. To define an unknown handler, create a class implementing the mentioned interface, and add a bean definition to your struts\.xml:
+
+
+~~~~~~~
+
+<bean type="com.opensymphony.xwork2.UnknownHandler" name="handler" class="myclasses.SomeUnknownHandler"/>
+
+~~~~~~~
+
+#####Stacking Unknown Handlers#####
+
+Multiple unknown handlers can be defined, using the _unknown\-handler\-stack_  tag:
+
+
+~~~~~~~
+
+<bean type="com.opensymphony.xwork2.UnknownHandler" name="handler1" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
+<bean type="com.opensymphony.xwork2.UnknownHandler" name="handler2" class="com.opensymphony.xwork2.config.providers.SomeUnknownHandler"/>
+
+<unknown-handler-stack>
+   <unknown-handler-ref name="handler1" />
+   <unknown-handler-ref name="handler2" />
+</unknown-handler-stack>
+
+~~~~~~~
+
+When multiple unknown handlers are stacked like above, they will be called in the specified order, in the same cases when a single unknown handler would be called (when an unknown action, result, or method are executed), until one of them handles the requested action\. 
+
+#####Uknown Handlers Manager#####
+
+The default class that handles unknown handler stacks is 
+
+~~~~~~~
+com.opensymphony.xwork2.DefaultUnknownHandlerManager
+~~~~~~~
+, a custom implementation of this class can be provided by implementing the interface 
+
+~~~~~~~
+com.opensymphony.xwork2.UnknownHandlerManager
+~~~~~~~
+ and setting the property 
+
+~~~~~~~
+struts.unknownHandlerManager
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/url-validator-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/url-validator-annotation.md b/source/core-developers/url-validator-annotation.md
new file mode 100644
index 0000000..cc6dfef
--- /dev/null
+++ b/source/core-developers/url-validator-annotation.md
@@ -0,0 +1,72 @@
+---
+layout: core-developers
+title: UrlValidator Annotation
+---
+
+# UrlValidator Annotation
+
+This validator checks that a field is a valid URL\.
+
+Usage
+
+  The annotation must be applied at method level\.
+
+Parameters
+
+| Parameter|Required|Default|Notes|
+|----------|--------|-------|-----|
+|message|yes| |field error message|
+|key|no| |i18n key from language specific properties file|
+|messageParams|no| |additional params to be used to customize message \- will be evaluated against the Value Stack|
+|fieldName|no| |field name under validation|
+|shortCircuit|no|false|if this validator should be used as shortCircuit|
+|urlRegex|no| |defines regex to use to validate url|
+|urlRegexExpression|no| |defines regex as expression to validate url, expression will be evaluated against current stack to get proper regex|
+|type|yes|ValidatorType\.FIELD|Enum value from ValidatorType\. Either FIELD or SIMPLE can be used here|
+
+Examples
+
+**UrlValidator usage example**
+
+
+~~~~~~~
+@UrlValidator(message = "Default message", key = "i18n.key", shortCircuit = true)
+~~~~~~~
+
+**UrlValidator usage example**
+
+
+~~~~~~~
+@UrlValidator(message = "Default message", key = "i18n.key", urlRegexExpression = "${urlRegex}")
+~~~~~~~
+
+
+
+| urlRegex  neither urlRegexExpression are only used on client side to validate URLs \- this will be changed with next major release\!
+
+| 
+
+
+If no urlRegex neither urlRegexExpression is defined, default regex will be used instead, based on [StackOverflow answer](http://stackoverflow\.com/questions/161738/what\-is\-the\-best\-regular\-expression\-to\-check\-if\-a\-string\-is\-a\-valid\-url)^[http://stackoverflow\.com/questions/161738/what\-is\-the\-best\-regular\-expression\-to\-check\-if\-a\-string\-is\-a\-valid\-url]
+
+| 
+
+**Default URL regex**
+
+
+~~~~~~~
+return "^(https?|ftp):\/\/" +
+       "(([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+" +
+       "(:([a-z0-9$_\\.\\+!\\*\\'\\(\\),;\\?&=-]|%[0-9a-f]{2})+)?" +
+       "@)?(#?" +
+       ")((([a-z0-9]\\.|[a-z0-9][a-z0-9-]*[a-z0-9]\\.)*" +
+       "[a-z][a-z0-9-]*[a-z0-9]" +
+       "|((\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])\\.){3}" +
+       "(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])" +
+       ")(:\\d+)?" +
+       ")(((\\/+([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)*" +
+       "(\\?([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)" +
+       "?)?)?" +
+       "(#([a-z0-9$_\\.\\+!\\*\\'\\(\\),;:@&=-]|%[0-9a-f]{2})*)?" +
+       "$";
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/url-validator.md
----------------------------------------------------------------------
diff --git a/source/core-developers/url-validator.md b/source/core-developers/url-validator.md
new file mode 100644
index 0000000..335fae7
--- /dev/null
+++ b/source/core-developers/url-validator.md
@@ -0,0 +1,42 @@
+---
+layout: core-developers
+title: url validator
+---
+
+# url validator
+
+####Description####
+
+URLValidator checks that a given field is a String and a valid URL
+
+Parameters
+
++  fieldName \- The field name this validator is validating\. Required if using Plain\-Validator Syntax otherwise not required
+
++ urlRegexExpression \- The regex defined as expression used to validate url\. If not defined 'urlRegex' will be used instead
+
++ urlRegex \- The regex used to validate url\. If not defined default regex will be used
+
+####Examples####
+
+
+
+~~~~~~~
+<validators>
+    <!-- Plain Validator Syntax -->
+    <validator type="url">
+        <param name="fieldName">myHomePage</param>
+        <message>Invalid homepage url</message>
+    </validator>
+
+    <!-- Field Validator Syntax -->
+    <field name="myHomepage">
+        <field-validator type="url">
+            <message>Invalid homepage url</message>
+        </field-validator>
+    </field>
+</validators>
+
+~~~~~~~
+
+See more details in [UrlValidator Annotation](url-validator-annotation.html)

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/using-field-validators.md
----------------------------------------------------------------------
diff --git a/source/core-developers/using-field-validators.md b/source/core-developers/using-field-validators.md
new file mode 100644
index 0000000..2cbfc4a
--- /dev/null
+++ b/source/core-developers/using-field-validators.md
@@ -0,0 +1,34 @@
+---
+layout: core-developers
+title: Using Field Validators
+---
+
+# Using Field Validators
+
+#####Description#####
+
+The followings show a simple example using Struts' Field Validators
+
+__Step 1__
+
+Create the jsp page
+
+~~~~~~~
+{snippet:id=fieldValidatorsExample|lang=xml|javadoc=false|url=struts2/apps/showcase/src/main/webapp/WEB-INF/validation/fieldValidatorsExample.jsp}
+~~~~~~~
+
+__Step 2__
+
+Create the action class
+
+~~~~~~~
+{snippet:id=fieldValidatorsExample|javadoc=false|lang=java|url=struts2/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/FieldValidatorsExampleAction.java}
+~~~~~~~
+
+__Step 3__
+
+Create the validator\.xml\.
+
+~~~~~~~
+{snippet:id=fieldValidatorsExample|javadoc=false|lang=xml|url=struts2/apps/showcase/src/main/resources/org/apache/struts2/showcase/validation/FieldValidatorsExampleAction-submitFieldValidatorsExamples-validation.xml}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/using-non-field-validators.md
----------------------------------------------------------------------
diff --git a/source/core-developers/using-non-field-validators.md b/source/core-developers/using-non-field-validators.md
new file mode 100644
index 0000000..f1ff67c
--- /dev/null
+++ b/source/core-developers/using-non-field-validators.md
@@ -0,0 +1,34 @@
+---
+layout: core-developers
+title: Using Non Field Validators
+---
+
+# Using Non Field Validators
+
+#####Description#####
+
+The followings show a simple example using Webwork's Non Field Validators
+
+__Step 1__
+
+Create the jsp page
+
+~~~~~~~
+{snippet:id=nonFieldValidatorsExample|lang=xml|javadoc=false|url=struts2/apps/showcase/src/main/webapp/WEB-INF/validation/nonFieldValidatorsExample.jsp}
+~~~~~~~
+
+__Step 2__
+
+Create the action class
+
+~~~~~~~
+{snippet:id=nonFieldValidatorsExample|javadoc=false|lang=java|url=struts2/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/NonFieldValidatorsExampleAction.java}
+~~~~~~~
+
+__Step 3__
+
+Create the validator\.xml\.
+
+~~~~~~~
+{snippet:id=nonFieldValidatorsExample|javadoc=false|lang=xml|url=struts2/apps/showcase/src/main/resources/org/apache/struts2/showcase/validation/NonFieldValidatorsExampleAction-submitNonFieldValidatorsExamples-validation.xml}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/using-visitor-field-validator.md
----------------------------------------------------------------------
diff --git a/source/core-developers/using-visitor-field-validator.md b/source/core-developers/using-visitor-field-validator.md
new file mode 100644
index 0000000..7af261e
--- /dev/null
+++ b/source/core-developers/using-visitor-field-validator.md
@@ -0,0 +1,34 @@
+---
+layout: core-developers
+title: Using Visitor Field Validator
+---
+
+# Using Visitor Field Validator
+
+#####Description#####
+
+The followings show a simple example using Webwork's Field Validators
+
+__Step 1__
+
+Create the jsp page\.
+
+~~~~~~~
+{snippet:id=visitorValidatorsExample|lang=xml|javadoc=false|url=struts2/apps/showcase/src/main/webapp/WEB-INF/validation/visitorValidatorsExample.jsp}
+~~~~~~~
+
+__Step 2__
+
+Create the action class\.
+
+~~~~~~~
+{snippet:id=visitorValidatorsExample|javadoc=false|lang=java|url=struts2/apps/showcase/src/main/java/org/apache/struts2/showcase/validation/VisitorValidatorsExampleAction.java}
+~~~~~~~
+
+__Step 3__
+
+Create the validator\.xml\.
+
+~~~~~~~
+{snippet:id=visitorValidatorsExample|javadoc=false|lang=xml|url=struts2/apps/showcase/src/main/resources/org/apache/struts2/showcase/validation/VisitorValidatorsExampleAction-submitVisitorValidatorsExamples-validation.xml}
+~~~~~~~
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/validation-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/validation-annotation.md b/source/core-developers/validation-annotation.md
new file mode 100644
index 0000000..d92a26d
--- /dev/null
+++ b/source/core-developers/validation-annotation.md
@@ -0,0 +1,64 @@
+---
+layout: core-developers
+title: Validation Annotation
+---
+
+# Validation Annotation
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validation}
+~~~~~~~
+
+#####Usage#####
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validation}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validation}
+~~~~~~~
+
+#####Examples#####
+
+**An Annotated Interface**
+
++ Mark the interface with @Validation()
+
++ Apply standard or custom annoations at method level
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.Validation}
+~~~~~~~
+
+**An Annotated Class**
+
+
+~~~~~~~
+{snippet:id=example2|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.Validation}
+~~~~~~~
+
+
+> 
+
+> 
+
+> When multiple methods are used to map different actions on the same class, and one of them is annotated with _@Validations_ , those validators will be triggered for all the actions, unless they are annotated with @SkipValidation or _validateAnnotatedMethodOnly_  is set to _true_  in the "validation" interceptor, like:
+
+> 
+ > \<interceptor\-ref name="validation"\>
+ >     \<param name="validateAnnotatedMethodOnly"\>true\</param\>
+ >     \<param name="excludeMethods"\>input,back,cancel,browse\</param\>
+ > \</interceptor\-ref\>
+ > 
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/validation-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/validation-interceptor.md b/source/core-developers/validation-interceptor.md
new file mode 100644
index 0000000..155abff
--- /dev/null
+++ b/source/core-developers/validation-interceptor.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: Validation Interceptor
+---
+
+# Validation Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.ValidationInterceptor}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.ValidationInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=com.opensymphony.xwork2.validator.ValidationInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.validator.ValidationInterceptor}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/validation-parameter-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/validation-parameter-annotation.md b/source/core-developers/validation-parameter-annotation.md
new file mode 100644
index 0000000..373279c
--- /dev/null
+++ b/source/core-developers/validation-parameter-annotation.md
@@ -0,0 +1,35 @@
+---
+layout: core-developers
+title: ValidationParameter annotation
+---
+
+# ValidationParameter annotation
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.ValidationParameter}
+~~~~~~~
+
+__Usage__
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.ValidationParameter}
+~~~~~~~
+
+__Parameters__
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.ValidationParameter}
+~~~~~~~
+
+__Examples__
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.ValidationParameter}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/validation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/validation.md b/source/core-developers/validation.md
new file mode 100644
index 0000000..29f84de
--- /dev/null
+++ b/source/core-developers/validation.md
@@ -0,0 +1,390 @@
+---
+layout: core-developers
+title: Validation
+---
+
+# Validation
+
+Struts 2 validation is configured via XML or annotations\. Manual validation in the action is also possible, and may be combined with XML and annotation\-driven validation\.
+
+Validation also depends on both the 
+
+~~~~~~~
+validation
+~~~~~~~
+ and 
+
+~~~~~~~
+workflow
+~~~~~~~
+ interceptors (both are included in the default interceptor stack)\. The 
+
+~~~~~~~
+validation
+~~~~~~~
+ interceptor does the validation itself and creates a list of field\-specific errors\. The 
+
+~~~~~~~
+workflow
+~~~~~~~
+ interceptor checks for the presence of validation errors: if any are found, it returns the "input" result (by default), taking the user back to the form which contained the validation errors\.
+
+If we're using the default settings _and_  our action doesn't have an "input" result defined _and_  there are validation (or, incidentally, type conversion) errors, we'll get an error message back telling us there's no "input" result defined for the action\.
+
+**CONTENTS**
+
+
+####Using Annotations####
+
+[Annotations](validation-annotation.html) can be used as an alternative to XML for validation\.
+
+ 
+
+####Bean Validation####
+
+With struts 2\.5 comes the Bean Validation Plugin\. That is an alternative to the classic struts validation described here\. See the _Plugin Page_  for details\.
+
+####Examples####
+
+In all examples given here, the validation message displayed is given in plain English \- to internationalize the message, put the string in a properties file and use a property key instead, specified by the 'key' attribute\. It will be looked up by the framework (see [Localization](localization.html)).
+
+1. [Basic Validation](basic-validation.html)
+
+2. [Client-side Validation](client-side-validation.html)
+
+3. _AJAX Validation_ 
+
+4. [Using Field Validators](using-field-validators.html)
+
+5. [Using Non Field Validators](using-non-field-validators.html)
+
+6. [Using Visitor Field Validator](using-visitor-field-validator.html)
+
+7. _How do we repopulate controls when validation fails_  (FAQ entry)
+
+####Bundled Validators####
+
+
+When using a Field Validator, Field Validator Syntax is **ALWAYS** preferable than using the Plain Validator Syntax as it facilitates grouping of field\-validators according to fields\. This is very handy especially if a field needs to have many field\-validators which is almost always the case\.
+
+| 
+
+1. [conversion validator](conversion-validator.html)
+
+2. [date validator](date-validator.html)
+
+3. [double validator](double-validator.html)
+
+4. [email validator](email-validator.html)
+
+5. [expression validator](expression-validator.html)
+
+6. [fieldexpression validator](fieldexpression-validator.html)
+
+7. [int validator](int-validator.html)
+
+8. [regex validator](regex-validator.html)
+
+9. [required validator](required-validator.html)
+
+10. [requiredstring validator](requiredstring-validator.html)
+
+11. [short validator](short-validator.html)
+
+12. [stringlength validator](stringlength-validator.html)
+
+13. [url validator](url-validator.html)
+
+14. [visitor validator](visitor-validator.html)
+
+15. [conditionalvisitor validator](conditionalvisitor-validator.html)
+
+####Registering Validators####
+
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+The following list shows the default validators included in the framework and is an example of the syntax used to declare our own validators\.
+
+~~~~~~~
+{snippet:lang=xml|url=struts2/core/src/main/resources/com/opensymphony/xwork2/validator/validators/default.xml}
+~~~~~~~
+
+
+The validators\.xml used to reference a DTD hosted by Opensymphony, the original location of the XWork project\. Since the the move to Apache Struts, DTDs were changed\. Please ensure in your projects to include the DTD header as described in the examples found here
+
+| 
+
+
+The validators\.xml containing custom validators needs to contain a copy of the default validators\. No DTD was used in validators\.xml\. See: [http://struts\.apache\.org/2\.x/docs/release\-notes\-208\.html\#ReleaseNotes2\.0\.8\-MigrationfrompreviousReleases](http://struts\.apache\.org/2\.x/docs/release\-notes\-208\.html\#ReleaseNotes2\.0\.8\-MigrationfrompreviousReleases)
+
+| 
+
+####Turning on Validation####
+
+The default interceptor stack, "defaultStack", already has validation turned on\. When creating your own interceptor\-stack be sure to include **both** the 
+
+~~~~~~~
+validation
+~~~~~~~
+ and 
+
+~~~~~~~
+workflow
+~~~~~~~
+ interceptors\. From 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+:
+
+
+~~~~~~~
+<interceptor-stack name="defaultStack">
+   ...
+   <interceptor-ref name="validation">
+      <param name="excludeMethods">input,back,cancel,browse</param>
+   </interceptor-ref>
+   <interceptor-ref name="workflow">
+      <param name="excludeMethods">input,back,cancel,browse</param>
+   </interceptor-ref>
+</interceptor-stack>
+
+~~~~~~~
+
+Beginning with version 2\.0\.4 Struts provides an extension to XWork's 
+
+~~~~~~~
+com.opensymphony.xwork2.validator.ValidationInterceptor
+~~~~~~~
+ interceptor\.
+
+
+~~~~~~~
+<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
+
+~~~~~~~
+
+This interceptor allows us to turn off validation for a specific method by using the 
+
+~~~~~~~
+@org.apache.struts2.interceptor.validation.SkipValidation
+~~~~~~~
+ annotation on the action method\.
+
+####Validator Scopes####
+
+
+
+~~~~~~~
+{snippet:id=fieldValidators|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=nonFieldValidators|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+#####Notes#####
+
+
+
+~~~~~~~
+{snippet:id=validatorsNote|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+####Defining Validation Rules####
+
+
+
+~~~~~~~
+{snippet:id=validationRules1|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=exValidationRules1|lang=xml|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=validationRules2|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+In this context, "Action Alias" refers to the action name as given in the Struts configuration\. Often, the name attribute matches the method name, but they may also differ\.
+
+| 
+
+####Localizing and Parameterizing Messages####
+
+
+
+~~~~~~~
+{snippet:id=validationRules3|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=exValidationRules3|javadoc=true|lang=xml|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=validationRules4|javadoc=true|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=exValidationRules4|javadoc=true|lang=xml|url=com.opensymphony.xwork2.validator/ValidatorFactory.java}
+~~~~~~~
+
+####Validator Flavor####
+
+
+
+~~~~~~~
+{snippet:id=validatorFlavours|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+####Non\-Field Validator Vs Field\-Validator validatortypes####
+
+There are two ways you can define validators in your \-validation\.xml file:
+
+1. <validator>
+
+2. <field-validator>
+
+Keep the following in mind when using either syntax:
+
+Non\-Field\-Validator: The \<validator\> element allows you to declare both types of validators (either a plain Validator a field\-specific FieldValidator)\.
+
+
+~~~~~~~
+<validator type="expression> 
+    <param name="expression">foo gt bar</param> 
+    <message>foo must be great than bar.</message> 
+</validator> 
+
+~~~~~~~
+
+
+~~~~~~~
+<validator type="required"> 
+    <param name="fieldName">bar</param> 
+    <message>You must enter a value for bar.</message> 
+</validator> 
+
+~~~~~~~
+
+**field\-validator**: The \<field\-validator\> elements are basically the same as the \<validator\> elements except that they inherit the fieldName attribute from the enclosing \<field\> element\. FieldValidators defined within a \<field\-validator\> element will have their fieldName automatically filled with the value of the parent \<field\> element's fieldName attribute\. The reason for this structure is to conveniently group the validators for a particular field under one element, otherwise the fieldName attribute would have to be repeated, over and over, for each individual \<validator\>\.
+
+
+
+| It is always better to defined field\-validator inside a \<field\> tag instead of using a \<validator\> tag and supplying fieldName as its param as the xml code itself is clearer (grouping of field is clearer)
+
+| 
+
+
+Note that you should only use FieldValidators (not plain Validators) within a block\. A plain Validator inside a \<field\> will not be allowed and would generate error when parsing the xml, as it is not allowed in the defined dtd (xwork\-validator\-1\.0\.2\.dtd)
+
+| 
+
+Declaring a FieldValidator using the \<field\-validator\> syntax:
+
+
+~~~~~~~
+<field name="email_address"> 
+    <field-validator type="required"> 
+        <message>You cannot leave the email address field empty.</message> 
+    </field-validator> 
+    <field-validator type="email"> 
+        <message>The email address you entered is not valid.</message> 
+    </field-validator> 
+</field> 
+
+~~~~~~~
+
+The choice is yours\. It's perfectly legal to only use elements without the elements and set the fieldName attribute for each of them\. The following are effectively equal:
+
+
+~~~~~~~
+<field name="email_address"> 
+    <field-validator type="required"> 
+        <message>You cannot leave the email address field empty.</message> 
+    </field-validator> 
+    <field-validator type="email"> 
+        <message>The email address you entered is not valid.</message> 
+    </field-validator> 
+</field> 
+ 
+<validator type="required"> 
+    <param name="fieldName">email_address</param> 
+    <message>You cannot leave the email address field empty.</message> 
+</validator> 
+<validator type="email"> 
+    <param name="fieldName">email_address</param> 
+    <message>The email address you entered is not valid.</message> 
+</validator> 
+
+~~~~~~~
+
+####Short\-Circuiting Validator####
+
+
+
+~~~~~~~
+{snippet:id=shortCircuitingValidators1|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=exShortCircuitingValidators|lang=xml|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=shortCircuitingValidators2|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=scAndValidatorFlavours1|1=javadoc|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=exScAndValidatorFlavours|lang=xml|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=scAndValidatorFlavours2|1=javadoc|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+####How Validators of an Action are Found####
+
+
+
+~~~~~~~
+{snippet:id=howXworkFindsValidatorForAction|javadoc=true|url=com.opensymphony.xwork2.validator/Validator.java}
+~~~~~~~
+
+####Writing custom validators####
+
+If you want to write custom validator use on of these classes as a starting point:
+
++ com\.opensymphony\.xwork2\.validator\.validators\.ValidatorSupport
+
++ com\.opensymphony\.xwork2\.validator\.validators\.FieldValidatorSupport
+
++ com\.opensymphony\.xwork2\.validator\.validators\.RangeValidatorSupport
+
++ com\.opensymphony\.xwork2\.validator\.validators\.RepopulateConversionErrorFieldValidatorSupport
+
+####Resources####
+
+[WebWork Validation](http://today\.java\.net/pub/a/today/2006/01/19/webwork\-validation\.html)^[http://today\.java\.net/pub/a/today/2006/01/19/webwork\-validation\.html]

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/validations-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/validations-annotation.md b/source/core-developers/validations-annotation.md
new file mode 100644
index 0000000..1adb125
--- /dev/null
+++ b/source/core-developers/validations-annotation.md
@@ -0,0 +1,94 @@
+---
+layout: core-developers
+title: Validations Annotation
+---
+
+# Validations Annotation
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validations}
+~~~~~~~
+
+#####Usage#####
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validations}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.Validations}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.Validations}
+~~~~~~~
+
+#####Different validations per method#####
+
+
+Different validations per method is NOT supported for client\-side validation\!
+
+| 
+
+To use different validations per method, the validateAnnotatedMethodOnly property must be set on the validation interceptor\.
+
+
+~~~~~~~
+
+<interceptor-ref name="validation">
+  <param name="validateAnnotatedMethodOnly">true</param>                
+  <param name="excludeMethods">input,back,cancel,browse</param>
+</interceptor-ref>
+
+~~~~~~~
+
+Here's a complete example of updating the default stack:
+
+
+~~~~~~~
+
+  <package name="default" extends="struts-default">
+    <interceptors>
+      <interceptor-stack name="content">
+        <interceptor-ref name="exception"/>
+                <interceptor-ref name="alias"/>
+                <interceptor-ref name="servletConfig"/>
+                <interceptor-ref name="prepare"/>
+                <interceptor-ref name="i18n"/>
+                <interceptor-ref name="chain"/>
+                <interceptor-ref name="debugging"/>
+                <interceptor-ref name="profiling"/>
+                <interceptor-ref name="scopedModelDriven"/>
+                <interceptor-ref name="modelDriven"/>
+                <interceptor-ref name="fileUpload"/>
+                <interceptor-ref name="checkbox"/>
+                <interceptor-ref name="staticParams"/>
+                <interceptor-ref name="params">
+                  <param name="excludeParams">dojo\..*</param>
+                </interceptor-ref>
+                <interceptor-ref name="conversionError"/>
+                <interceptor-ref name="validation">
+  	            <param name="validateAnnotatedMethodOnly">true</param>                
+                    <param name="excludeMethods">input,back,cancel,browse</param>
+                </interceptor-ref>
+                <interceptor-ref name="workflow">
+                    <param name="excludeMethods">input,back,cancel,browse</param>
+                </interceptor-ref>
+      </interceptor-stack>
+    </interceptors>
+    <default-interceptor-ref name="default"/>
+  </package>
+</struts>
+
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/velocity-properties.md
----------------------------------------------------------------------
diff --git a/source/core-developers/velocity-properties.md b/source/core-developers/velocity-properties.md
new file mode 100644
index 0000000..a35d9cd
--- /dev/null
+++ b/source/core-developers/velocity-properties.md
@@ -0,0 +1,31 @@
+---
+layout: core-developers
+title: velocity.properties
+---
+
+# velocity.properties
+
+If a 
+
+~~~~~~~
+velocity.properties
+~~~~~~~
+ is provided on the classpath (e\.g\., 
+
+~~~~~~~
+/WEB-INF/classes
+~~~~~~~
+), it will be loaded by Velocity\.
+
+**velocity\.properties**
+
+
+~~~~~~~
+
+# Velocity Macro libraries.
+velocimacro.library = action-default.vm, tigris-macros.vm, myapp.vm
+
+~~~~~~~
+
+(light\-on) See [struts\-default\.vm](struts-default-vm.html) and the _Velocity_  documentation for more information\.
+

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/velocity-result.md
----------------------------------------------------------------------
diff --git a/source/core-developers/velocity-result.md b/source/core-developers/velocity-result.md
new file mode 100644
index 0000000..794be29
--- /dev/null
+++ b/source/core-developers/velocity-result.md
@@ -0,0 +1,28 @@
+---
+layout: core-developers
+title: Velocity Result
+---
+
+# Velocity Result
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=org.apache.struts2.dispatcher.VelocityResult}
+~~~~~~~
+
+####Parameters####
+
+
+
+~~~~~~~
+{snippet:id=params|javadoc=true|url=org.apache.struts2.dispatcher.VelocityResult}
+~~~~~~~
+
+####Examples####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=org.apache.struts2.dispatcher.VelocityResult}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/visitor-field-validator-annotation.md
----------------------------------------------------------------------
diff --git a/source/core-developers/visitor-field-validator-annotation.md b/source/core-developers/visitor-field-validator-annotation.md
new file mode 100644
index 0000000..635d4b0
--- /dev/null
+++ b/source/core-developers/visitor-field-validator-annotation.md
@@ -0,0 +1,36 @@
+---
+layout: core-developers
+title: VisitorFieldValidator Annotation
+---
+
+# VisitorFieldValidator Annotation
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator}
+~~~~~~~
+
+#####Usage#####
+
+
+
+~~~~~~~
+{snippet:id=usage|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator}
+~~~~~~~
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|javadoc=true|lang=java|url=com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/visitor-validator.md
----------------------------------------------------------------------
diff --git a/source/core-developers/visitor-validator.md b/source/core-developers/visitor-validator.md
new file mode 100644
index 0000000..55b2324
--- /dev/null
+++ b/source/core-developers/visitor-validator.md
@@ -0,0 +1,35 @@
+---
+layout: core-developers
+title: visitor validator
+---
+
+# visitor validator
+
+####Description####
+
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.validator.validators.VisitorFieldValidator}
+~~~~~~~
+
+####Parameters####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.validator.validators.VisitorFieldValidator}
+~~~~~~~
+
+####Examples####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.validator.validators.VisitorFieldValidator}
+~~~~~~~
+
+
+~~~~~~~
+{snippet:id=explanation|javadoc=true|url=com.opensymphony.xwork2.validator.validators.VisitorFieldValidator}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/web-xml.md
----------------------------------------------------------------------
diff --git a/source/core-developers/web-xml.md b/source/core-developers/web-xml.md
new file mode 100644
index 0000000..ab0df71
--- /dev/null
+++ b/source/core-developers/web-xml.md
@@ -0,0 +1,231 @@
+---
+layout: core-developers
+title: web.xml
+---
+
+# web.xml
+
+
+The 
+
+~~~~~~~
+web.xml
+~~~~~~~
+ web application descriptor file represents the core of the Java web application, so it is appropriate that it is also part of the core of the Struts framework\. In the 
+
+~~~~~~~
+web.xml
+~~~~~~~
+ file, Struts defines its FilterDispatcher, the Servlet Filter class that initializes the Struts framework and handles all requests\. This filter can contain initialization parameters that affect what, if any, additional configuration files are loaded and how the framework should behave\.
+
+####Simple Example####
+
+Configuring 
+
+~~~~~~~
+web.xml
+~~~~~~~
+ for the framework is a matter of adding a filter and filter\-mapping\.
+
+**Filter Example (web\.xml)**
+
+
+~~~~~~~
+<web-app id="MyStrutsApp" version="2.4" 
+	xmlns="http://java.sun.com/xml/ns/j2ee" 
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+    <filter>
+        <filter-name>struts2</filter-name>
+        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>struts2</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <!-- ... -->
+
+</web-app>
+
+~~~~~~~
+
+#####Changed filter package in Struts \>= 2\.5#####
+
+As from Struts 2\.5 all filters were moved to top package, if you are using older version you must use the old package, see example:
+
+
+~~~~~~~
+<web-app id="WebApp_9" version="2.4" 
+	xmlns="http://java.sun.com/xml/ns/j2ee" 
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+    <filter>
+        <filter-name>struts2</filter-name>
+        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+    ...
+~~~~~~~
+
+#####Changed Filter Structure in Struts \>= 2\.1\.3#####
+
+ To split up the the dispatcher phases, FilterDispatcher is deprecated since Struts 2\.1\.3\. If working with older versions, you need to use
+
+
+~~~~~~~
+    ...
+    <filter>
+        <filter-name>struts2</filter-name>
+        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
+    ...
+
+~~~~~~~
+
+ See _SiteMesh Plugin_  for an example on when to use seperate Filters for prepare and execution phase
+
+#####Exclude specific URLs#####
+
+ In the example above we've mapped the Struts 2 dispatcher to 
+
+~~~~~~~
+/*
+~~~~~~~
+, so Struts 2 has a crack at all incoming requests\. This is because Struts 2 serves static content from its jar files, including Dojo JavaScript files (if using S2\.0, or the Dojo plugin in S2\.1\+) and FreeMarker templates for the Struts 2 tags that produce HTML\.
+
+If we change the filter mapping to something else, for example 
+
+~~~~~~~
+/*.html
+~~~~~~~
+, we must take this in to account and extract the content that would normally be served from the Struts 2 jar files, or some other solution\.
+
+Since Struts 2\.1\.7, you are able to provide a comma seperated list of patterns for which when matching against the
+ request URL the Filter will just pass by\. This is done via the configuration option struts\.action\.excludePattern, for example in your struts\.xml
+
+ 
+
+
+~~~~~~~
+<struts>
+    <constant name="struts.action.excludePattern" value=".*unfiltered.*,.*\\.nofilter"/>
+    ...
+
+</struts>
+~~~~~~~
+
+####Taglib Example####
+
+Typically, configuring a taglib is neither required nor recommended\. The taglib is included in 
+
+~~~~~~~
+struts-core.jar
+~~~~~~~
+, and the container will discover it automatically\.
+
+ (ok)  If, for some reason, a taglib configuration is needed within web\.xml, extract the TLD file from the 
+
+~~~~~~~
+struts-core.jar
+~~~~~~~
+
+
+~~~~~~~
+META-INF
+~~~~~~~
+ folder, and add a 
+
+~~~~~~~
+taglib
+~~~~~~~
+ element to the 
+
+~~~~~~~
+web.xml
+~~~~~~~
+\.
+
+
+~~~~~~~
+    <!-- ... -->
+    </welcome-file-list>
+
+    <taglib>
+       <taglib-uri>/s</taglib-uri>
+       <taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
+    </taglib>
+</web-app>
+
+~~~~~~~
+
+####Custom FileManager and FileManagerFactory implementations####
+
+If there is a need to support an App Server's specific file system (eg\. VFS in JBoss), you can implement your own version of FileManager\. But it must be registered at "the beginning" to support bootstrap of the whole framework\.
+
+To register your own FileManger you can do it with \<init\-param/\> as below:
+
+
+~~~~~~~
+<filter>
+     <filter-name>struts2</filter-name>
+     <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
+     <init-param>
+         <param-name>struts.fileManager</param-name>
+         <param-value>com.company.MyFileManager</param-value>
+     </init-param>
+</filter>
+
+~~~~~~~
+
+You can as well register your own FileManagerFactory with \<init\-param/\>, see example:
+
+
+~~~~~~~
+<filter>
+     <filter-name>struts2</filter-name>
+     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
+     <init-param>
+         <param-name>struts.fileManagerFactory</param-name>
+         <param-value>com.company.MyFileManagerFactory</param-value>
+     </init-param>
+</filter>
+
+~~~~~~~
+
+Take a look on default implementations \- DefaultFileManager\.java and DefaultFileManagerFactory\.java to understand how and why\.
+
+####Custom configuration provider####
+
+It is possible to use your custom 
+
+~~~~~~~
+ConfigurationProvider
+~~~~~~~
+ to programmatically configure your application\. To do this use 
+
+~~~~~~~
+configProviders
+~~~~~~~
+ (it can be a comma\-separated list of class names) 
+
+~~~~~~~
+<init-param/>
+~~~~~~~
+ as below:
+
+
+~~~~~~~
+<filter>
+     <filter-name>struts2</filter-name>
+     <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
+     <init-param>
+         <param-name>configProviders</param-name>
+         <param-value>com.company.MyConfigurationProvider</param-value>
+     </init-param>
+</filter>
+~~~~~~~
+
+See [Configuration Provider & Configuration](configuration-provider-and-configuration.html) for more details.
+
+ 

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/weblogic-6-1.md
----------------------------------------------------------------------
diff --git a/source/core-developers/weblogic-6-1.md b/source/core-developers/weblogic-6-1.md
new file mode 100644
index 0000000..f2d7081
--- /dev/null
+++ b/source/core-developers/weblogic-6-1.md
@@ -0,0 +1,118 @@
+---
+layout: core-developers
+title: WebLogic 6.1
+---
+
+# WebLogic 6.1
+
+####Running on Weblogic Server 6\.1####
+
+This document describes why the framework doesn't work "as\-is" on Weblogic Server 6\.1 and shows how to build an additional JAR that will fix the problems\.
+
+(information) The service pack SP4 of Weblogic Server 6\.1 was used to test these notes\.
+
+The first part of this document describes the technical problems and the theoretical solution\.
+
+#####Why It Doesn't Just Work#####
+
+Weblogic 6\.1 was published just prior to the finalization of the Servlet 2\.3 specification\. The incompatibility is that servlet filters and listeners in Weblogic 6\.1 do not work with the 2\.3 spec primarily because the servlet context is not retrieved in the same way\.  This causes virtually all filter initialization operations to fail with an AbstractMethodError exception\.
+
+#####How the Framework is Modified#####
+
+In Servlet 2\.3, the servlet context is available from the session object; this is not true for Weblogic Server 6\.1\. Hence, filters and listeners must be modified to retrieve the servlet context from a different source; this is accomplished by retrieving the servlet context from the FilterConfig passed to the servlet filters during initialzation\.
+
+However, the framework code cannot be modifed to do this, because this will break the Servlet 2\.3 specification\.  The goal is to leave the "original" framework unmodified so that it is still Servlet 2\.3 compatible, and then to add an additional JAR that "breaks" the frame to work on Weblogic Server 6\.1\.
+
+The framework has already been modified slightly to make the above effort possible:
+
+1. **RequestLifecycleFilter** is modified to retrieve its servlet context from the method 
+
+~~~~~~~
+getServletContext
+~~~~~~~
+. This method, 
+
+~~~~~~~
+getServletContext
+~~~~~~~
+, is then implemented to return the servlet context from where it is available in Servlet 2.3: the session object. The logical operation is unchanged, but now subclasses can override 
+
+~~~~~~~
+getServletContext
+~~~~~~~
+ to retrieve the servlet context from a different location as we'll see below.
+
+1. **SessionLifecycleListener** is modified in the same way as RequestLifecycleFilter. The method, 
+
+~~~~~~~
+getServletContext
+~~~~~~~
+, is implemented to return the servlet context, in this case also from the session object. Again, subclasses can override the 
+
+~~~~~~~
+getServletContext
+~~~~~~~
+ method to restore the servlet context from a different source. Again, this class's functionality is unchanged.
+
+Now, in a separate project, the following classes are added and compiled into a separate JAR:
+
+__RequestLifecycleFilterCompatWeblogic61__
+
+This subclass of RequestLifecycleFilter simply overrides getServletContext() to retrieve the servlet context from the filter config, creates a singleton class, SessionContextSingleton, and assigns the servlet context to the singleton so that the listeners will have the ability to retrieve it\.
+
+__SessionLifecycleListenerCompatWeblogic61__
+
+This subclass of SessionLifecycleListener simply overrides getServletContext() to retrieve the servlet context from the singleton created above\.
+
+__FilterDispatcherCompatWeblogic61__
+
+Although the superclass of this class, FilterDispatcher, is commented out, this subclass retrieves the servlet context in the same way as RequestLifecycleFilterCompatWeblogic61 in case it is ever resurrected\. At this time, this class is unnecessary\.
+
+__ServletContextSingleton__
+
+A singleton class whose sole purpose is to hold the servlet context so that listener classes have access to it\.
+
+#####Setting Up to Run on Weblogic 6\.1#####
+
+__Building your own project__
+
+In the \{\{web\.xml\} file, make the following class name substitutions:
+
+| Old Class Name | New Class Name |
+|----------------|----------------|
+| RequestLifecycleFilter | RequestLifecycleFilterCompatWeblogic61 |
+| SessionLifecycleListener | SessionLifecycleListenerCompatWeblogic61 |
+| FilterDispatcher | FilterDispatcherCompatWeblogic61 |
+
+#####FAQ#####
+
+__I still get the AbstractMethodError Exception when Weblogic Server starts up\.  What am I doing wrong?__
+
+1. Check to see if a 
+
+~~~~~~~
+action2-example.war
+~~~~~~~
+ is still lingering in your 
+
+~~~~~~~
+mydomain/applications
+~~~~~~~
+ folder and delete it if it is there.
+
+2. See next FAQ question.
+
+__The server behavior seems like it is from a previous source code base; I can't debug it\.  What's the clue?__
+
+Sometimes BEA Weblogic Server doesn't "rebuild" its temporary files\.  Do the following to force the temporary files to rebuild:
+
+1. Stop the server.
+
+2. Delete the .wlnotdelete folder in 
+
+~~~~~~~
+mydomain/applications
+~~~~~~~
+.
+
+3. Restart the server.

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/weblogic.md
----------------------------------------------------------------------
diff --git a/source/core-developers/weblogic.md b/source/core-developers/weblogic.md
new file mode 100644
index 0000000..f84d389
--- /dev/null
+++ b/source/core-developers/weblogic.md
@@ -0,0 +1,121 @@
+---
+layout: core-developers
+title: WebLogic
+---
+
+# WebLogic
+
+
+When deploying to WebLogic, some developers report problems with the framework locating resources, especially with Velocity\. For more about WebLogic and Velocity, see the [Velocity website](http://wiki\.apache\.org/jakarta\-velocity/VelocityAndWeblogic)^[http://wiki\.apache\.org/jakarta\-velocity/VelocityAndWeblogic]\.
+
+| 
+
+To deploy to WebLogic, the common approach is to create and deploy an unexpanded WAR to the WebLogic deployment directory\. With WL 8\.x, the deployment directory is typically at \<bea\_home\>/user\_projects/domains/mydomain/\.
+
+> 
+
+#####Adding an struts\-velocity\.properties Configuration File#####
+
++ In the 
+
+~~~~~~~
+struts.properties
+~~~~~~~
+ file (usually kept in the 
+
+~~~~~~~
+WEB-INF/classes
+~~~~~~~
+ directory), add an entry that specifies a Velocity configuation file\.
+	
+
+  + 
+
+**struts\.properties**
+
+
+~~~~~~~
+
+struts.velocity.configfile = struts-velocity.properties
+
+~~~~~~~
+
++ Create the corresponding Velocity properties file ("struts\-velocity\.properties"), preferably in the same location as the 
+
+~~~~~~~
+struts.properties
+~~~~~~~
+ file\.
+
++ Copy into the Velocity properties file the contents of the 
+
+~~~~~~~
+velocity.properties
+~~~~~~~
+ file that is the the SAF 
+
+~~~~~~~
+velocity-dep.jar
+~~~~~~~
+\.
+
++ In your new 
+
+~~~~~~~
+struts-velocity.properties
+~~~~~~~
+ file, find he section titled  "
+
+~~~~~~~
+T E M P L A T E  L O A D E R S
+~~~~~~~
+", and change this section as so:
+
+
+
+~~~~~~~
+
+===========================================
+resource.loader = class
+
+file.resource.loader.description = Velocity File Resource Loader
+file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
+file.resource.loader.path = .
+file.resource.loader.cache = false
+file.resource.loader.modificationCheckInterval = 2
+
+class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+class.resource.loader.cache = true
+===========================================
+
+~~~~~~~
+
++ Redeploy a fresh WAR to WebLogic\.
+
+#####NPE when using Struts 2 Jasper Reports plugin#####
+
+When using mentioned plugin in Weblogic 11g you can get NullPointerException within Struts 2\. To solve the problem you must enable the "Archived Real Path" global property in Weblogic admin console \> configuration \> Web Applications\. It's because JasperReportsResult determines the report directory base on servletContext\.getRealPath(finalLocation)\.
+
+#####Convention based application doesn't work#####
+
+When you deployed an application that base on the Convention Plugin and you get an error messages that says:
+
+
+~~~~~~~
+
+There is no Action mapped for namespace / and action name xxxxxx
+
+~~~~~~~
+
+create struts\.properties file in WEB\-INF/classes folder (in the expanded application's folder or in the source code) with below statements:
+
+
+~~~~~~~
+
+#struts convention property modifications for Weblogic
+struts.convention.action.includeJars=.*?/yourwebapp.*?jar(!/)?
+struts.convention.action.fileProtocols=jar,zip
+
+~~~~~~~
+
+Thanks to Amit who the first published solution on his [blog](http://tech\-architecture\.blogspot\.com/2009/02/getting\-struts\-21\-to\-work\-in\-weblogic\.html)^[http://tech\-architecture\.blogspot\.com/2009/02/getting\-struts\-21\-to\-work\-in\-weblogic\.html]