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:31 UTC

[5/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/file-upload.md
----------------------------------------------------------------------
diff --git a/source/core-developers/file-upload.md b/source/core-developers/file-upload.md
new file mode 100644
index 0000000..aeee7bd
--- /dev/null
+++ b/source/core-developers/file-upload.md
@@ -0,0 +1,538 @@
+---
+layout: core-developers
+title: File Upload
+---
+
+# File Upload### {#PAGE_86602}
+
+The Struts 2 framework provides built\-in support for processing file uploads that conform to [RFC 1867](http://www\.ietf\.org/rfc/rfc1867\.txt)^[http://www\.ietf\.org/rfc/rfc1867\.txt], "Form\-based File Upload in HTML"\. When correctly configured the framework will pass uploaded file(s) into your Action class\. Support for individual and multiple file uploads are provided\. When a file is uploaded it will typically be stored in a temporary directory\. Uploaded files should be processed or moved by your Action class to ensure the data is not lost\. Be aware that servers may have a security policy in place that prohibits you from writing to directories other than the temporary directory and the directories that belong to your web application\.
+
+
+#####Dependencies#####
+
+The Struts 2 framework leverages add\-on libraries to handle the parsing of uploaded files\. These libraries are not included in the Struts distribution, you must add them into your project\. The libraries needed are:
+
+|Library|URL|Struts 2\.0\.x|Struts 2\.1\.x|Struts 2\.5\.x|
+|-------|---|--------------|--------------|--------------|
+|Commons\-FileUpload|[http://commons\.apache\.org/fileupload/](http://commons\.apache\.org/fileupload/)|1\.1\.1|1\.2\.1|1\.3\.2|
+|Commons\-IO|[http://commons\.apache\.org/io/](http://commons\.apache\.org/io/)|1\.0|1\.3\.2|2\.4|
+
+If you are using Maven then you can add these libraries as dependencies in your project's pom\.xml\.
+
+**Struts 2\.0\.x File Upload Dependencies**
+
+
+~~~~~~~
+<dependency>
+    <groupId>commons-fileupload</groupId>
+    <artifactId>commons-fileupload</artifactId>
+    <version>1.1.1</version>
+</dependency>
+<dependency>
+    <groupId>commons-io</groupId>
+    <artifactId>commons-io</artifactId>
+    <version>1.0</version>
+</dependency>
+
+~~~~~~~
+
+**Struts 2\.1\.x File Upload Dependencies**
+
+
+~~~~~~~
+<dependency>
+    <groupId>commons-fileupload</groupId>
+    <artifactId>commons-fileupload</artifactId>
+    <version>1.2.1</version>
+</dependency>
+<dependency>
+    <groupId>commons-io</groupId>
+    <artifactId>commons-io</artifactId>
+    <version>1.3.2</version>
+</dependency>
+
+~~~~~~~
+
+#####Basic Usage#####
+
+The 
+
+~~~~~~~
+org.apache.struts2.interceptor.FileUploadInterceptor
+~~~~~~~
+ class is included as part of the 
+
+~~~~~~~
+defaultStack
+~~~~~~~
+\. As long as the required libraries are added to your project you will be able to take advantage of of the Struts 2 fileUpload capability\. Configure an Action mapping for your Action class as you typically would\.
+
+**Example action mapping:**
+
+
+~~~~~~~
+<action name="doUpload" class="com.example.UploadAction">
+    <result name="success">good_result.jsp</result>
+</action>
+
+~~~~~~~
+
+A form must be create with a form field of type file, 
+
+~~~~~~~
+<INPUT type="file" name="upload">
+~~~~~~~
+\. The form used to upload the file must have its encoding type set to multipart/form\-data, 
+
+~~~~~~~
+<FORM action="doUpload" enctype="multipart/form-data" method="post">
+~~~~~~~
+\. The standard procedure for adding these elements is by using the Struts 2 tag libraries as shown in the following example:
+
+**Example JSP form tags:**
+
+~~~~~~~
+{snippet:id=example-form|lang=xml|javadoc=true|url=org.apache.struts2.interceptor.FileUploadInterceptor}
+~~~~~~~
+The fileUpload interceptor will use setter injection to insert the uploaded file and related data into your Action class\. For a form field named **upload** you would provide the three setter methods shown in the following example:
+
+**Example Action class:**
+
+
+~~~~~~~
+package com.example;
+
+   import java.io.File;
+   import com.opensymphony.xwork2.ActionSupport;
+
+   public class UploadAction extends ActionSupport {
+      private File file;
+      private String contentType;
+      private String filename;
+
+      public void setUpload(File file) {
+         this.file = file;
+      }
+
+      public void setUploadContentType(String contentType) {
+         this.contentType = contentType;
+      }
+
+      public void setUploadFileName(String filename) {
+         this.filename = filename;
+      }
+
+      public String execute() {
+         //...
+         return SUCCESS;
+      }
+ }
+
+~~~~~~~
+
+The purpose of each one of these methods is described in the table below\. Notice that if you have multiple file form elements with different names you would be required to have another corresponding set of these methods for each file uploaded\.
+
+|Method Signature|Description|
+|----------------|-----------|
+|setX(File file)|The file that contains the content of the uploaded file\. This is a temporary file and file\.getName() will not return the original name of the file|
+|setXContentType(String contentType)|The mime type of the uploaded file|
+|setXFileName(String fileName)|The actual file name of the uploaded file (not the HTML name)|
+
+#####Uploading Multiple Files#####
+
+As mentioned in the previous section one technique for uploading multiple files would be to simply have multiple form input elements of type file all with different names\. This would require a number of setter methods that was equal to 3 times the number of files being uploaded\. Another option is to use Arrays or java\.util\.Lists\. The following examples are taken from the Showcase example application that is part sample applications you can download at [http://struts\.apache\.org/download\.cgi](http://struts\.apache\.org/download\.cgi)\. For the Action mapping details see 
+
+~~~~~~~
+struts-fileupload.xml
+~~~~~~~
+ in the sample application download\.
+
+__Uploading Multiple Files using Arrays__
+
+**multipleUploadUsingArray\.jsp** Notice all file input types have the same name\.
+
+
+~~~~~~~
+<s:form action="doMultipleUploadUsingArray" method="POST" enctype="multipart/form-data">
+  <s:file label="File (1)" name="upload" />
+  <s:file label="File (2)" name="upload" />
+  <s:file label="FIle (3)" name="upload" />
+  <s:submit cssClass="btn btn-primary"/>
+</s:form>
+~~~~~~~
+
+**MultipleFileUploadUsingArrayAction\.java**
+
+ 
+
+**
+**
+
+
+~~~~~~~
+public class MultipleFileUploadUsingArrayAction extends ActionSupport {
+	private File[] uploads;
+	private String[] uploadFileNames;
+	private String[] uploadContentTypes;
+
+	public String upload() throws Exception {
+		System.out.println("\n\n upload2");
+		System.out.println("files:");
+		for (File u : uploads) {
+			System.out.println("*** " + u + "\t" + u.length());
+		}
+		System.out.println("filenames:");
+		for (String n : uploadFileNames) {
+			System.out.println("*** " + n);
+		}
+		System.out.println("content types:");
+		for (String c : uploadContentTypes) {
+			System.out.println("*** " + c);
+		}
+		System.out.println("\n\n");
+		return SUCCESS;
+	}
+	public File[] getUpload() {
+		return this.uploads;
+	}
+	public void setUpload(File[] upload) {
+		this.uploads = upload;
+	}
+	public String[] getUploadFileName() {
+		return this.uploadFileNames;
+	}
+	public void setUploadFileName(String[] uploadFileName) {
+		this.uploadFileNames = uploadFileName;
+	}
+	public String[] getUploadContentType() {
+		return this.uploadContentTypes;
+	}
+	public void setUploadContentType(String[] uploadContentType) {
+		this.uploadContentTypes = uploadContentType;
+	}
+}
+~~~~~~~
+
+ 
+
+__Uploading Multiple Files using Lists__
+
+**multipleUploadUsingList\.jsp** Notice all file input types have the same name\.
+
+
+~~~~~~~
+<s:form action="doMultipleUploadUsingList" method="POST" enctype="multipart/form-data">
+  <s:file label="File (1)" name="upload" />
+  <s:file label="File (2)" name="upload" />
+  <s:file label="FIle (3)" name="upload" />
+  <s:submit cssClass="btn btn-primary"/>
+</s:form>
+~~~~~~~
+
+**MultipleFileUploadUsingListAction\.java**
+
+
+~~~~~~~
+public class MultipleFileUploadUsingListAction extends ActionSupport {
+	private List<File> uploads = new ArrayList<File>();
+	private List<String> uploadFileNames = new ArrayList<String>();
+	private List<String> uploadContentTypes = new ArrayList<String>();
+
+	public List<File> getUpload() {
+		return this.uploads;
+	}
+	public void setUpload(List<File> uploads) {
+		this.uploads = uploads;
+	}
+	public List<String> getUploadFileName() {
+		return this.uploadFileNames;
+	}
+	public void setUploadFileName(List<String> uploadFileNames) {
+		this.uploadFileNames = uploadFileNames;
+	}
+	public List<String> getUploadContentType() {
+		return this.uploadContentTypes;
+	}
+	public void setUploadContentType(List<String> contentTypes) {
+		this.uploadContentTypes = contentTypes;
+	}
+	public String upload() throws Exception {
+		System.out.println("\n\n upload1");
+		System.out.println("files:");
+		for (File u : uploads) {
+			System.out.println("*** " + u + "\t" + u.length());
+		}
+		System.out.println("filenames:");
+		for (String n : uploadFileNames) {
+			System.out.println("*** " + n);
+		}
+		System.out.println("content types:");
+		for (String c : uploadContentTypes) {
+			System.out.println("*** " + c);
+		}
+		System.out.println("\n\n");
+		return SUCCESS;
+	}
+}
+~~~~~~~
+
+#####Advanced Configuration#####
+
+The Struts 2 
+
+~~~~~~~
+default.properties
+~~~~~~~
+ file defines several settings that affect the behavior of file uploading\. You may find in necessary to change these values\. The names and default values are:
+
+
+~~~~~~~
+struts.multipart.parser=jakarta
+struts.multipart.saveDir=
+struts.multipart.maxSize=2097152
+
+~~~~~~~
+
+
+
+| Please remember that the **struts\.multipart\.maxSize** is the size limit of the whole request, which means when you uploading multiple files, the sum of their size must be below the **struts\.multipart\.maxSize**\!
+
+| 
+
+In order to change theses settings you define a constant in your applications 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+ file like so:
+
+
+~~~~~~~
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE struts PUBLIC 
+	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
+	"http://struts.apache.org/dtds/struts-2.0.dtd">
+<struts>
+    <constant name="struts.multipart.maxSize" value="1000000" />
+    ...
+</struts>
+
+~~~~~~~
+
+Additionally the 
+
+~~~~~~~
+fileUpload
+~~~~~~~
+ interceptor has settings that can be put in place for individual action mappings by customizing your interceptor stack\.
+
+
+~~~~~~~
+<action name="doUpload" class="com.example.UploadAction">
+    <interceptor-ref name="basicStack"/>
+    <interceptor-ref name="fileUpload">
+        <param name="allowedTypes">text/plain</param>
+    </interceptor-ref> 
+    <interceptor-ref name="validation"/>
+    <interceptor-ref name="workflow"/>
+
+    <result name="success">good_result.jsp</result>
+</action>
+
+~~~~~~~
+
+__File Size Limits__
+
+There are two separate file size limits\. First is 
+
+~~~~~~~
+struts.multipart.maxSize
+~~~~~~~
+ which comes from the Struts 2 
+
+~~~~~~~
+default.properties
+~~~~~~~
+ file\. This setting exists for security reasons to prohibit a malicious user from uploading extremely large files to file up your servers disk space\. This setting defaults to approximately 2 megabytes and should be adjusted to the maximum size file (2 gigs max) that your will need the framework to receive\. If you are uploading more than one file on a form the 
+
+~~~~~~~
+struts.multipart.maxSize
+~~~~~~~
+ applies to the combined total, not the individual file sizes\. The other setting, 
+
+~~~~~~~
+maximumSize
+~~~~~~~
+, is an interceptor setting that is used to ensure a particular Action does not receive a file that is too large\. Notice the locations of both settings in the following example:
+
+
+~~~~~~~
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE struts PUBLIC 
+	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
+	"http://struts.apache.org/dtds/struts-2.0.dtd">
+<struts>
+    <constant name="struts.multipart.maxSize" value="1000000" />
+    
+    <action name="doUpload" class="com.example.UploadAction">
+        <interceptor-ref name="basicStack"/>
+        <interceptor-ref name="fileUpload">
+            <param name="maximumSize">500000</param>
+        </interceptor-ref> 
+        <interceptor-ref name="validation"/>
+        <interceptor-ref name="workflow"/>
+
+        <result name="success">good_result.jsp</result>
+    </action>
+</struts>
+
+~~~~~~~
+
+__File Types__
+
+There are two ways to limit the uploaded file type, declaratively and programmatically\. To declaratively limit the file type a comma separated list of allowedTypes can be specified as a fileUpload interceptor param as shown in the following example:
+
+
+~~~~~~~
+<action name="doUpload" class="com.example.UploadAction">
+    <interceptor-ref name="basicStack"/>
+    <interceptor-ref name="fileUpload">
+        <param name="allowedTypes">image/jpeg,image/gif</param>
+    </interceptor-ref> 
+    <interceptor-ref name="validation"/>
+    <interceptor-ref name="workflow"/>
+
+    <result name="success">good_result.jsp</result>
+</action>
+
+~~~~~~~
+
+When the uploaded file type does not match one of the MIME types specified a field error will be created as described in the next section entitled Error Messages\. Programmatically limiting the file type means using the information passed in to your Action class via the 
+
+~~~~~~~
+setXContentType(String contentType)
+~~~~~~~
+ method\. The benefit to this type of approach would be that it's more flexible and no interceptor configuration would be needed if file sizes are keep under 2 megs\.
+
+__Error Messages__
+
+If an error occurs several field errors will be added assuming that the action implements 
+
+~~~~~~~
+com.opensymphony.xwork2.ValidationAware
+~~~~~~~
+ or extends 
+
+~~~~~~~
+com.opensymphony.xwork2.ActionSupport
+~~~~~~~
+\. These error messages are based on several i18n values stored in struts\-messages\.properties, a default i18n file processed for all i18n requests\. You can override the text of these messages by providing text for the following keys:
+
+|Error Key|Description|
+|---------|-----------|
+|struts\.messages\.error\.uploading|A general error that occurs when the file could not be uploaded|
+|struts\.messages\.error\.file\.too\.large|Occurs when the uploaded file is too large as specified by maximumSize\.|
+|struts\.messages\.error\.content\.type\.not\.allowed|Occurs when the uploaded file does not match the expected content types specified|
+|struts\.messages\.error\.file\.extension\.not\.allowed|Occurs when uploaded file has disallowed extension|
+|struts\.messages\.upload\.error\.SizeLimitExceededException|Occurs when the upload request (as a whole) exceed configured **struts\.multipart\.maxSize**|
+|struts\.messages\.upload\.error\.\<Exception class SimpleName\>|Occurs when any other exception took place during file upload process|
+
+__Temporary Directories__
+
+All uploaded files are saved to a temporary directory by the framework before being passed in to an Action\. Depending on the allowed file sizes it may be necessary to have the framework store these temporary files in an alternate location\. To do this change 
+
+~~~~~~~
+struts.multipart.saveDir
+~~~~~~~
+ to the directory where the uploaded files will be placed\. If this property is not set it defaults to 
+
+~~~~~~~
+javax.servlet.context.tempdir
+~~~~~~~
+\. Keep in mind that on some operating systems, like Solaris, 
+
+~~~~~~~
+/tmp
+~~~~~~~
+ is memory based and files stored in that directory would consume an amount of RAM approximately equal to the size of the uploaded file\.
+
+__Alternate Libraries__
+
+The 
+
+~~~~~~~
+struts.multipart.parser
+~~~~~~~
+ used by the fileUpload interceptor to handle HTTP POST requests, encoded using the MIME\-type multipart/form\-data, can be changed out\. Currently there are two choices, jakarta and pell\. The jakarta parser is a standard part of the Struts 2 framework needing only its required libraries added to a project\. The pell parser uses Jason Pell's multipart parser instead of the Commons\-FileUpload library\. The pell parser is a Struts 2 plugin, for more details see: _pell multipart plugin_ \. There was a third alternative, cos, but it was removed due to licensing incompatibilities\.
+
+As from Struts version 2\.3\.18 a new implementation of 
+
+~~~~~~~
+MultiPartRequest
+~~~~~~~
+ was added \- 
+
+~~~~~~~
+JakartaStreamMultiPartRequest
+~~~~~~~
+\. It can be used to handle large files, see [WW\-3025](https://issues\.apache\.org/jira/browse/WW\-3025)^[https://issues\.apache\.org/jira/browse/WW\-3025] for more details, but you can simple set
+
+
+
+> \<constant name="struts\.multipart\.parser" value="jakarta\-stream" /\>
+
+in struts\.xml to start using it\.
+
+__Request validation__
+
+The 
+
+~~~~~~~
+struts.multipart.validationRegex
+~~~~~~~
+ is used to define a RegEx to be used to validate if the incoming request is a multipart request\. The request must use the 
+
+~~~~~~~
+POST
+~~~~~~~
+ method and match the RegEx, by default the RegEx is defined as follow:
+
+
+~~~~~~~
+^multipart\\/form-data(; boundary=[a-zA-Z0-9]{1,70})?
+~~~~~~~
+
+Please read [RFC1341](https://www\.w3\.org/Protocols/rfc1341/7\_2\_Multipart\.html)^[https://www\.w3\.org/Protocols/rfc1341/7\_2\_Multipart\.html] the **Multipart section** for more details, existing Struts 
+
+~~~~~~~
+Multipart
+~~~~~~~
+ parsers support only 
+
+~~~~~~~
+multipart/form-data
+~~~~~~~
+ content type\. This option is available since Struts 2\.3\.11\.
+
+__Disabling file upload support__
+
+You can alternatively disable the whole file upload mechanism defining a constant in 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+:
+
+
+~~~~~~~
+<constant name="struts.multipart.enabled" value="false"/>
+~~~~~~~
+
+With this constant in place, Struts will ignore a 
+
+~~~~~~~
+Content-Type
+~~~~~~~
+ header and will treat each request as an ordinary http request\. This option is available since Struts 2\.3\.11\.
+
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/formatting-dates-and-numbers.md
----------------------------------------------------------------------
diff --git a/source/core-developers/formatting-dates-and-numbers.md b/source/core-developers/formatting-dates-and-numbers.md
new file mode 100644
index 0000000..e96a212
--- /dev/null
+++ b/source/core-developers/formatting-dates-and-numbers.md
@@ -0,0 +1,111 @@
+---
+layout: core-developers
+title: Formatting Dates and Numbers
+---
+
+# Formatting Dates and Numbers
+
+####Defining Formats####
+
+Struts2 supports localization (l10n) aware formatting of dates, times and numbers very easily, utilizing Java's built\-in date formatting features\.
+
+As seen in the [Localization](#PAGE_14043) chapter, it is quite easy to define hierarchical resource bundles with Struts2, giving the developer the opportunity to define locale dependent message formats\. This is the entry point to define the needed date, time and number formats\. Your default properties could contain the following generic formats:
+
+
+~~~~~~~
+
+format.time = {0,time}
+format.number = {0,number,#0.0##}
+format.percent = {0,number,##0.00'%'}
+format.money = {0,number,\u00A4##0.00}
+
+~~~~~~~
+
+An appropriate en\_US format definition extension could look like this:
+
+
+~~~~~~~
+
+format.date = {0,date,MM/dd/yy}
+
+~~~~~~~
+
+In parallel, you could add the following to your de\_DE bundle:
+
+
+~~~~~~~
+
+format.date = {0,date,dd.MM.yyyy}
+
+~~~~~~~
+
+Read more on how to define message formats in Sun's Java API docs for [MessageFormat](http://java\.sun\.com/j2se/1\.5\.0/docs/api/java/text/MessageFormat\.html)^[http://java\.sun\.com/j2se/1\.5\.0/docs/api/java/text/MessageFormat\.html]\.
+
+Now that we have our formats set up, it is quite easy to use them in our views\.
+
+####Formatting output using the s:text tag####
+
+Given you had a Float value myMoneyValue, accessible through the getter getMyMoneyValue in your action, the following code would print out localized representation of the value as a currency amount, using the format\.money message format defined above with a _s:text_  tag:
+
+
+~~~~~~~
+
+<s:text name="format.money">
+    <s:param name="value" value="myMoneyValue"/>
+</s:text>
+
+~~~~~~~
+
+The (first) parameter defines the value which is to replace the '0' placeholder in the defined message format\.
+
+Another example, formatting a date value:
+
+
+~~~~~~~
+
+<s:text name="format.date"><s:param value="dueDate"/></s:text>
+
+~~~~~~~
+
+
+
+| While the s:text tag is very useful to format numbers, date formatting has become a lot easier thanks to the _s:date_  tag\.
+
+| 
+
+####Localizing form data with getText####
+
+Placing a textfield in a form like this
+
+
+~~~~~~~
+
+<s:textfield key="orderItem.price" />
+
+~~~~~~~
+
+to input a number, one might have noticed that the number is always shown in the Java default number format\. Not only that this is not "nice", if you are in a non\-en locale, it will also cause trouble when submitting the form since type conversion is locale aware\. The solution is to again use the message formats as defined above, by using the getText Method of ActionSupport:
+
+
+~~~~~~~
+
+<s:textfield key="orderItem.price" value="%{getText('format.number',{orderItem.price})}" />
+
+~~~~~~~
+
+This maps to the method signature getText( String key, Object\[\] params ) in ActionSupport\.
+
+####Using getFormatted() with conversion support####
+
+A new method getFormatted was added to ActionSupport (which can be implemented in your base action) to support formatting and conversion errors with I10N\.
+
+You can place a code like below
+
+
+~~~~~~~
+
+<s:textfield key="user.born" value="%{getFormatted('format.number','user.born')}" />
+
+~~~~~~~
+
+to get support for I10N and also to support conversion errors\.

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/freemarker-result.md
----------------------------------------------------------------------
diff --git a/source/core-developers/freemarker-result.md b/source/core-developers/freemarker-result.md
new file mode 100644
index 0000000..1af5b44
--- /dev/null
+++ b/source/core-developers/freemarker-result.md
@@ -0,0 +1,67 @@
+---
+layout: core-developers
+title: FreeMarker Result
+---
+
+# FreeMarker Result
+
+Renders a view using the Freemarker template engine\. The 
+
+~~~~~~~
+FreemarkarManager
+~~~~~~~
+ class configures the template loaders so that the template location can be either
+
++ relative to the web root folder, e\.g\.: 
+
+~~~~~~~
+/WEB-INF/views/home.ftl
+~~~~~~~
+
++ a classpath resource, e\.g\.: 
+
+~~~~~~~
+/com/company/web/views/home.ftl
+~~~~~~~
+
+ 
+
+Also see [Freemarker Support](freemarker-support.html).
+
+#####Parameters#####
+
++ **location** (default) \- the location of the template to process\.
+
++ **parse **\- true by default\. If set to false, the location param will not be parsed for expressions\.
+
++ **contentType** \- defaults to 
+
+~~~~~~~
+text/html
+~~~~~~~
+ unless specified\.
+
++ **writeIfCompleted** \- 
+
+~~~~~~~
+false
+~~~~~~~
+ by default, write to stream only if there isn't any error processing the template\. Setting 
+
+~~~~~~~
+template_exception_handler=rethrow
+~~~~~~~
+ in 
+
+~~~~~~~
+freemarker.properties
+~~~~~~~
+ will have the same effect\.
+
+#####Examples#####
+
+
+
+~~~~~~~
+<result name="success" type="freemarker">foo.ftl</result>
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/freemarker-support.md
----------------------------------------------------------------------
diff --git a/source/core-developers/freemarker-support.md b/source/core-developers/freemarker-support.md
new file mode 100644
index 0000000..70b7118
--- /dev/null
+++ b/source/core-developers/freemarker-support.md
@@ -0,0 +1,211 @@
+---
+layout: core-developers
+title: Freemarker Support
+---
+
+# Freemarker Support
+
+Freemarker views can be rendered using the webwork result type 
+
+~~~~~~~
+freemarker
+~~~~~~~
+\.
+
+__Configure your action to use the freemarker result type__
+
+The 
+
+~~~~~~~
+freemarker
+~~~~~~~
+ result type is defined in 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+, so normally you just include it, and define your resuts to use 
+
+~~~~~~~
+type="freemarker"
+~~~~~~~
+\.
+
+
+~~~~~~~
+<include file="struts-default.xml"/>
+...
+<action name="test" class="package.Test">
+  <result name="success" type="freemarker">/WEB-INF/views/testView.ftl</result>
+</action>
+...
+
+~~~~~~~
+
+__Property Resoloution__
+
+Your action properties are automatically resolved \- just like in a velocity view\.
+
+**for example**
+
+~~~~~~~
+${name
+~~~~~~~
+\} will result in 
+
+~~~~~~~
+stack.findValue("name")
+~~~~~~~
+, which _generaly_  results in 
+
+~~~~~~~
+action.getName()
+~~~~~~~
+ being executed\.
+
+A search process is used to resolve the variable, searching the following scopes in order, until a value is found :
+
++ freemarker variables
+
++ value stack
+
++ request attributes
+
++ session attributes
+
++ servlet context attributes
+
+__Objects in the Context__
+
+The following variables exist in the FreeMarker views
+
++ 
+
+~~~~~~~
+req
+~~~~~~~
+ \- the current HttpServletRequest
+
++ 
+
+~~~~~~~
+res
+~~~~~~~
+ \- the current HttpServletResponse
+
++ 
+
+~~~~~~~
+stack
+~~~~~~~
+ \- the current OgnlValueStack
+
++ 
+
+~~~~~~~
+ognl
+~~~~~~~
+ \- the OgnlTool instance
+
+  + This class contains useful methods to execute OGNL expressions against arbitary objects, and a method to generate a select list using the \<s:select\> pattern\. (i\.e\. taking the name of the list property, a listKey and listValue)
+
++ 
+
+~~~~~~~
+struts
+~~~~~~~
+ \- an instance of StrutsBeanWrapper
+
++ 
+
+~~~~~~~
+action
+~~~~~~~
+ \- the current Struts action
+
++ 
+
+~~~~~~~
+exception
+~~~~~~~
+ \- _optional_  the Exception instance, if the view is a JSP exception or Servlet exception view
+
+__FreeMarker configuration with recent releases__
+
+To configure the freemarker engine that Struts uses, just add a file 
+
+~~~~~~~
+freemarker.properties
+~~~~~~~
+ to the classpath\. The supported properties are those that the Freemarker Configuration object expects \- see the [Freemarker documentation](http://freemarker\.org/docs/api/freemarker/template/Configuration\.html\#setSetting(java\.lang\.String,%20java\.lang\.String))^[http://freemarker\.org/docs/api/freemarker/template/Configuration\.html\#setSetting(java\.lang\.String,%20java\.lang\.String)] for these\.
+
+
+~~~~~~~
+default_encoding=ISO-8859-1
+template_update_delay=5
+locale=no_NO
+
+~~~~~~~
+
+__Using struts UI tags \- or any JSP Tag Library__
+
+Freemarker has builtin support for using any JSP taglib\. You can use JSP taglibs in FreeMarker even if
+ a) your servlet container has no support for JSP, or 
+ b) you didn't specify the taglib in your web\.xml \- note how in the example below we refer to the taglib by its webapp\-absolute URL, so no configuration in web\.xml is needed\.
+
+
+~~~~~~~
+<#assign s=JspTaglibs["/WEB-INF/struts.tld"] />
+
+<@s.form method="'post'" name="'inputform'" action="'save.action'" >
+    <@s.hidden name="'id'" />
+    <@s.textarea label="'Details'" name="'details'" rows=5 cols=40 />
+    <@s.submit value="'Save'" align="center" />
+</...@s.form>
+
+~~~~~~~
+
+NOTE : numeric properties for tags MUST be numbers, not strings\. as in the rows and cols properties above\. if you use cols="40" you will receive an exception\. Other than that, the freemarker tag container behaves as you would expect\.
+
+__Dynamic attributes support__
+
+You can specify dynamic attributes with Struts 2 tags like this:
+
+
+~~~~~~~
+<@s.textfield name="test" dynamicAttributes={"placeholder":"input","foo":"bar"}/>
+
+~~~~~~~
+
+or like this:
+
+
+~~~~~~~
+<@s.textfield name="test" placeholder="input" foo="bar"/>
+
+~~~~~~~
+
+and for both case, it will be parsed into:
+
+
+~~~~~~~
+<input type="text" name="test" value="" id="test" placeholder="input" foo="bar"/>
+
+~~~~~~~
+
+You can also use OGNL expressions with dynamic tags like below:
+
+
+~~~~~~~
+<@s.textfield name="test" placeholder="input" foo="checked: %{bar}"/>
+
+~~~~~~~
+
+When using attributes with hyphens, use the below syntax (you can also leave the single quotes from false if you want)
+
+
+~~~~~~~
+<@s.form dynamicAttributes={'data-ajax':'false'}>
+  ...
+</...@s.form>
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/glassfish-2-x.md
----------------------------------------------------------------------
diff --git a/source/core-developers/glassfish-2-x.md b/source/core-developers/glassfish-2-x.md
new file mode 100644
index 0000000..bfc1dec
--- /dev/null
+++ b/source/core-developers/glassfish-2-x.md
@@ -0,0 +1,23 @@
+---
+layout: core-developers
+title: Glassfish 2.x
+---
+
+# Glassfish 2.x
+
+__Convention plugin support__
+
+To have proper support of the _Convention Plugin_  in Glassfish 2\.x when packed as EAR archive add the following constant to 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+
+
+
+~~~~~~~
+<constant name="struts.convention.exclude.parentClassLoader" value="false" />
+
+~~~~~~~
+
+Thanks to [pavpal](http://stackoverflow.com/a/22490925/1805267)!

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

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/https-and-ie-issues.md
----------------------------------------------------------------------
diff --git a/source/core-developers/https-and-ie-issues.md b/source/core-developers/https-and-ie-issues.md
new file mode 100644
index 0000000..25aea47
--- /dev/null
+++ b/source/core-developers/https-and-ie-issues.md
@@ -0,0 +1,37 @@
+---
+layout: core-developers
+title: HTTPS and IE Issues
+---
+
+# HTTPS and IE Issues
+
+ When trying to stream PDF's, TIFF's, and various other types of content over HTTPS to certain versions of Internet Explorer you may trigger a creative (broken) interpretation of the HTTP spec\. The following interceptor should be applied to your actions to set the HTTP headers cache settings to private\. This should avoid the issue\. (You should \*only\* do this if you are running over HTTPS\!)
+
+
+~~~~~~~
+
+package org.tuxbot.ww.interceptor;
+
+import com.opensymphony.xwork.interceptor.AroundInterceptor;
+import com.opensymphony.xwork.ActionInvocation;
+import com.opensymphony.webwork.ServletActionContext;
+
+import javax.servlet.http.HttpServletResponse;
+/**
+ * This interceptor sets the the HTTP Header to work around IE SSL weirdness  *
+ * @author Eric Molitor <a href="mailto:eric@tuxbot.com">eric@tuxbot.com</a>
+ * @version 1.0
+ */
+public class HTTPRequestCachePrivateInterceptor extends AroundInterceptor {
+
+    protected void after(ActionInvocation actionInvocation, String string) throws Exception {
+        // Nothing
+    }
+
+    protected void before(ActionInvocation actionInvocation) throws Exception {
+        HttpServletResponse res = (HttpServletResponse) actionInvocation.getInvocationContext().get(ServletActionContext.HTTP_RESPONSE);
+        res.setHeader("CACHE-CONTROL", "PRIVATE");
+    }
+}
+
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/i18n-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/i18n-interceptor.md b/source/core-developers/i18n-interceptor.md
new file mode 100644
index 0000000..d9ca8ba
--- /dev/null
+++ b/source/core-developers/i18n-interceptor.md
@@ -0,0 +1,40 @@
+---
+layout: core-developers
+title: I18n Interceptor
+---
+
+# I18n Interceptor
+
+#####Description#####
+
+An interceptor that handles setting the locale specified in a session as the locale for the current action request\. In addition, this interceptor will look for a specific HTTP request parameter and set the locale to whatever value is provided, it also looks for specific cookie to read locale from\. This means that this interceptor can be used to allow for your application to dynamically change the locale for the user's session or, alternatively, only for the current  request\. This is very useful for applications that require multi\-lingual support and want the user to be able to set his or her language preference at any point\. The locale parameter is removed during the execution of this interceptor, ensuring that properties aren't set on an action (such as request\_locale) that have no typical corresponding setter in your action\.
+
+For example, using the default parameter name, a request to **foo\.action?request\_locale=en\_US**, then the locale for US English is saved in the user's session and will be used for all future requests\. If there is no locale set (for example with the first visit), the interceptor uses the browser locale\.
+
+#####Parameters#####
+
++ **parameterName** (optional) \- the name of the HTTP request parameter that dictates the locale to switch to and save in the session\. By default this is **request\_locale**
+
++ **requestCookieParameterName** (optional) \- the name of the HTTP request parameter that dictates the locale to switch to and save in a cookie\. By default this is **request\_cookie\_locale**
+
++ **requestOnlyParameterName** (optional) \- the name of the HTTP request parameter that dictates the locale to switch to for the current request only, without saving it in the session\. By default this is **request\_only\_locale**
+
++ **attributeName** (optional) \- the name of the session key to store the selected locale\. By default this is **WW\_TRANS\_I18N\_LOCALE**
+
++ **localeStorage** (optional) \- the name of storage location, it can be **none**, **session** or **cookie**\. By default this is **session**
+
+#####Examples#####
+
+
+
+~~~~~~~
+<interceptor name="i18nCookie" class="org.apache.struts2.interceptor.I18nInterceptor"/>
+
+<action name="someAction" class="com.examples.SomeAction">
+    <interceptor-ref name="i18nCookie">
+        <param name="localeStorage">cookie</param>
+    </interceptor-ref>
+    <interceptor-ref name="basicStack"/>
+    <result name="success">good_result.ftl</result>
+</action>
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/include-configuration.md
----------------------------------------------------------------------
diff --git a/source/core-developers/include-configuration.md b/source/core-developers/include-configuration.md
new file mode 100644
index 0000000..2a3dbf1
--- /dev/null
+++ b/source/core-developers/include-configuration.md
@@ -0,0 +1,43 @@
+---
+layout: core-developers
+title: Include Configuration
+---
+
+# Include Configuration
+
+A popular strategy is "divide and conquer"\. The framework lets you apply "divide and conquer" to configuration files using the 
+
+~~~~~~~
+<include .../>
+~~~~~~~
+ element\.
+
+
+~~~~~~~
+
+<!DOCTYPE struts PUBLIC
+  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+  "http://struts.apache.org/dtds/struts-2.0.dtd">
+<struts>
+    <include file="Home.xml"/>
+    <include file="Hello.xml"/>
+    <include file="Simple.xml"/>
+    <include file="/util/POJO.xml"/>
+    <include file="/com/initech/admin/admin-struts.xml"/>
+</struts>
+
+~~~~~~~
+
+Each included file must be in the same format as 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+, including the 
+
+~~~~~~~
+DOCTYPE
+~~~~~~~
+\. The include files can be placed anywhere on the classpath and should be referred to by that path by the "file" attribute\.
+
+In a large\-team environment, the include files can be used to organize different modules of the application that are being developed by different team members\. 

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/index.md
----------------------------------------------------------------------
diff --git a/source/core-developers/index.md b/source/core-developers/index.md
new file mode 100644
index 0000000..2760641
--- /dev/null
+++ b/source/core-developers/index.md
@@ -0,0 +1,66 @@
+---
+layout: default
+title: Core Developers Guide (WIP)
+---
+
+# Core Developers Guide (WIP)
+
+Struts 2 processes requests using three core types: [interceptors](interceptor-configuration.html), [actions](#PAGE_14122), and [results](result-configuration.html). 
+Each may be configured via XML or annotations.
+
+## Developing Applications with Struts 2
+
+- [Nutshell](nutshell.html)
+- [AJAX](ajax.html)
+- [Dependency Injection](dependency-injection.html)
+- [Debugging](debugging.html)
+- [Development Mode](development-mode.html)
+
+## Configuration
+
+- [Configuration by Convention] - export https://cwiki.apache.org/confluence/display/WW/Convention+Plugin
+- [Annotations](annotations.html)
+- [Configuration Elements](configuration-elements.html)
+  - [Actions](action-configuration.html), [Wildcard Mappings](wildcard-mappings.html), [Beans](bean-configuration.html), [Constants](constant-configuration.html)
+  - [Exceptions](exceptio-configuration.html), [Includes](include-configuration.html), [Interceptors](interceptor-configuration.html)
+  - [Namespaces](namespace-configuration.html), [Packages](package-configuration.html), [Results](result-configuration.html)
+  - [Unknown Handlers](unknown-handlers.html), [Dispatcher](dispatcher.html)
+- [Configuration Files](configuration-files.html)
+  - [web.xml](web-xml.html)
+  - [struts.xml](struts-xml.html)
+  - [struts.properties](struts-properties.html)
+  - [struts-default.xml](struts-default-xml.html)
+  - [velocity.properties](velocity-properties.html)
+  - [struts\-default\.vm](struts-default-vm.html)
+- [Application Servers](application-servers.html)
+- [Performance Tuning](performance-tuning.html)
+- [Security](../security/)
+- [Testing Actions] - export https://cwiki.apache.org/confluence/display/WW/Testing+Actions
+  - [(arsenalist)](https://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/)
+  - [(rosa)](http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20\.html)
+- [Interceptors](interceptors.html)
+  - [Writing Interceptors](writing-interceptors.html)
+  - [Excluding Parameters](parameters-interceptor.html)
+- Actions
+  - [Model Driven](model-driven.html)
+  - [Action Chaining](action-chaining.html)
+  - [ActionEventListener](action-event-listener.html)
+- Results
+  - [Result Types](result-types.html)
+  - [DispatcherListener](dispatcher-listener.html)
+  - [PreResultListener](pre-result-listener.html)
+- [Validation](validation.html)
+- [Localization](localization.html)
+  - [Formatting Dates and Numbers](formatting-dates-and-numbers.html)
+- [Type Conversion](type-conversion.html)
+- [Static Content](static-content.html)
+- Portlets
+  - [Tutorial] - export https://cwiki.apache.org/confluence/display/WW/Struts+2+Portlet+Tutorial
+  - [Configuration/Documentation] - export https://cwiki.apache.org/confluence/display/WW/Portlet+Plugin
+- [Logging](logging.html)
+- [Accessing application, session, request objects](accessing-application-session-request-objects.html)
+- [Action Mapper & Action Mapping](action-mapper-and-action-mapping.html)
+- [Action Proxy & ActionProxy Factory](action-proxy-and-actionproxy-factory.html)
+- [FAQs]
+  - [Struts 2 Maven Archetypes](#PAGE_108820)\
+  - [Cookbook]

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

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

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

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/interceptor-configuration.md
----------------------------------------------------------------------
diff --git a/source/core-developers/interceptor-configuration.md b/source/core-developers/interceptor-configuration.md
new file mode 100644
index 0000000..8b202f8
--- /dev/null
+++ b/source/core-developers/interceptor-configuration.md
@@ -0,0 +1,68 @@
+---
+layout: core-developers
+title: Interceptor Configuration
+---
+
+# Interceptor Configuration
+
+Interceptors allow you to define code to be executed before and/or after the execution of an Action method\. (The "Filter" pattern\.) Interceptors can be a powerful tool when developing applications\. There are many, many use cases for Interceptors, including validation, property population, security, logging, and profiling\.
+
+| Validation | Examine input for correctness |
+|------------|-------------------------------|
+| Property Population | Transfer and convert input to object properties |
+| Logging | Journal details regarding each action |
+| Profiling | Time action throughput, looking for performance bottlenecks |
+
+Interceptors can be chained together to create an Interceptor "Stack"\. If an action neeeds to check the client's credentials, log the action, and time the action, all of these routines, and more, could be made part of the same Interceptor Stack\.
+
+Interceptors are implemented as Java classes, so each Interceptor has a class name\. To make it easier to reference Interceptors, each class can be registered with the framework and given a unique, simpler name\.
+
+**Registering Interceptors**
+
+
+~~~~~~~
+
+<interceptors>
+  <interceptor name="security" class="com.company.security.SecurityInterceptor"/>
+  <interceptor-stack name="secureStack">
+    <interceptor-ref name="security"/>
+    <interceptor-ref name="defaultStack"/>
+  </interceptor-stack>
+</interceptors>
+
+~~~~~~~
+
+ (ok)  Individual Interceptors and Interceptors Stacks can be "mixed and matched" in any order when defining an Interceptor Stack\.
+
+ (ok)  The framework will invoke each Interceptor on the stack **in the order it is defined**\.
+
+Most applications will define a default Interceptor Stack, such as
+
+
+
+~~~~~~~
+<default-interceptor-ref name="secureStack"/>
+~~~~~~~
+
+but any action may also define its own local stack\.
+
+**A local Interceptor Stack**
+
+
+~~~~~~~
+
+<action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter">
+    <result name="success">...</result>
+    <interceptor-ref name="defaultComponentStack"/>
+</action>
+
+~~~~~~~
+
+The default configuration (
+
+~~~~~~~
+
+~~~~~~~
+) sets up a default Interceptor Stack that will work well for most applications\.
+
+(light\-on) For more, see [Interceptors](interceptors.html).
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/interceptors.md
----------------------------------------------------------------------
diff --git a/source/core-developers/interceptors.md b/source/core-developers/interceptors.md
new file mode 100644
index 0000000..7ad24d3
--- /dev/null
+++ b/source/core-developers/interceptors.md
@@ -0,0 +1,380 @@
+---
+layout: core-developers
+title: Interceptors
+---
+
+# Interceptors
+
+
+The default Interceptor stack is designed to serve the needs of most applications\. Most applications will **not** need to add Interceptors or change the Interceptor stack\.
+
+| 
+
+Many Actions share common concerns\. Some Actions need input validated\. Other Actions may need a file upload to be pre\-processed\. Another Action might need protection from a double submit\. Many Actions need drop\-down lists and other controls pre\-populated before the page displays\.
+
+The framework makes it easy to share solutions to these concerns using an "Interceptor" strategy\. When you request a resource that maps to an "action", the framework invokes the Action object\. But, before the Action is executed, the invocation can be intercepted by another object\. After the Action executes, the invocation could be intercepted again\. Unsurprisingly, we call these objects "Interceptors\."
+
+
+####Understanding Interceptors####
+
+Interceptors can execute code before and after an Action is invoked\. Most of the framework's core functionality is implemented as Interceptors\. Features like double\-submit guards, type conversion, object population, validation, file upload, page preparation, and more, are all implemented with the help of Interceptors\. Each and every Interceptor is pluggable, so you can decide exactly which features an Action needs to support\.
+
+Interceptors can be configured on a per\-action basis\. Your own custom Interceptors can be mixed\-and\-matched with the Interceptors bundled with the framework\. Interceptors "set the stage" for the Action classes, doing much of the "heavy lifting" before the Action executes\.
+
+|Action Lifecyle|
+|---------------|
+|\
+\
+![overview\.png](/Users/lukaszlenart/Projects/Apache/struts\-site/target/md/attachments/att1607\_overview\.png)
+|
+
+In some cases, an Interceptor might keep an Action from firing, because of a double\-submit or because validation failed\. Interceptors can also change the state of an Action before it executes\.
+
+The Interceptors are defined in a stack that specifies the execution order\. In some cases, the order of the Interceptors on the stack can be very important\.
+
+####Configuring Interceptors####
+
+**struts\.xml**
+
+
+~~~~~~~
+<package name="default" extends="struts-default">
+   <interceptors>
+       <interceptor name="timer" class=".."/>
+       <interceptor name="logger" class=".."/>
+   </interceptors>
+
+   <action name="login" class="tutorial.Login">
+      <interceptor-ref name="timer"/>
+      <interceptor-ref name="logger"/>
+      <result name="input">login.jsp</result>
+      <result name="success" type="redirectAction">/secure/home</result>
+   </action>
+</package>
+
+~~~~~~~
+
+####Stacking Interceptors####
+
+With most web applications, we find ourselves wanting to apply the same set of Interceptors over and over again\. Rather than reiterate the same list of Interceptors, we can bundle these Interceptors together using an Interceptor Stack\.
+
+**struts\.xml**
+
+
+~~~~~~~
+<package name="default" extends="struts-default">
+   <interceptors>
+        <interceptor name="timer" class=".."/>
+        <interceptor name="logger" class=".."/>
+        <interceptor-stack name="myStack">
+           <interceptor-ref name="timer"/>
+           <interceptor-ref name="logger"/>
+        </interceptor-stack>
+    </interceptors>
+
+   <action name="login" class="tutuorial.Login">
+         <interceptor-ref name="myStack"/>
+         <result name="input">login.jsp</result>
+         <result name="success" type="redirectAction">/secure/home</result>
+   </action>
+</package>
+
+~~~~~~~
+
+Looking inside 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+, we can see how it's done\.
+
+#####The Default Configuration#####
+
+
+
+~~~~~~~
+{snippet:id=all|lang=xml|url=struts2/core/src/main/resources/struts-default.xml}
+~~~~~~~
+Since the 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+ is included in the application's configuration by default, all of the predefined interceptors and stacks are available "out of the box"\.
+
+####Framework Interceptors####
+
+Interceptor classes are also defined using a key\-value pair specified in the Struts configuration file\. The names specified below come specified in [struts-default.xml](struts-default-xml.html)\. If you extend the 
+
+~~~~~~~
+struts-default
+~~~~~~~
+ package, then you can use the names below\. Otherwise, they must be defined in your package with a name\-class pair specified in the \<interceptors\> tag\.
+
+|Interceptor|Name|Description|
+|-----------|----|-----------|
+|[Alias Interceptor](alias-interceptor.html)|alias|Converts similar parameters that may be named differently between requests\.|
+|[Chaining Interceptor](chaining-interceptor.html)|chain|Makes the previous Action's properties available to the current Action\. Commonly used together with \<result type="chain"\> (in the previous Action)\.|
+|[Checkbox Interceptor](checkbox-interceptor.html)|checkbox|Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value\. Uses a specially named hidden field to detect unsubmitted checkboxes\. The default unchecked value is overridable for non\-boolean value'd checkboxes\.|
+|[Cookie Interceptor](cookie-interceptor.html)|cookie|Inject cookie with a certain configurable name / value into action\. (Since 2\.0\.7\.)|
+|[CookieProvider Interceptor](cookie-provider-interceptor.html)|cookieProvider|Transfer cookies from action to response (Since 2\.3\.15\.)|
+|[Conversion Error Interceptor](conversion-error-interceptor.html)|conversionError|Adds conversion errors from the ActionContext to the Action's field errors|
+|[Create Session Interceptor](create-session-interceptor.html)|createSession|Create an HttpSession automatically, useful with certain Interceptors that require a HttpSession to work properly (like the TokenInterceptor)|
+|[DebuggingInterceptor](debugging-interceptor.html)|debugging|Provides several different debugging screens to provide insight into the data behind the page\.|
+|[Execute and Wait Interceptor](execute-and-wait-interceptor.html)|execAndWait|Executes the Action in the background and then sends the user off to an intermediate waiting page\.|
+|[Exception Interceptor](exception-interceptor.html)|exception|Maps exceptions to a result\.|
+|[File Upload Interceptor](file-upload-interceptor.html)|fileUpload|An Interceptor that adds easy access to file upload support\.|
+|[I18n Interceptor](i18n-interceptor.html)|i18n|Remembers the locale selected for a user's session\.|
+|[Logger Interceptor](logger-interceptor.html)|logger|Outputs the name of the Action\.|
+|[Message Store Interceptor](message-store-interceptor.html)|store|Store and retrieve action messages / errors / field errors for action that implements ValidationAware interface into session\.|
+|[Model Driven Interceptor](model-driven-interceptor.htm)|modelDriven|If the Action implements ModelDriven, pushes the getModel Result onto the Value Stack\.|
+|[Scoped Model Driven Interceptor](scoped-model-driven-interceptor.html)|scopedModelDriven|If the Action implements ScopedModelDriven, the interceptor retrieves and stores the model from a scope and sets it on the action calling setModel\.|
+|[Parameters Interceptor](parameters-interceptor.html)|params|Sets the request parameters onto the Action\.|
+|[Prepare Interceptor](prepare-interceptor.html)|prepare|If the Action implements Preparable, calls its prepare method\.|
+|[Scope Interceptor](scope-interceptor.html)|scope|Simple mechanism for storing Action state in the session or application scope\.|
+|[Servlet Config Interceptor](servlet-config-interceptor.html)|servletConfig|Provide access to Maps representing HttpServletRequest and HttpServletResponse\.|
+|[Static Parameters Interceptor](static-parameters-interceptor.html)|staticParams|Sets the struts\.xml defined parameters onto the action\. These are the \<param\> tags that are direct children of the \<action\> tag\.|
+|[Roles Interceptor](roles-interceptor.html)|roles|Action will only be executed if the user has the correct JAAS role\.|
+|[Timer Interceptor](timer-interceptor.html)|timer|Outputs how long the Action takes to execute (including nested Interceptors and View)|
+|[Token Interceptor](token-interceptor.html)|token|Checks for valid token presence in Action, prevents duplicate form submission\.|
+|[Token Session Interceptor](token-session-interceptor.html)|tokenSession|Same as Token Interceptor, but stores the submitted data in session when handed an invalid token|
+|[Validation Interceptor](validation-interceptor.html)|validation|Performs validation using the validators defined in _action_ \-validation\.xml|
+|[Default Workflow Interceptor](default-workflow-interceptor.html)|workflow|Calls the validate method in your Action class\. If Action errors are created then it returns the INPUT view\.|
+|[Parameter Filter Interceptor](parameter-filter-interceptor.html)|N/A|Removes parameters from the list of those available to Actions|
+|[Multiselect Interceptor](multiselect-interceptor.html)|multiselect|Like the checkbox interceptor detects that no value was selected for a field with multiple values (like a select) and adds an empty parameter|
+|[NoOp Interceptor](no-op-interceptor.html)|noop|Does nothing, just passes invocation further, used in empty stack|
+
+Since 2\.0\.7, Interceptors and Results with hyphenated names were converted to camelCase\. (The former model\-driven is now modelDriven\.) The original hyphenated names are retained as "aliases" until Struts 2\.1\.0\. For clarity, the hyphenated versions are not listed here, but might be referenced in prior versions of the documentation\.
+
+> 
+
+#####Method Filtering#####
+
+
+
+~~~~~~~
+{snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork2.interceptor.MethodFilterInterceptor}
+~~~~~~~
+
+#####Interceptor Parameter Overriding#####
+
+Interceptor's parameter could be overridden through the following ways :
+
+**Method 1**:
+
+
+~~~~~~~
+<action name="myAction" class="myActionClass">
+    <interceptor-ref name="exception"/>
+    <interceptor-ref name="alias"/>
+    <interceptor-ref name="params"/>
+    <interceptor-ref name="servletConfig"/>
+    <interceptor-ref name="prepare"/>
+    <interceptor-ref name="i18n"/>
+    <interceptor-ref name="chain"/>
+    <interceptor-ref name="modelDriven"/>
+    <interceptor-ref name="fileUpload"/>
+    <interceptor-ref name="staticParams"/>
+    <interceptor-ref name="params"/>
+    <interceptor-ref name="conversionError"/>
+    <interceptor-ref name="validation">
+        <param name="excludeMethods">myValidationExcudeMethod</param>
+    </interceptor-ref>
+    <interceptor-ref name="workflow">
+        <param name="excludeMethods">myWorkflowExcludeMethod</param>
+    </interceptor-ref>
+</action>
+
+~~~~~~~
+
+**Method 2**:
+
+
+~~~~~~~
+<action name="myAction" class="myActionClass">
+    <interceptor-ref name="defaultStack">
+        <param name="validation.excludeMethods">myValidationExcludeMethod</param>
+        <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
+    </interceptor-ref>
+</action>
+
+~~~~~~~
+
+In the first method, the whole default stack is copied and the parameter then changed accordingly\.
+
+In the second method, the 
+
+~~~~~~~
+interceptor-ref
+~~~~~~~
+ refers to an existing interceptor\-stack, namely 
+
+~~~~~~~
+defaultStack
+~~~~~~~
+ in this example, and override the 
+
+~~~~~~~
+validator
+~~~~~~~
+ and 
+
+~~~~~~~
+workflow
+~~~~~~~
+ interceptor 
+
+~~~~~~~
+excludeMethods
+~~~~~~~
+ attribute\. Note that in the 
+
+~~~~~~~
+param
+~~~~~~~
+ tag, the name attribute contains a dot (\.) the word before the dot(\.) specifies the interceptor name whose parameter is to be overridden and the word after the dot (\.) specifies the parameter itself\. The syntax is as follows:
+
+
+~~~~~~~
+   <interceptor-name>.<parameter-name>
+
+~~~~~~~
+
+Note also that in this case the 
+
+~~~~~~~
+interceptor-ref
+~~~~~~~
+ name attribute is used to indicate an interceptor stack which makes sense as if it is referring to the interceptor itself it would be just using Method 1 describe above\.
+
+**Method 3**:
+
+
+~~~~~~~
+<interceptors>
+    <interceptor-stack name="parentStack">
+        <interceptor-ref name="defaultStack">
+            <param name="params.excludeParams">token</param>
+        </interceptor-ref>
+    </interceptor-stack>
+</interceptors>
+
+<default-interceptor-ref name="parentStack"/>
+
+~~~~~~~
+
+#####Interceptor Parameter Overriding Inheritance#####
+
+Parameters override are not inherited in interceptors, meaning that the last set of overridden parameters will be used\. For example, if a stack overrides the parameter "defaultBlock" for the "postPrepareParameterFilter" interceptor as:
+
+
+~~~~~~~
+<interceptor-stack name="parentStack">
+  <interceptor-ref name="postPrepareParameterFilter">
+    <param name="defaultBlock">true</param>
+  </interceptor-ref>
+</interceptor-stack>
+
+~~~~~~~
+
+and an action overrides the "allowed" for "postPrepareParameterFilter":
+
+
+~~~~~~~
+<package name="child2" namespace="/child" extends="parentPackage">
+  <action name="list" class="SomeAction">
+    <interceptor-ref name="parentStack">
+      <param name="postPrepareParameterFilter.allowed">myObject.name</param>
+    </interceptor-ref>
+  </action>
+</package>
+
+~~~~~~~
+
+Then, only "allowed" will be overridden for the "postPrepareParameterFilter" interceptor in that action, the other params will be null\.
+
+#####Lazy parameters#####
+
+
+This functionality was added in Struts 2\.5\.9
+
+| 
+
+It is possible to define an interceptor with parameters evaluated during action invocation\. In such case the interceptor must be marked with 
+
+~~~~~~~
+WithLazyParams
+~~~~~~~
+ interface\. This must be developer's decision as interceptor must be aware of having those parameters set during invocation and not when the interceptor is created as it happens in normal way\.
+
+Params are evaluated as any other expression starting with from action as a top object\.
+
+
+~~~~~~~
+<action name="LazyFoo" class="com.opensymphony.xwork2.SimpleAction">
+  <result name="success">result.jsp</result>
+  <interceptor-ref name="lazy">
+    <param name="foo">${bar}</param>
+  </interceptor-ref>
+</action>
+~~~~~~~
+
+
+~~~~~~~
+public class MockLazyInterceptor extends AbstractInterceptor implements WithLazyParams {
+
+    private String foo = "";
+
+    public void setFoo(String foo) {
+        this.foo = foo;
+    }
+
+    public String intercept(ActionInvocation invocation) throws Exception {
+        ....
+        return invocation.invoke();
+    }
+}
+~~~~~~~
+
+Please be aware that order of interceptors can matter when want to access parameters passed via request as those parameters are set by [Parameters Interceptor](parameters-interceptor.html).
+
+#####Order of Interceptor Execution#####
+
+Interceptors provide an excellent means to wrap before/after processing\. The concept reduces code duplication (think AOP)\.
+
+
+~~~~~~~
+<interceptor-stack name="xaStack">
+  <interceptor-ref name="thisWillRunFirstInterceptor"/>
+  <interceptor-ref name="thisWillRunNextInterceptor"/>
+  <interceptor-ref name="followedByThisInterceptor"/>
+  <interceptor-ref name="thisWillRunLastInterceptor"/>
+</interceptor-stack>
+
+~~~~~~~
+
+ (\!)  Note that some Interceptors will interrupt the stack/chain/flow \.\.\. so the order is very important\.
+
+Interceptors implementing 
+
+~~~~~~~
+com.opensymphony.xwork2.interceptor.PreResultListener
+~~~~~~~
+ will run after the Action executes but before the Result executes\.
+
+
+~~~~~~~
+thisWillRunFirstInterceptor
+  thisWillRunNextInterceptor
+    followedByThisInterceptor
+      thisWillRunLastInterceptor
+        MyAction1
+        MyAction2 (chain)
+        MyPreResultListener
+        MyResult (result)
+      thisWillRunLastInterceptor
+    followedByThisInterceptor
+  thisWillRunNextInterceptor
+thisWillRunFirstInterceptor
+
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/jboss-5.md
----------------------------------------------------------------------
diff --git a/source/core-developers/jboss-5.md b/source/core-developers/jboss-5.md
new file mode 100644
index 0000000..0f4e949
--- /dev/null
+++ b/source/core-developers/jboss-5.md
@@ -0,0 +1,44 @@
+---
+layout: core-developers
+title: JBoss 5
+---
+
+# JBoss 5
+
+__Convention plugin support__
+
+To have proper support of the _Convention Plugin_  in JBoss AS 5, especially when you put actions inside a jar (which is embedded in war or ear) and not directly into 
+
+~~~~~~~
+WEB-INF/classes
+~~~~~~~
+, you must add the following line into 
+
+~~~~~~~
+$JBOSS_HOME/bin/run.conf
+~~~~~~~
+ or into 
+
+~~~~~~~
+$JBOSS_HOME\bin\run.conf.bat
+~~~~~~~
+
+**Linux/OSX \- \$JBOSS\_HOME/bin/run\.conf**
+
+
+~~~~~~~
+
+JAVA_OPTS="$JAVA_OPTS -Djboss.vfs.forceVfsJar=true"
+
+~~~~~~~
+
+**Windows \- \$JBOSS\_HOME\\bin\\run\.conf\.bat**
+
+
+~~~~~~~
+
+set "JAVA_OPTS=%JAVA_OPTS% -Djboss.vfs.forceVfsJar=true"
+
+~~~~~~~
+
+You can find more details about JBoss VFS [here](http://docs\.jboss\.org/jbossas/docs/Installation\_And\_Getting\_Started\_Guide/5/html\_single/index\.html\#d0e495)^[http://docs\.jboss\.org/jbossas/docs/Installation\_And\_Getting\_Started\_Guide/5/html\_single/index\.html\#d0e495]\.

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

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

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/localization.md
----------------------------------------------------------------------
diff --git a/source/core-developers/localization.md b/source/core-developers/localization.md
new file mode 100644
index 0000000..ad265e1
--- /dev/null
+++ b/source/core-developers/localization.md
@@ -0,0 +1,263 @@
+---
+layout: core-developers
+title: Localization
+---
+
+# Localization
+
+
+####Overview####
+
+The framework supports internationalization (i18n) in the following places:
+
+1. the _UI Tags_ 
+
+2. Messages and Errors from the [ValidationAware](http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html)^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAware.html] interface (implemented by [ActionSupport](http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html)^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html] and [ValidationAwareSupport](http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAwareSupport.html)^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ValidationAwareSupport.html])
+
+3. Within action classes that extend [ActionSupport](http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html)^[http://struts.apache.org/2.0.6/struts2-core/apidocs/index.html?com/opensymphony/xwork2/ActionSupport.html] through the getText() method
+
+####Resource Bundle Search Order####
+
+Resource bundles are searched in the following order:
+
+1. 
+
+~~~~~~~
+ActionClass
+~~~~~~~
+.properties
+
+2. 
+
+~~~~~~~
+Interface
+~~~~~~~
+.properties (every interface and sub-interface)
+
+3. 
+
+~~~~~~~
+BaseClass
+~~~~~~~
+.properties (all the way to Object.properties)
+
+4. ModelDriven's model (if implements ModelDriven), for the model object repeat from 1
+
+5. package.properties (of the directory where class is located and every parent directory all the way to the root directory)
+
+6. search up the i18n message key hierarchy itself
+
+7. global resource properties
+
+This is how it is implemented in a default implementation of the 
+
+~~~~~~~
+LocalizedTextProvider
+~~~~~~~
+ interface\. You can provide your own implementation using 
+
+~~~~~~~
+TextProvider
+~~~~~~~
+ and 
+
+~~~~~~~
+TextProviderFactory
+~~~~~~~
+ interfaces\.
+
+
+
+| To clarify \#5, while traversing the package hierarchy, Struts 2 will look for a file package\.properties:
+
+| com/
+     acme/
+         package\.properties
+         actions/
+                 package\.properties
+                 FooAction\.java
+                 FooAction\.properties
+
+| 
+
+| If FooAction\.properties does not exist, com/acme/action/package\.properties will be searched for, if not found com/acme/package\.properties, if not found com/package\.properties, etc\.
+
+| 
+
+#####Default action's class#####
+
+If you configure action as follow
+
+
+~~~~~~~
+<action name="index">
+   <result>/index.jsp</result>
+</action>
+~~~~~~~
+
+it will use a default class defined with 
+
+~~~~~~~
+default-class-ref
+~~~~~~~
+ in 
+
+~~~~~~~
+struts-default.xml
+~~~~~~~
+ which is 
+
+~~~~~~~
+com.opensymphony.xwork2.ActionSupport
+~~~~~~~
+\. It means you have two options here to get I18N working in that case:
+
++  define 
+
+~~~~~~~
+com/opensymphony/xwork2/ActionSupport.properties
+~~~~~~~
+ and put messages there
+
++  point 
+
+~~~~~~~
+default-class-ref
+~~~~~~~
+ to your base class and then defined appropriated 
+
+~~~~~~~
+.properties
+~~~~~~~
+ file (corresponding to class' name or package)
+
+ Examples
+
+ There are several ways to access the message resources, including 
+
+~~~~~~~
+getText
+~~~~~~~
+, the 
+
+~~~~~~~
+text
+~~~~~~~
+ tag, and the 
+
+~~~~~~~
+i18n
+~~~~~~~
+ tag\.
+
+#####Using getText from a Tag#####
+
+To display i18n text, use a call to 
+
+~~~~~~~
+getText
+~~~~~~~
+ in the _property_  tag, or any other tag, such as the UI tags\. (The 
+
+~~~~~~~
+getText
+~~~~~~~
+ technique is especially useful for labels of UI tags\.)
+
+~~~~~~~
+{snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.Property}
+~~~~~~~
+
+
+The default implementation of TextProvider which is used in ActionSupport perform evaluation of value read from bundle base on the provided key, see _Localizing Output_  for an example\.
+
+| 
+
+#####Using the text tag#####
+
+The _text_  tag retrieves a message from the default resource bundle\.
+
+~~~~~~~
+{snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.Text}
+~~~~~~~
+
+#####Using the I18n tag#####
+
+The _i18n_  tag pushes an arbitrary resource bundle on to the value stack\. Other tags within the scope of the i18n tag can display messages from that resource bundle\.
+
+~~~~~~~
+{snippet:id=i18nExample|javadoc=true|lang=xml|url=org.apache.struts2.components.I18n}
+~~~~~~~
+
+
+Internationalizing SiteMesh decorators is possible, but there are quirks\. See _SiteMesh Plugin_  for more\.
+
+| 
+
+#####Using the Key attribute of UI Tags#####
+
+The key attribute of most UI tags can be used to retrieve a message from a resource bundle:
+
+
+~~~~~~~
+<s:textfield key="some.key" name="textfieldName"/>
+~~~~~~~
+
+####I18n Interceptor####
+
+Essentially, the i18n Interceptor pushes a locale into the ActionContext map upon every request\. The framework components that support localization all utilize the ActionContext locale\. See [I18n Interceptor](i18n-interceptor.html) for details\.
+
+####Global Resources (struts\.custom\.i18n\.resources) in struts\.properties####
+
+A global resource bundle could be specified programmatically, as well as the locale\.
+
+####Formatting Dates and Numbers####
+
+See [Formatting Dates and Numbers](formatting-dates-and-numbers.html) for more details and examples\.
+
+####Comparison with Struts 1####
+
+Struts 1 users should be familiar with the application\.properties resource bundle, where you can put all the messages in the application that are going to be translated\. Struts 2, though, splits the resource bundles per action or model class, and you may end up with duplicated messages in those resource bundles\. A quick fix for that is to create a file called ActionSupport\.properties in com/opensymphony/xwork2 and put it on your classpath\. This will only work well if all your actions subclass XWork2's ActionSupport\.
+
+####Using only global bundles####
+
+If you don't need to use the package\-scan\-functionality and only base on the global bundles (those provided by the framework and via 
+
+~~~~~~~
+struts.custom.i18n.resources
+~~~~~~~
+) you can use existing 
+
+~~~~~~~
+GlobalLocalizedTextProvider
+~~~~~~~
+ implementation\. To use this please define the following option in your 
+
+~~~~~~~
+struts.xml
+~~~~~~~
+:
+
+
+~~~~~~~
+<constant name="struts.localizedTextProvider" value="global-only" />
+~~~~~~~
+
+####Custom TextProvider and TextProviderFactory####
+
+If you want use a different logic to search for localized messages, or you want to use a database or just want to search default bundles, you must implement both those interfaces (or subclass the existing implementations)\. You can check a small [example app](https://github\.com/apache/struts\-examples/tree/master/text\-provider)^[https://github\.com/apache/struts\-examples/tree/master/text\-provider] how to use both\. Please remember that the 
+
+~~~~~~~
+TextProvider
+~~~~~~~
+ interface is implemented by the 
+
+~~~~~~~
+ActioSupport
+~~~~~~~
+ class, that's why an extra layer \- 
+
+~~~~~~~
+TextProviderFactory
+~~~~~~~
+ \- is needed\.

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

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/logging.md
----------------------------------------------------------------------
diff --git a/source/core-developers/logging.md b/source/core-developers/logging.md
new file mode 100644
index 0000000..da92563
--- /dev/null
+++ b/source/core-developers/logging.md
@@ -0,0 +1,145 @@
+---
+layout: core-developers
+title: Logging
+---
+
+# Logging
+
+#####Logging support#####
+
+XWork provides its own layer to support logging \- it allows to use many different implementations\.
+
+Currently XWork provides support for the following libraries (in that order base on classpath discovery):
+
++ Commons Logging
+
++ [SLF4J](http://www\.slf4j\.org/)^[http://www\.slf4j\.org/]
+
++ [Log4j2](http://logging\.apache\.org/log4j/2\.x/)^[http://logging\.apache\.org/log4j/2\.x/]
+
++ JDK Logger
+
+__Usage__
+
+To use given type of library add it as a Maven dependency or drop into WEB\-INF/lib folder\. XWork LoggerFactory class will use given logging provider if available\.
+
+To add logging to your application simply declare a Logger as follow:
+
+
+~~~~~~~
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+public class MyAction {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MyAction.class);
+
+    private String userName;
+
+    public String execute() {
+        LOG.debug("MyAction executed with UserName [#0]", userName);
+        return "success";
+    }
+
+    // getter / setter
+
+}
+
+~~~~~~~
+
+__Implementing my own factory__
+
+You plug in your own logging solution, simple extend LoggerFactory class and provide a delegate which implements Logger interface, like below:
+
+**JdkLoggerFactory which adds support for JDK logging**
+
+
+~~~~~~~
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+/**
+ * Creates jdk loggers
+ */
+public class JdkLoggerFactory extends LoggerFactory {
+
+    @Override
+    protected Logger getLoggerImpl(Class<?> cls) {
+        return new JdkLogger(java.util.logging.Logger.getLogger(cls.getName()));
+    }
+    
+    @Override
+    protected Logger getLoggerImpl(String name) {
+        return new JdkLogger(java.util.logging.Logger.getLogger(name));
+    }
+}
+
+~~~~~~~
+
+**JdkLogger is a wrapper around java\.util\.logging\.Logger and implements Logger interface**
+
+
+~~~~~~~
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerUtils;
+
+import java.util.logging.Level;
+
+/**
+ * Delegates to jdk logger.  Maps fatal to Level.SEVERE along with error.
+ */
+public class JdkLogger implements Logger {
+    
+    private java.util.logging.Logger log;
+    
+    public JdkLogger(java.util.logging.Logger log) {
+        this.log = log;
+    }
+
+    public void error(String msg, String... args) {
+        log.log(Level.SEVERE, LoggerUtils.format(msg, args));
+    }
+
+    public void error(String msg, Throwable ex, String... args) {
+        log.log(Level.SEVERE, LoggerUtils.format(msg, args), ex);
+    }
+    
+    ...
+}
+
+~~~~~~~
+
+Check [the source code](http://struts\.apache\.org/2\.x/xwork\-core/apidocs/com/opensymphony/xwork2/util/logging/package\-summary\.html)^[http://struts\.apache\.org/2\.x/xwork\-core/apidocs/com/opensymphony/xwork2/util/logging/package\-summary\.html] to see more details\.
+
+__Defining which factory to use__
+
+Now you must tell XWork/Struts2 to use your implementation, just define system property like below:
+
+
+
+~~~~~~~
+-Dxwork.loggerFactory=com.demo.MyLoggerFactory
+~~~~~~~
+
+you can use the same to explicit tell the framework which implementation to use and don't depend on class discovery, eg\.:
+
+
+
+~~~~~~~
+-Dxwork.loggerFactory=com.opensymphony.xwork2.util.logging.slf4j.Slf4jLoggerFactory
+~~~~~~~
+
+
+
+~~~~~~~
+or
+~~~~~~~
+
+
+
+~~~~~~~
+-Dxwork.loggerFactory=com.opensymphony.xwork2.util.logging.log4j2.Log4j2LoggerFactory
+~~~~~~~
+
+will enable Slf4j or Log4j2 even if there is commons\-logging on classpath available (commons\-logging is the first LoggerFactory to look for)\.
+

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/message-store-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/message-store-interceptor.md b/source/core-developers/message-store-interceptor.md
new file mode 100644
index 0000000..8b56a63
--- /dev/null
+++ b/source/core-developers/message-store-interceptor.md
@@ -0,0 +1,99 @@
+---
+layout: core-developers
+title: Message Store Interceptor
+---
+
+# Message Store Interceptor
+
+An interceptor to store a _ValidationAware_  action's messages / errors and field errors into HTTP Session, such that it will be retrievable at a later stage\. This allows the action's message / errors and field errors to be available longer that just the particular HTTP request\.
+
+If no session exists, nothing will be stored and can be retrieved later\. In other terms, the application is responsible to open the session\.
+
+In the **STORE** mode, the interceptor will store the _ValidationAware_  action's message / errors and field errors into HTTP session\.
+
+In the **RETRIEVE** mode, the interceptor will retrieve the stored action's message / errors and field errors and put them back into the _ValidationAware_  action\.
+
+In the **AUTOMATIC** mode, the interceptor will always retrieve the stored action's message / errors and field errors and put them back into the \[ValidationAware\] action, and after Action execution, if the _Result_  is an instance of _ServletRedirectResult_ , the action's message / errors and field errors into automatically be stored in the HTTP session\.\.
+
+The interceptor does nothing in the **NONE** mode, which is the default\.
+
+The operation mode could be switched using:
+
+1. Setting the interceptor parameter eg.
+
+
+~~~~~~~
+<action name="submitApplication" ...>
+    <interceptor-ref name="store"/>
+	    <param name="operationMode">STORE</param>
+    </interceptor-ref>
+	<interceptor-ref name="defaultStack" />
+    ....
+</action>
+~~~~~~~
+
+2. Through request parameter 
+
+~~~~~~~
+allowRequestParameterSwitch
+~~~~~~~
+ must be 'true' which is the default
+
+
+~~~~~~~
+the request will have the operation mode in 'STORE'
+http://localhost:8080/context/submitApplication.action?operationMode=STORE
+~~~~~~~
+
+#####Parameters#####
+
++ 
+
+~~~~~~~
+allowRequestParameterSwitch
+~~~~~~~
+ \- To enable request parameter that could switch the operation mode of this interceptor\.
+
++ 
+
+~~~~~~~
+requestParameterSwitch
+~~~~~~~
+ \- The request parameter that will indicate what mode this interceptor is in\.
+
++ 
+
+~~~~~~~
+operationMode
+~~~~~~~
+ \- The operation mode this interceptor should be in (either **STORE**, **RETRIEVE**, **AUTOMATIC**, or **NONE**)\. **NONE **being the default\.
+
+#####Extending the Interceptor#####
+
+There is no known extensions\.
+
+#####Examples#####
+
+
+
+~~~~~~~
+<action name="submitApplication" ....>
+	<interceptor-ref name="store">
+		<param name="operationMode">STORE</param>
+	</interceptor-ref>
+	<interceptor-ref name="defaultStack" />
+	<result name="input" type="redirectAction">applicationFailed</result>
+	<result type="dispatcher">applicationSuccess.jsp</result>
+</action>
+
+<action name="applicationFailed" ....>
+	<interceptor-ref name="store">
+		<param name="operationMode">RETRIEVE</param>
+	</interceptor-ref>
+	<result>applicationFailed.jsp</result>
+</action>
+~~~~~~~
+
+With the example above, **submitApplication\.action** will have the action messages / errors / field errors stored in the HTTP Session\. Later when needed, (in this case, when **applicationFailed\.action** is fired, it will get the action messages / errors / field errors stored in the HTTP Session and put them back into the action\.
+
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/model-driven-interceptor.md
----------------------------------------------------------------------
diff --git a/source/core-developers/model-driven-interceptor.md b/source/core-developers/model-driven-interceptor.md
new file mode 100644
index 0000000..9dca496
--- /dev/null
+++ b/source/core-developers/model-driven-interceptor.md
@@ -0,0 +1,66 @@
+---
+layout: core-developers
+title: Model Driven Interceptor
+---
+
+# Model Driven Interceptor
+
+
+
+~~~~~~~
+{snippet:id=description|javadoc=true|url=com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor}
+~~~~~~~
+
+
+
+| To create a Model Driven action, implement the ModelDriven interface by adding a model property, or at least the accessor\.
+
+| 
+
+| 
+
+| public Object getModel() \.\.\.
+
+| 
+
+| 
+
+| In the implementation of getModel, acquire an instance of a business object and return it\.
+
+| 
+
+| 
+
+| On the page, you can address any JavaBean properties on the business object as if they were coded directly on the Action class\. (The framework pushes the Model object onto the ValueStack\.)
+
+| 
+
+| 
+
+| Many developers use Spring to acquire the business object\. With the addition of a setModel method, the business logic can be injected automatically\.
+
+| 
+
+#####Parameters#####
+
+
+
+~~~~~~~
+{snippet:id=parameters|javadoc=true|url=com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor}
+~~~~~~~
+
+#####Extending the Interceptor#####
+
+
+
+~~~~~~~
+{snippet:id=extending|javadoc=true|url=com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor}
+~~~~~~~
+
+#####Examples#####
+
+
+
+~~~~~~~
+{snippet:id=example|lang=xml|javadoc=true|url=com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor}
+~~~~~~~

http://git-wip-us.apache.org/repos/asf/struts-site/blob/f903a0f7/source/core-developers/model-driven.md
----------------------------------------------------------------------
diff --git a/source/core-developers/model-driven.md b/source/core-developers/model-driven.md
new file mode 100644
index 0000000..adf0461
--- /dev/null
+++ b/source/core-developers/model-driven.md
@@ -0,0 +1,104 @@
+---
+layout: core-developers
+title: Model Driven
+---
+
+# Model Driven
+
+Struts 2 does not have "forms" like Struts 1 did\. In Struts 2 request parameters are bound directly to fields in the actions class, and this class is placed on top of the stack when the action is executed\.
+
+If an action class implements the interface 
+
+~~~~~~~
+com.opensymphony.xwork2.ModelDriven
+~~~~~~~
+ then it needs to return an object from the 
+
+~~~~~~~
+getModel()
+~~~~~~~
+ method\. Struts will then populate the fields of this object with the request parameters, and this object will be placed on top of the stack once the action is executed\. Validation will also be performed on this model object, instead of the action\. Please read about [VisitorFieldValidator Annotation](visitor-field-validator-annotation.html) which can help you validate model's fields\.
+
+####Interceptor####
+
+To use 
+
+~~~~~~~
+ModelDriven
+~~~~~~~
+ actions, make sure that the [Model Driven Interceptor](model-driven-interceptor.html) is applied to your action\. This interceptor is part of the default interceptor stack 
+
+~~~~~~~
+defaultStack
+~~~~~~~
+ so it is applied to all actions by default\.
+
+####Example####
+
+Action class:
+
+
+~~~~~~~
+public class ModelDrivenAction implements ModelDriven { 
+    public String execute() throws Exception {
+        return SUCCESS;
+    }
+
+    public Object getModel() {
+        return new Gangster();
+    }
+}
+
+~~~~~~~
+
+Gangster class (model):
+
+
+~~~~~~~
+public class Gangster implements Serializable {
+    private String name;
+    private int age;
+    private String description;
+    private boolean bustedBefore;
+
+    public int getAge() {
+        return age;
+    }
+    public void setAge(int age) {
+        this.age = age;
+    }
+    public boolean isBustedBefore() {
+        return bustedBefore;
+    }
+    public void setBustedBefore(boolean bustedBefore) {
+        this.bustedBefore = bustedBefore;
+    }
+    public String getDescription() {
+        return description;
+    }
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+
+~~~~~~~
+
+JSP for creating a Gangster:
+
+
+~~~~~~~
+<s:form action="modelDrivenResult" method="POST" namespace="/modelDriven">   
+    <s:textfield label="Gangster Name" name="name" />
+    <s:textfield label="Gangster Age"  name="age" />
+    <s:checkbox  label="Gangster Busted Before" name="bustedBefore" />
+    <s:textarea  cols="30" rows="5" label="Gangster Description" name="description" />           
+    <s:submit />
+</s:form>
+
+~~~~~~~
\ No newline at end of file