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 2022/11/05 14:01:40 UTC

[struts-site] branch WW-5254-async created (now 983e6b52c)

This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a change to branch WW-5254-async
in repository https://gitbox.apache.org/repos/asf/struts-site.git


      at 983e6b52c WW-5254 Adds description about the Async plugin

This branch includes the following new commits:

     new 983e6b52c WW-5254 Adds description about the Async plugin

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[struts-site] 01/01: WW-5254 Adds description about the Async plugin

Posted by lu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch WW-5254-async
in repository https://gitbox.apache.org/repos/asf/struts-site.git

commit 983e6b52c263a3a64c4eea74128a88dc7b5fe19a
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Sat Nov 5 14:59:55 2022 +0100

    WW-5254 Adds description about the Async plugin
---
 source/plugins/async/index.md           | 128 +++++++++++++++++++++++++++++++
 source/plugins/bean-validation/index.md |  96 +++++++++++++++---------
 source/plugins/cdi/index.md             |  21 +-----
 source/plugins/codebehind/index.md      |   4 +
 source/plugins/config-browser/index.md  |  25 ++++---
 source/plugins/convention/index.md      |   3 +
 source/plugins/dwr/index.md             |  18 +++--
 source/plugins/embedded-jsp/index.md    |   7 ++
 source/plugins/index.md                 |   3 +-
 source/plugins/jasperreports/index.md   | 129 ++++++++++++--------------------
 source/plugins/java-8-support/index.md  |  14 +++-
 source/plugins/javatemplates/index.md   |  45 ++++++-----
 source/plugins/jfreechart/index.md      |   9 +++
 source/plugins/jsf/index.md             |   9 +++
 source/plugins/json/index.md            |   3 +
 source/plugins/junit/index.md           |   3 +
 source/plugins/osgi/index.md            |   7 ++
 source/plugins/oval/index.md            |   7 ++
 source/plugins/plexus/index.md          |   7 ++
 source/plugins/portlet-tiles/index.md   |   7 ++
 source/plugins/portlet/index.md         |   7 ++
 source/plugins/rest/index.md            |   3 +
 source/plugins/sitegraph/index.md       | 123 +++++++++++++-----------------
 source/plugins/sitemesh/index.md        |  42 +++++------
 source/plugins/spring/index.md          |  99 ++++++++++++++----------
 source/plugins/struts-1/index.md        |   8 ++
 source/plugins/testng/index.md          |  10 ++-
 source/plugins/tiles-3/index.md         |  12 ++-
 source/plugins/tiles/index.md           |   3 +
 29 files changed, 543 insertions(+), 309 deletions(-)

diff --git a/source/plugins/async/index.md b/source/plugins/async/index.md
new file mode 100644
index 000000000..82954b4a1
--- /dev/null
+++ b/source/plugins/async/index.md
@@ -0,0 +1,128 @@
+---
+layout: plugin
+title: Async Plugin
+parent:
+  url: index.html
+  title: Plugins
+---
+
+# Async Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
+
+The Async plugin allows to implement actions as using
+an [Asynchronous Processing](https://docs.oracle.com/javaee/7/tutorial/servlets012.htm)
+available as from Servlet API 3. It's a thin layer over the Servlet async layer.
+
+## Simple usage
+
+The example code below shows how to implement and use async actions. Please check an async action example
+in our [Showcase app](https://github.com/apache/struts/tree/master/apps/showcase/src/main/java/org/apache/struts2/showcase/async).
+
+**Action**
+
+```java
+public class AsyncAction {
+
+    public Callable<String> execute() throws InterruptedException {
+        return new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                waitForEvent();
+                return "success";
+            }
+        };
+    }
+
+    private void waitForEvent() throws InterruptedException {
+        Thread.sleep(40000);
+    }
+}
+```
+
+**struts.xml**
+
+```xml
+<action name="async" class="com.company.struts.AsyncAction">
+    <result name="success" type="json"/>
+</action>
+```
+
+**web.xml**
+
+You must define the Struts Servlet to allow support Async actions.
+
+```xml
+<servlet>
+    <servlet-name>strutsServlet</servlet-name>
+    <servlet-class>org.apache.struts2.dispatcher.servlet.StrutsServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+    <async-supported>true</async-supported>
+</servlet>
+
+<servlet-mapping>
+<servlet-name>strutsServlet</servlet-name>
+<url-pattern>/</url-pattern>
+</servlet-mapping>
+```
+
+## Customize timeout
+
+**Action**
+
+```java
+public class AsyncAction {
+
+    public Callable<String> execute() throws InterruptedException {
+        return new AsyncAction(60000/*timeout*/, new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                waitForEvent();
+                return "success";
+            }
+        });
+    }
+
+    private void waitForEvent() throws InterruptedException {
+        Thread.sleep(40000);
+    }
+}
+```
+
+## Serializing multiple async tasks
+
+**Action**
+
+```java
+public class AsyncAction {
+
+    public Callable<String> execute() throws InterruptedException {
+        return new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                waitForEvent1();
+                return new Callable<String>() {
+
+                    @Override
+                    public String call() throws Exception {
+                        waitForEvent2();
+                        return "success";
+                    }
+                };
+            }
+        };
+    }
+
+    private void waitForEvent1() throws InterruptedException {
+        Thread.sleep(40000);
+    }
+
+    private void waitForEvent2() throws InterruptedException {
+        Thread.sleep(40000);
+    }
+}
+```
diff --git a/source/plugins/bean-validation/index.md b/source/plugins/bean-validation/index.md
index 17df64f28..e763d60a9 100644
--- a/source/plugins/bean-validation/index.md
+++ b/source/plugins/bean-validation/index.md
@@ -1,29 +1,35 @@
 ---
 layout: plugin
 title: Bean Validation Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Bean Validation Plugin
+{:.no_toc}
 
-## Bean Validation
-
-The Bean Validation plugin implements a bridge to use Bean Validation in struts actions. Bean Validation has been specified in JSR 303 and is part of the JavaEE platform. Full-fledged application servers already bring validation providers which can be leveraged by this plugin. The plugin integrates with other struts features like:
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
-+ i18n
-
-+ model driven
+## Bean Validation
 
-+ AJAX Validation
+The Bean Validation plugin implements a bridge to use Bean Validation in struts actions. Bean Validation has been
+specified in JSR 303 and is part of the JavaEE platform. Full-fledged application servers already bring validation
+providers which can be leveraged by this plugin. The plugin integrates with other struts features like:
 
-+ workflow
+- i18n
+- model driven
+- AJAX Validation
+- workflow
 
 ## Setup
 
-In order to use the Bean Validation plugin, you first need to add the JAR file to the `WEB-INF/lib` directory of your application or include the dependency in your project's Maven POM file.
+In order to use the Bean Validation plugin, you first need to add the JAR file to the `WEB-INF/lib` directory of your
+application or include the dependency in your project's Maven POM file.
 
 **pom.xml**
 
-
 ```xml
 <dependency>
     <groupId>org.apache.struts</groupId>
@@ -32,60 +38,62 @@ In order to use the Bean Validation plugin, you first need to add the JAR file t
 </dependency>
 ```
 
-Where X.X.X is the current version of Struts 2. Please remember that the Bean Validation Plugin is available from version 2.5.
+Where X.X.X is the current version of Struts 2. Please remember that the Bean Validation Plugin is available from
+version 2.5.
 
 ## Configuration
 
-This sample shows the configuration constants the plugin provides. It also shows how to enable bean-validation by extending your own application package from `struts-bean-validation` which comes along with the plugin.
+This sample shows the configuration constants the plugin provides. It also shows how to enable bean-validation
+by extending your own application package from `struts-bean-validation` which comes along with the plugin.
 
 **struts.xml**
 
-
 ```xml
 <struts>
     <constant name="struts.beanValidation.providerClass" value="org.hibernate.validator.HibernateValidator"/>
     <constant name="struts.beanValidation.ignoreXMLConfiguration" value="false"/>
     <constant name="struts.beanValidation.convertMessageToUtf" value="false"/>
     <constant name="struts.beanValidation.convertMessageFromEncoding" value="ISO-8859-1"/>
- 
+
     <package name="my-bean-validation" extends="struts-bean-validation">
     </package>
 </struts>
 ```
 
-Here is another example that shows how you can combine bean-validation with other plugins by configuring your own Interceptor-Stack (note: this is just a very short example. In a real app you should take more care about your stack). You can combine bean validation with classic struts validation (or disable either) by putting the according interceptors in your stack (or by removing them from your stack).
+Here is another example that shows how you can combine bean-validation with other plugins by configuring your own
+Interceptor-Stack (note: this is just a very short example. In a real app you should take more care about your stack).
+You can combine bean validation with classic struts validation (or disable either) by putting the according interceptors
+in your stack (or by removing them from your stack).
 
 **struts.xml**
 
-
 ```xml
-	<package name="my-app-package" extends="struts-default">
-		<interceptors>
-			<interceptor>
-				 name="beanValidation"
-				 class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor">
-			</interceptor>
-			<interceptor-stack name="appDefaultStack">
-				<interceptor-ref name="beanValidation"/>
-				<interceptor-ref name="defaultStack"/>
-			</interceptor-stack>
-		</interceptors>
-	</package>
+<package name="my-app-package" extends="struts-default">
+    <interceptors>
+        <interceptor>
+            name="beanValidation"
+            class="org.apache.struts.beanvalidation.validation.interceptor.BeanValidationInterceptor">
+        </interceptor>
+        <interceptor-stack name="appDefaultStack">
+            <interceptor-ref name="beanValidation"/>
+            <interceptor-ref name="defaultStack"/>
+        </interceptor-stack>
+    </interceptors>
+</package>
 ```
 
- 
-
 ## Bean Validation Example
 
-Here is an example Action that makes use of bean validation. Note that some of the validation annotations are taken from `javax` package (which is defined in the JSR) while others are taken from the validaton provider (in this case: `hibernate`). You can specifiy own text keys in the `message` attribute of the annotations. If you do that the whole struts i18n mechanism kicks in to resolve those text keys.
+Here is an example Action that makes use of bean validation. Note that some of the validation annotations are taken
+from `javax` package (which is defined in the JSR) while others are taken from the validaton provider (in this
+case: `hibernate`). You can specifiy own text keys in the `message` attribute of the annotations. If you do that the
+whole struts i18n mechanism kicks in to resolve those text keys.
 
 **com.example.actions.BeanValidationAction**
 
-
 ```java
 package com.example.actions;
 
-
 import com.opensymphony.xwork2.ActionSupport;
 import org.apache.struts.beanvalidation.constraints.FieldMatch;
 import org.apache.struts2.convention.annotation.Action;
@@ -97,6 +105,7 @@ import org.hibernate.validator.constraints.Email;
 import org.hibernate.validator.constraints.NotBlank;
 import org.hibernate.validator.constraints.ScriptAssert;
 import org.hibernate.validator.constraints.URL;
+
 import javax.validation.constraints.*;
 import java.util.Date;
 
@@ -116,7 +125,7 @@ public class BeanValidationExampleAction extends ActionSupport {
     @NotBlank
     private String requiredStringValidatorField = null;
 
-    @NotNull(message="your.text.key.here")
+    @NotNull(message = "your.text.key.here")
     @Min(1)
     @Max(10)
     private Integer integerValidatorField = null;
@@ -145,59 +154,76 @@ public class BeanValidationExampleAction extends ActionSupport {
     private String fieldExpressionValidatorField = null;
 
 
- public Date getDateValidatorField() {
+    public Date getDateValidatorField() {
 
         return dateValidatorField;
     }
+
     public void setDateValidatorField(Date dateValidatorField) {
         this.dateValidatorField = dateValidatorField;
     }
+
     public String getEmailValidatorField() {
         return emailValidatorField;
     }
+
     public void setEmailValidatorField(String emailValidatorField) {
         this.emailValidatorField = emailValidatorField;
     }
+
     public Integer getIntegerValidatorField() {
         return integerValidatorField;
     }
+
     public void setIntegerValidatorField(Integer integerValidatorField) {
         this.integerValidatorField = integerValidatorField;
     }
+
     public String getRegexValidatorField() {
         return regexValidatorField;
     }
+
     public void setRegexValidatorField(String regexValidatorField) {
         this.regexValidatorField = regexValidatorField;
     }
+
     public String getRequiredStringValidatorField() {
         return requiredStringValidatorField;
     }
+
     public void setRequiredStringValidatorField(String requiredStringValidatorField) {
         this.requiredStringValidatorField = requiredStringValidatorField;
     }
+
     public String getRequiredValidatorField() {
         return requiredValidatorField;
     }
+
     public void setRequiredValidatorField(String requiredValidatorField) {
         this.requiredValidatorField = requiredValidatorField;
     }
+
     public String getStringLengthValidatorField() {
         return stringLengthValidatorField;
     }
+
     public void setStringLengthValidatorField(String stringLengthValidatorField) {
         this.stringLengthValidatorField = stringLengthValidatorField;
     }
+
     public String getFieldExpressionValidatorField() {
         return fieldExpressionValidatorField;
     }
+
     public void setFieldExpressionValidatorField(
             String fieldExpressionValidatorField) {
         this.fieldExpressionValidatorField = fieldExpressionValidatorField;
     }
+
     public String getUrlValidatorField() {
         return urlValidatorField;
     }
+
     public void setUrlValidatorField(String urlValidatorField) {
         this.urlValidatorField = urlValidatorField;
     }
diff --git a/source/plugins/cdi/index.md b/source/plugins/cdi/index.md
index 9b2070115..755923016 100644
--- a/source/plugins/cdi/index.md
+++ b/source/plugins/cdi/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: CDI Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # CDI Plugin
@@ -221,9 +224,7 @@ to undefined - so check your imports!
 Now that you are aware of that, here is the rest of the inevitable NumberGuess CDI example in Struts 2 flavour. 
 Add a JSP view similar to this:
 
-
 ```jsp
-
 <%@ page contentType="text/html; charset=UTF-8" %>
 <%@ taglib prefix="s" uri="/struts-tags" %>
 <html>
@@ -253,7 +254,6 @@ along - if not using the fabulous and recommended Struts 2 [Convention Plugin](.
 
 
 ```xml
-
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE struts PUBLIC
           "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"       
@@ -275,14 +275,11 @@ along - if not using the fabulous and recommended Struts 2 [Convention Plugin](.
     </package>
 
 </struts>
-
 ```
 
 Now you can add the business logic we want to be managed and injected by CDI. Start with two qualifier annotations:
 
-
 ```java
-
 package org.apache.struts2.example.cdi;
 
 import javax.inject.Qualifier;
@@ -297,12 +294,9 @@ import java.lang.annotation.Target;
 @Documented
 @Qualifier
 public @interface Random {}
-
 ```
 
-
 ```java
-
 package org.apache.struts2.example.cdi;
 
 import javax.inject.Qualifier;
@@ -317,14 +311,11 @@ import java.lang.annotation.Target;
 @Documented
 @Qualifier
 public @interface MaxNumber {}
-
 ```
 
 Now on to the actual business beans, the Game and the Generator bean:
 
-
 ```java
-
 package org.apache.struts2.example.cdi;
 
 import javax.annotation.PostConstruct;
@@ -407,10 +398,8 @@ public class Game implements Serializable {
     }
 
 }
-
 ```
 
-
 ```java
 
 package org.apache.struts2.example.cdi;
@@ -438,10 +427,8 @@ public class Generator implements Serializable {
       return maxNumber;
    }
 
-} 
-
+}
 ```
-
 If you understand that code at a glance, you are either already an CDI expert or profit from the readable, natural
 language oriented way the CDI stack works. If neither of this is the case, now it's time to check the CDI and Weld 
 documentation. Remember, this is a trivial example - there is much more to know about CDI.
diff --git a/source/plugins/codebehind/index.md b/source/plugins/codebehind/index.md
index b8fcac67f..f0895efc6 100644
--- a/source/plugins/codebehind/index.md
+++ b/source/plugins/codebehind/index.md
@@ -4,6 +4,10 @@ title: Codebehind Plugin
 ---
 
 # Codebehind Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > Deprecated Plugin
 
diff --git a/source/plugins/config-browser/index.md b/source/plugins/config-browser/index.md
index 75616dfd4..77459b1fb 100644
--- a/source/plugins/config-browser/index.md
+++ b/source/plugins/config-browser/index.md
@@ -1,36 +1,43 @@
 ---
 layout: plugin
 title: Config Browser Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Config Browser Plugin
+{:.no_toc}
 
-The Config Browser Plugin is a simple tool to help view an application's configuration at runtime.
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
+## Description
 
-This plugin should be used only during development phase and access to it should be strictly restricted!
+The Config Browser Plugin is a simple tool to help view an application's configuration at runtime.
 
+This plugin should be used only during development phase and access to it should be strictly restricted!
 
 ## Features
 
-+ Browsable view of loaded configuration
-
-+ Shows all accessible action URLs
+- Browsable view of loaded configuration
+- Shows all accessible action URLs
 
 ## Usage
 
-To use the plugin, simply copy the jar into your application.  Once installed, you can access the tool by opening to the action named _index_  in the _config-browser_  namespace.
+To use the plugin, simply copy the jar into your application.  Once installed, you can access the tool by opening 
+to the action named _index_  in the _config-browser_  namespace.
 
 > In most cases (if you are using the default _ActionMapper_ ), the URL is something like http://localhost:8080/starter/config-browser/index.action or http://localhost:8080/starter/config-browser/index.
 
-### Example
+## Example
 
 ![config-browser-example.png](../attachments/att30966155_config-browser-example.png)
 
-### Settings
+## Settings
 
 This plugin provides no customizable settings.
 
-### Installation
+## Installation
 
 This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  No other files need to be copied or created.
diff --git a/source/plugins/convention/index.md b/source/plugins/convention/index.md
index bfe8b462f..c8d37ca19 100644
--- a/source/plugins/convention/index.md
+++ b/source/plugins/convention/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: Convention plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Convention Plugin
diff --git a/source/plugins/dwr/index.md b/source/plugins/dwr/index.md
index f788ec810..4d7d2bd9e 100644
--- a/source/plugins/dwr/index.md
+++ b/source/plugins/dwr/index.md
@@ -1,28 +1,32 @@
 ---
 layout: plugin
 title: DWR Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # DWR Plugin
+{:.no_toc}
 
-The DWR plugin provides integration with the Ajax framework [Direct Web Remoting](http://getahead.org/dwr)
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
-This plugin works by allowing DWR to execute a Struts 2 action and return any validation errors.
+## Description
 
+The DWR plugin provides integration with the Ajax framework [Direct Web Remoting](http://getahead.org/dwr)
+This plugin works by allowing DWR to execute a Struts 2 action and return any validation errors.
 This plugin is only available with Struts 2.1.1 or later.
 
 ## Features
 
-+ Expose Struts 2 validations via DWR
+- Expose Struts 2 validations via DWR
 
 ## Usage
 
 To expose Struts 2 validations via DWR, add this to your DWR configuration:
 
-{% comment %}start snippet id=dwrConfiguration|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java;hb=HEAD {% endcomment %}
-
 ```xml
-
  <dwr>
     <allow>
       <create creator="new" javascript="validator" class="org.apache.struts2.validators.DWRValidator"/>
@@ -33,8 +37,6 @@ To expose Struts 2 validations via DWR, add this to your DWR configuration:
 
 ```
 
-{% comment %}end snippet id=dwrConfiguration|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/dwr/src/main/java/org/apache/struts2/validators/DWRValidator.java;hb=HEAD {% endcomment %}
-
 ## Settings
 
 This plugin doesn't support any global settings.
diff --git a/source/plugins/embedded-jsp/index.md b/source/plugins/embedded-jsp/index.md
index 7fde57617..8fe17d96f 100644
--- a/source/plugins/embedded-jsp/index.md
+++ b/source/plugins/embedded-jsp/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: Embedded JSP Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Embedded JSP Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 The Embedded JSP plugin allows you to use JSPs from the classpath (from jar files).
 
diff --git a/source/plugins/index.md b/source/plugins/index.md
index a11e72f29..6e948e513 100644
--- a/source/plugins/index.md
+++ b/source/plugins/index.md
@@ -16,6 +16,7 @@ to share with others. Several plugins are bundled with the framework, and others
 
 | Name                                      | Versions               | Note                                                                  |
 |-------------------------------------------|------------------------|-----------------------------------------------------------------------|
+| [Async Plugin](async)                     | 6.0.0+                 |
 | [Bean Validation Plugin](bean-validation) | 2.5+                   |
 | [CDI (JSR 299) Plugin](cdi)               | 2.3.1+                 |
 | [Codebehind Plugin](codebehind)           | < 2.5                  | removed since 2.5, use [Convention Plugin](convention)                |
@@ -43,7 +44,7 @@ to share with others. Several plugins are bundled with the framework, and others
 | [TestNG Plugin](testng)                   |||
 | [Tiles Plugin](tiles)                     |||
 | [Tiles 3 Plugin](tiles-3)                 | < 2.5                  | removed since 2.5                                                     |
-| [Velocity Plugin](velocity)               | |                                                                       |
+| [Velocity Plugin](velocity)               |                        |                                                                       |
 
 > For a complete list of bundled and third-party plugins, visit
 > the [Plugin Registry](http://cwiki.apache.org/S2PLUGINS/Home).
diff --git a/source/plugins/jasperreports/index.md b/source/plugins/jasperreports/index.md
index 750ac2014..cff120579 100644
--- a/source/plugins/jasperreports/index.md
+++ b/source/plugins/jasperreports/index.md
@@ -1,116 +1,81 @@
 ---
 layout: plugin
 title: JasperReports Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # JasperReports Plugin
+{:.no_toc}
 
-[JasperReports](http://jasperforge.org/sf/projects/jasperreports) is a powerful open source Java (LGPL) reporting tool that has the ability to deliver rich content onto the screen, to the printer or into PDF, HTML, XLS, CSV and XML files.
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
+[JasperReports](http://jasperforge.org/sf/projects/jasperreports) is a powerful open source Java (LGPL) reporting
+tool that has the ability to deliver rich content onto the screen, to the printer or into PDF, HTML, XLS, CSV and XML files.
 
 The JasperReports plugin enables Actions to create high-quality reports as results.
 
 ## Features
 
-+ Allows Actions to be rendered through JasperReports
+- Allows actions to be rendered through JasperReports
 
 ## Usage
 
-To use this plugin, have your packages that contain the target actions extend the provided `jasperreports-default` package, which contains the `jasper` result type.  Then, simply use the result type in the desired actions.  The result takes the following parameters:
-
-{% comment %}start snippet id=description|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-<p> <p>
- Generates a JasperReports report using the specified format or PDF if no
- format is specified.
- </p>
-</p>
-{% comment %}end snippet id=description|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-
-{% comment %}start snippet id=params|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-<p>
- <ul>
-
- <li><b>location (default)</b> - the location where the compiled jasper report
- definition is (foo.jasper), relative from current URL.</li>
- <li><b>dataSource (required)</b> - the EL expression used to retrieve the
- datasource from the value stack (usually a List).</li>
- <li><b>parse</b> - true by default. If set to false, the location param will
- not be parsed for EL expressions.</li>
- <li><b>format</b> - the format in which the report should be generated. Valid
- values can be found in {@link JasperReportConstants}. If no format is
- specified, PDF will be used.</li>
- <li><b>contentDisposition</b> - disposition (defaults to "inline", values are
- typically <i>filename="document.pdf"</i>).</li>
- <li><b>documentName</b> - name of the document (will generate the http header
- <code>Content-disposition = X; filename=X.[format]</code>).</li>
- <li><b>delimiter</b> - the delimiter used when generating CSV reports. By
- default, the character used is ",".</li>
- <li><b>imageServletUrl</b> - name of the url that, when prefixed with the
- context page, can return report images.</li>
- <li>
- <b>reportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
- report parameters from the value stack. The parameters may be accessed
- in the report via the usual JR mechanism and might include data not
- part of the dataSource, such as the user name of the report creator, etc.
- </li>
- <li>
- <b>exportParameters</b> - (2.1.2+) OGNL expression used to retrieve a map of
- JR exporter parameters from the value stack. The export parameters are
- used to customize the JR export. For example, a PDF export might enable
- encryption and set the user password to a string known to the report creator.
- </li>
- <li>
- <b>connection</b> - (2.1.7+) JDBC Connection which can be passed to the
- report instead of dataSource
- </li>
- <li><b>wrapField</b> - (2.3.18+) defines if fields should warp with ValueStackDataSource
- see https://issues.apache.org/jira/browse/WW-3698 for more details
- </li>
- </ul>
- <p>
- This result follows the same rules from {@link StrutsResultSupport}.
- Specifically, all parameters will be parsed if the "parse" parameter
- is not set to false.
- </p>
-</p>
-{% comment %}end snippet id=params|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
+To use this plugin, have your packages that contain the target actions extend the provided `jasperreports-default` 
+package, which contains the `jasper` result type.  Then, simply use the result type in the desired actions.  
+The result takes the following parameters:
+ 
+ - location (default) - the location where the compiled jasper report definition is (foo.jasper), relative from current URL
+ - dataSource (required) - the EL expression used to retrieve the datasource from the value stack (usually a List)
+ - parse - `true` by default, if set to false, the location param will not be parsed for EL expressions
+ - format - the format in which the report should be generated. Valid  values can be found in `JasperReportConstants`. 
+   If no format is specified, PDF will be used
+ - contentDisposition - disposition (defaults to "inline", values are typically `filename="document.pdf"`)
+ - documentName - name of the document (will generate the http header `Content-disposition = X; filename=X.[format]`)
+ - delimiter - the delimiter used when generating CSV reports. By default, the character used is ","
+ - imageServletUrl - name of the url that, when prefixed with the context page, can return report images
+ - reportParameters - (since 2.1.2+) OGNL expression used to retrieve a map of report parameters from the value stack. 
+   The parameters may be accessed in the report via the usual JR mechanism and might include data not part of the 
+   dataSource, such as the user name of the report creator, etc.
+ - exportParameters - (since 2.1.2+) OGNL expression used to retrieve a map of JR exporter parameters from the value stack.
+   The export parameters are used to customize the JR export. For example, a PDF export might enable encryption 
+   and set the user password to a string known to the report creator.
+ - connection - (since 2.1.7+) JDBC Connection which can be passed to the report instead of dataSource
+ - wrapField - (since 2.3.18+) defines if fields should warp with ValueStackDataSource see
+   [WW-3698](https://issues.apache.org/jira/browse/WW-3698) for more details
+ 
+This result follows the same rules from {@link StrutsResultSupport}. Specifically, all parameters will be parsed 
+if the "parse" parameter is not set to false.
 
 ### Examples
 
-{% comment %}start snippet id=example1|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-
 ```xml
- <result name="success" type="jasper">
-   <param name="location">foo.jasper</param>
-   <param name="dataSource">mySource</param>
-   <param name="format">CSV</param>
- </result>
-
+<result name="success" type="jasper">
+    <param name="location">foo.jasper</param>
+    <param name="dataSource">mySource</param>
+    <param name="format">CSV</param>
+</result>
 ```
 
-{% comment %}end snippet id=example1|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-
 or for pdf:
 
-{% comment %}start snippet id=example2|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-
 ```xml
- <result name="success" type="jasper">
-   <param name="location">foo.jasper</param>
-   <param name="dataSource">mySource</param>
- </result>
-
+<result name="success" type="jasper">
+    <param name="location">foo.jasper</param>
+    <param name="dataSource">mySource</param>
+</result>
 ```
 
-{% comment %}end snippet id=example2|lang=xml|javadoc=true|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/jasperreports/src/main/java/org/apache/struts2/views/jasperreports/JasperReportsResult.java;hb=HEAD  {% endcomment %}
-
 ### Settings
 
 This plugin doesn't provide any global settings.
 
 ### Installation
 
-This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  No other files need to be copied or created.
-
----
+This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory.  
+No other files need to be copied or created.
 
 > See also [Compiling JasperReports JRXML Files with Maven](http://www.vitarara.org/cms/node/131http://www.vitarara.org/cms/node/131) (Mark Menard)
diff --git a/source/plugins/java-8-support/index.md b/source/plugins/java-8-support/index.md
index b0327ccda..c1909abed 100644
--- a/source/plugins/java-8-support/index.md
+++ b/source/plugins/java-8-support/index.md
@@ -1,17 +1,23 @@
 ---
 layout: plugin
 title: Java 8 Support Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Java 8 Support Plugin
+{:.no_toc}
 
-This plugin was dropped in Struts 2.5.5 as Struts Core is using ASM5 now which supports Java8.
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
+This plugin was dropped in Struts 2.5.5 as Struts Core is using ASM5 now which supports Java8.
 Adds support for Java 8 - to allow use the latest features of the language with Struts actions.
 
 ## Usage
 
-You must define it as a dependency in `pom.xml` and exclude the old version of ASM used with `xwork-core`, see a code snippet below:
+You must define it as a dependency in `pom.xml` and exclude the old version of ASM used with `xwork-core`, see a code snippet below:
 
 ```xml
 <dependency>
@@ -30,8 +36,8 @@ You must define it as a dependency in `pom.xml` and exclude the old version of
 </dependency>
 ```
 
-If you don't use Maven to manage the dependencies, please be sure to replace `asm.jar` and `asm-commons.jar` with appropriated ASM 5 versions.
+If you don't use Maven to manage the dependencies, please be sure to replace `asm.jar` and `asm-commons.jar` with appropriated ASM 5 versions.
 
 ## Supported Java 8 features
 
-+ Lambda Expressions in actions when using them with the Convention plugin
++ Lambda Expressions in actions when using them with the Convention plugin
diff --git a/source/plugins/javatemplates/index.md b/source/plugins/javatemplates/index.md
index a6f8da92e..f89bfb71f 100644
--- a/source/plugins/javatemplates/index.md
+++ b/source/plugins/javatemplates/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: Javatemplates Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Javatemplates Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 This plugin provides a faster Java implementation of tags in the "simple" theme.
 
@@ -23,25 +30,25 @@ The plugin is a drop in replacement for the supported tags in the simple theme,
 
 ## Supported tags
 
-+ _a_ 
-+ _actionerror_ 
-+ _actionmessage_ 
-+ _checkbox_ 
-+ _datetextfield_ 
-+ _div_ 
-+ _fielderror_ 
-+ _file_ 
-+ _form_ 
-+ _head_ 
-+ _hidden_ 
-+ _label_ 
-+ _password_ 
-+ _select_ 
-+ _reset_ 
-+ _submit_ 
-+ _textfield_ 
-+ _textarea_ 
-+ _token_ 
+- `a` 
+- `actionerror` 
+- `actionmessage` 
+- `checkbox` 
+- `datetextfield` 
+- `div` 
+- `fielderror` 
+- `file` 
+- `form` 
+- `head` 
+- `hidden` 
+- `label` 
+- `password` 
+- `select` 
+- `reset` 
+- `submit` 
+- `textfield` 
+- `textarea` 
+- `token` 
 
 ## Performance benchmark
 
diff --git a/source/plugins/jfreechart/index.md b/source/plugins/jfreechart/index.md
index b2d992a79..af5cdac88 100644
--- a/source/plugins/jfreechart/index.md
+++ b/source/plugins/jfreechart/index.md
@@ -1,9 +1,18 @@
 ---
 layout: plugin
 title: JFreeChart Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # JFreeChart Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
 
 [JFreeChart](http://www.jfree.org/jfreechart/) is a free 100% Java (LGPL) chart library that makes it easy for 
 developers to display professional quality charts in their applications.
diff --git a/source/plugins/jsf/index.md b/source/plugins/jsf/index.md
index 87d8efba9..c295fec70 100644
--- a/source/plugins/jsf/index.md
+++ b/source/plugins/jsf/index.md
@@ -1,9 +1,18 @@
 ---
 layout: plugin
 title: JSF Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # JSF Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
 
 [JavaServer Faces](http://java.sun.com/j2ee/javaserverfaces) technology simplifies building user interfaces for JavaServer applications. Developers of various skill levels can quickly build web applications by: assembling reusable UI components in a page; connecting these components to an application data source; and wiring client-generated events to server-side event handlers.
 
diff --git a/source/plugins/json/index.md b/source/plugins/json/index.md
index 60970ebdd..4103d2b65 100644
--- a/source/plugins/json/index.md
+++ b/source/plugins/json/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: JSON plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # JSON Plugin
diff --git a/source/plugins/junit/index.md b/source/plugins/junit/index.md
index bad86632c..eb5d547f6 100644
--- a/source/plugins/junit/index.md
+++ b/source/plugins/junit/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: JUnit plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # JUnit plugin
diff --git a/source/plugins/osgi/index.md b/source/plugins/osgi/index.md
index da87456be..6c588fbe1 100644
--- a/source/plugins/osgi/index.md
+++ b/source/plugins/osgi/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: OSGi Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # OSGi Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
diff --git a/source/plugins/oval/index.md b/source/plugins/oval/index.md
index 984495a3b..82a5fb392 100644
--- a/source/plugins/oval/index.md
+++ b/source/plugins/oval/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: OVal Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # OVal Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
diff --git a/source/plugins/plexus/index.md b/source/plugins/plexus/index.md
index c59fdda60..fee7ce122 100644
--- a/source/plugins/plexus/index.md
+++ b/source/plugins/plexus/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: Plexus Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Plexus Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
diff --git a/source/plugins/portlet-tiles/index.md b/source/plugins/portlet-tiles/index.md
index 22f677f8f..171e1b0f5 100644
--- a/source/plugins/portlet-tiles/index.md
+++ b/source/plugins/portlet-tiles/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: Portlet Tiles Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Portlet Tiles Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
diff --git a/source/plugins/portlet/index.md b/source/plugins/portlet/index.md
index 5b20078db..a1acbc5e6 100644
--- a/source/plugins/portlet/index.md
+++ b/source/plugins/portlet/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: Portlet Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Portlet Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
diff --git a/source/plugins/rest/index.md b/source/plugins/rest/index.md
index 2f06f7e36..997d1dfcc 100644
--- a/source/plugins/rest/index.md
+++ b/source/plugins/rest/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: REST Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # REST Plugin
diff --git a/source/plugins/sitegraph/index.md b/source/plugins/sitegraph/index.md
index 0c9f07168..9e0669f9e 100644
--- a/source/plugins/sitegraph/index.md
+++ b/source/plugins/sitegraph/index.md
@@ -1,19 +1,25 @@
 ---
 layout: plugin
 title: SiteGraph Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # SiteGraph Plugin
+{:.no_toc}
 
-> This plugin got marked as deprecated since Struts 2.5.11!
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
-The SiteGraph plugin generates graphical diagrams representing the flow of your web application.
+> This plugin got marked as deprecated since Struts 2.5.11!
 
-SiteGraph works by parsing your configuration files, Action classes, and view files (JSP, Velocity, and FreeMarker), and displaying a visual map.
+## Description 
 
-Additional information can be found in the JavaDocs:
+The SiteGraph plugin generates graphical diagrams representing the flow of your web application.
+SiteGraph works by parsing your configuration files, Action classes, and view files (JSP, Velocity, and FreeMarker), 
+and displaying a visual map. Additional information can be found in the JavaDocs:
 
-{% comment %}start snippet id=javadocs-intro|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
 
 ```text
  * <p>
@@ -22,89 +28,74 @@ Additional information can be found in the JavaDocs:
  * and that the "dot" executable be in your command path. You can find GraphViz
  * at http://www.graphviz.org.
  * </p>
-
 ```
 
-{% comment %}end snippet id=javadocs-intro|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
-
-__Understanding the Output__
+## Understanding the Output
 
 There are several key things to notice when looking at the output from SiteGraph:
 
-+ Boxes: those shaded red indicate an action; those shaded green indicate a view file (JSP, etc).
-
-+ Links: arrows colored green imply that no new HTTP request is being made; black arrows indicate a new HTTP request.
-
-+ Link labels: labels may sometimes contain additional useful information. For example, a label of **href** means that the link behavior is that of a hyper-text reference. The complete label behaviors are provided:
+- Boxes: those shaded red indicate an action; those shaded green indicate a view file (JSP, etc).
+- Links: arrows colored green imply that no new HTTP request is being made; black arrows indicate a new HTTP request.
+- Link labels: labels may sometimes contain additional useful information. For example, a label of **href** means that
+  the link behavior is that of a hyper-text reference. The complete label behaviors are provided:
+  - **href** - a view file references an action by name (typically ending with the extension ".action")
+  - **action** - a view file makes a call to the _action_  tag
+  - **form** - a view file is linked to an action using the _form_  tag
+  - **redirect** - an action is redirecting to another view or action
+  - **! notation** - a link to an action overrides the method to invoke
 
-  + **href** - a view file references an action by name (typically ending with the extension ".action")
-
-  + **action** - a view file makes a call to the _action_  tag
-
-  + **form** - a view file is linked to an action using the _form_  tag
-
-  + **redirect** - an action is redirecting to another view or action
-
-  + **! notation** - a link to an action overrides the method to invoke
-
-__Requirements__
+## Requirements
 
 SiteGraph requires that your view files be structured in a very specific way. Because it has to read these files, only certain styles are supported. The requirements are:
 
-+ The JSP tags must use the "s" namespace.
-
-  + In JSP: \<s:xxx/\>
-
-  + In FreeMarker: \<@s.xxx/\>
-
-  + In Velocity: N/A
+- The JSP tags must use the "s" namespace.
+  - In JSP: `<s:xxx/>`
+  - In FreeMarker: `<@s.xxx/>`
+  - In Velocity: N/A
+- Use of the _form_  tag and _action_  tag must be linking directly to the action name (and optional namespace). 
+  This means that `<s:form action="foo"/>` is OK, but `<s:form action="foo.action"/>` is not.
+  Here is also a short overview of what it does and why a developer would want to use it.
 
-+ Use of the _form_  tag and _action_  tag must be linking directly to the action name (and optional namespace). This means that \<s:form action="foo"/\> is OK, but \<s:form action="foo.action"/\> is not.
- Here is also a short overview of what it does and why a developer would want to use it.
+## Features
 
-__Features__
+Generates a graphical view of your web application
 
-+ Generates a graphical view of your web application
-
-## Usage
+### Usage
 
 You can use SiteGraph with the following command:
 
-
 ```text
 java -cp ... -jar struts2-sitegraph-plugin-x.x.x.jar
      -config CONFIG_DIR
      -views VIEWS_DIRS
      -output OUTPUT
      [-ns NAMESPACE]
-
 ```
 
 Where:
 
-{% comment %}start snippet id=sitegraph-usage|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/resources/org/apache/struts2/sitegraph/sitegraph-usage.txt;hb=HEAD  {% endcomment %}
-
 ```text
 Usage: -config CONFIG_DIR -views VIEWS_DIRS -output OUTPUT [-ns NAMESPACE]
        CONFIG_DIR => a directory containing struts.xml
        VIEWS_DIRS => comma seperated list of dirs containing JSPs, VMs, etc
        OUPUT      => the directory where the output should go
        NAMESPACE  => the namespace path restriction (/, /foo, etc)
-
 ```
 
-{% comment %}end snippet id=sitegraph-usage|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/resources/org/apache/struts2/sitegraph/sitegraph-usage.txt;hb=HEAD  {% endcomment %}
-
-
-You must either supply the correct classpath when invoking the SiteGraph tool or place the Sitegraph plugin in the same directory as the dependent jars. Specifically, the XWork jar, Struts jar, and their dependencies must be included in the classpath. Futhermore, **you must also include your Action class files referenced in** struts.xml. Without the proper class path entries, SiteGraph will not function properly.
-
-Once you have run SiteGraph, check the directory specified in the "output" argument (OUTPUT). In there you will find two files: **out.dot** and **out.gif**. You may immediately open up **out.gif** and view the web application flow. However, you may also wish to either run the **out.dot** file through a different GraphVis layout engine (neato, twopi, etc), so the original dot file is provided as well. You may also wish to edit the dot file before rendering the final flow diagram.
+You must either supply the correct classpath when invoking the SiteGraph tool or place the Sitegraph plugin in the same 
+directory as the dependent jars. Specifically, the XWork jar, Struts jar, and their dependencies must be included 
+in the classpath. Futhermore, **you must also include your Action class files referenced in** struts.xml. 
+Without the proper class path entries, SiteGraph will not function properly.
 
-__Automatic Execution__
+Once you have run SiteGraph, check the directory specified in the "output" argument (OUTPUT). In there you will find 
+two files: **out.dot** and **out.gif**. You may immediately open up **out.gif** and view the web application flow. 
+However, you may also wish to either run the **out.dot** file through a different GraphVis layout engine (neato, twopi, etc), 
+so the original dot file is provided as well. You may also wish to edit the dot file before rendering the final flow diagram.
 
-Some advanced users may wish to execute SiteGraph from within their application - this could be required if you are developing an application that supports plugin capabilities. This can easily be done. See the JavaDocs for more info:
+### Automatic Execution
 
-{% comment %}start snippet id=javadocs-api|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
+Some advanced users may wish to execute SiteGraph from within their application - this could be required if you are 
+developing an application that supports plugin capabilities. This can easily be done. See the JavaDocs for more info:
 
 ```text
  * <p>
@@ -113,33 +104,25 @@ Some advanced users may wish to execute SiteGraph from within their application
  * optionally specify a {@link Writer} to output the dot content to, and then call
  * {@link #prepare()}.
  * </p>
-
 ```
 
-{% comment %}end snippet id=javadocs-api|lang=text|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
-
 The command line version of SiteGraph does exactly this (except for overriding the Writer):
 
-{% comment %}start snippet id=example-api|lang=java|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
-
 ```java
-        SiteGraph siteGraph = new SiteGraph(configDir, views, output, namespace);
-        siteGraph.prepare();
-        siteGraph.render();
-
+    SiteGraph siteGraph = new SiteGraph(configDir, views, output, namespace);
+    siteGraph.prepare();
+    siteGraph.render();
 ```
 
-{% comment %}end snippet id=example-api|lang=java|https://gitbox.apache.org/repos/asf?p=struts.git;a=blob_plain;f=plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/SiteGraph.java;hb=HEAD {% endcomment %}
-
-__Example__
-
-
-__Settings__
+## Settings
 
 This plugin doesn't allow for any global settings.
 
-__Installation__
+## Installation
 
-The SiteGraph plugin jar is distributed with Struts, so if you're up and running, you don't need to do download any additional Java packages. However, SiteGraph does require the "dot" package by [GraphViz](http://www.graphviz.org).
+The SiteGraph plugin jar is distributed with Struts, so if you're up and running, you don't need to do download
+any additional Java packages. However, SiteGraph does require the "dot" package by [GraphViz](http://www.graphviz.org).
 
-You'll need to download the latest version of GraphViz and make sure that the dot executable (dot.exe in Windows) is in your command path. In Windows the GraphViz installer typically automatically adds `dot.exe` to your path. However, you may need to do this by hand depending on your system configuration.
+You'll need to download the latest version of GraphViz and make sure that the dot executable (dot.exe in Windows) 
+is in your command path. In Windows the GraphViz installer typically automatically adds `dot.exe` to your path. 
+However, you may need to do this by hand depending on your system configuration.
diff --git a/source/plugins/sitemesh/index.md b/source/plugins/sitemesh/index.md
index f1eec4936..834971216 100644
--- a/source/plugins/sitemesh/index.md
+++ b/source/plugins/sitemesh/index.md
@@ -1,9 +1,16 @@
 ---
 layout: plugin
 title: SiteMesh Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # SiteMesh Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin got marked as deprecated since Struts 2.6!
 
@@ -14,21 +21,21 @@ title: SiteMesh Plugin
 
 The Sitemesh plugin allows Sitemesh templates to access framework resources.
 
-The framework stores all its value stack information as request attributes, meaning that if you wish to display data that is on the stack (or even the ActionContext), you can do so by using the normal tag libraries that come with the framework. That's it!
+The framework stores all its value stack information as request attributes, meaning that if you wish to display data 
+that is on the stack (or even the ActionContext), you can do so by using the normal tag libraries that come 
+with the framework. That's it!
 
 ## Features
 
-+ Can use Struts tags in Sitemesh decorator templates
-
-+ Sitemesh decorators can be written in FreeMarker as well as Velocity and JSP
+- Can use Struts tags in Sitemesh decorator templates
+- Sitemesh decorators can be written in FreeMarker as well as Velocity and JSP
 
 ## Usage
 
-From 2.2+ the new `com.opensymphony.sitemesh.webapp.SiteMeshFilter` filter and Struts `org.apache.struts2.dispatcher.ng.listener.StrutsListener` context listener must be added to `web.xml`, like:
-
+From 2.2+ the new `com.opensymphony.sitemesh.webapp.SiteMeshFilter` filter 
+and Struts `org.apache.struts2.dispatcher.ng.listener.StrutsListener` context listener must be added to `web.xml`, like:
 
 ```xml
-
 <filter>
     <filter-name>sitemesh</filter-name>
     <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
@@ -42,12 +49,13 @@ From 2.2+ the new `com.opensymphony.sitemesh.webapp.SiteMeshFilter` filter and S
 
 ## FreeMarker  and Velocity Decorators
 
-The plugin provides an extension of the SiteMesh _Velocity_  and _FreeMarker_  servlets. These servlets provide the standard variables and _Struts Tags_  that you used to create views in your favourite template language.
+The plugin provides an extension of the SiteMesh _Velocity_  and _FreeMarker_  servlets. These servlets provide 
+the standard variables and _Struts Tags_  that you used to create views in your favourite template language.
 
 ### FreeMarker
 
-From 2.2+ the recommended way to use Freemarker with Sitemesh is through the `org.apache.struts2.sitemesh.FreemarkerDecoratorServlet` servlet, which can be configured like this in `web.xml`:
-
+From 2.2+ the recommended way to use Freemarker with Sitemesh is through the `org.apache.struts2.sitemesh.FreemarkerDecoratorServlet` 
+servlet, which can be configured like this in `web.xml`:
 
 ```xml
 
@@ -72,8 +80,8 @@ From 2.2+ the recommended way to use Freemarker with Sitemesh is through the `or
 
 > NOTE: Please include the [Struts Velocity plugin](../velocity/) in your pom.xml before using this functionality
 
-From 2.2+ the recommended way to use Velocity with Sitemesh is through the `org.apache.struts2.sitemesh.VelocityDecoratorServlet` servlet, which can be configured like this in `web.xml`:
-
+From 2.2+ the recommended way to use Velocity with Sitemesh is through the `org.apache.struts2.sitemesh.VelocityDecoratorServlet` 
+servlet, which can be configured like this in `web.xml`:
 
 ```xml
 
@@ -98,7 +106,6 @@ From 2.2+ the recommended way to use Velocity with Sitemesh is through the `org.
 
 Such configuration is available as from Struts 2.2.0, please refer to [WW-3296](https://issues.apache.org/jira/browse/WW-3296) for me details.
 
-
 ```xml
 
     <filter>
@@ -165,9 +172,7 @@ Such configuration is available as from Struts 2.2.0, please refer to [WW-3296](
 
 Here is an example of how to configure the filter chains in `web.xml`:
 
-
 ```xml
-
 <filter>
     <filter-name>struts-prepare</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
@@ -237,9 +242,7 @@ Here is an example of how to configure the filter chains in `web.xml`:
 
 Struts 2.1 web.xml filter chain example:
 
-
 ```xml
-
 <filter>
     <filter-name>struts-prepare</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
@@ -273,12 +276,9 @@ Struts 2.1 web.xml filter chain example:
 ```
 
 You do not need the struts2-sitmesh-plugin if you are using JSP for your decorators.
-
-Here are the only only changes needed to web.xml
-
+Here are the only changes needed to web.xml
 
 ```xml
-
 <filter>
     <filter-name>struts2-prepare</filter-name>
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
diff --git a/source/plugins/spring/index.md b/source/plugins/spring/index.md
index 2a68eff7e..ba083d45b 100644
--- a/source/plugins/spring/index.md
+++ b/source/plugins/spring/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: Spring Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Spring Plugin
@@ -11,27 +14,35 @@ title: Spring Plugin
 
 ## Description
 
-[Spring](http://www.springframework.org) is a lightweight container, providing centralized, automated configuration and wiring of your application objects, using a technique called "Dependency Injection".
+[Spring](http://www.springframework.org) is a lightweight container, providing centralized, automated configuration 
+and wiring of your application objects, using a technique called "Dependency Injection".
 
-The Spring Plugin works by overriding the Struts [ObjectFactory](/core-developers/object-factory) to enhance the creation of core framework objects. When an object is to be created, it uses the `class` attribute in the Struts configuration to correspond to the `id` attribute in the Spring configuration. If not found, the class will try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2's [bean scope feature](http://www.springframework.org/docs/reference [...]
+The Spring Plugin works by overriding the Struts [ObjectFactory](/core-developers/object-factory) to enhance 
+the creation of core framework objects. When an object is to be created, it uses the `class` attribute in 
+the Struts configuration to correspond to the `id` attribute in the Spring configuration. If not found, the class will 
+try to be created as usual, then be autowired by Spring. In the case of Actions, Spring 2's 
+[bean scope feature](http://www.springframework.org/docs/reference/beans.html#beans-factory-scopes) can be used to scope 
+an Action instance to the session, application, or a custom scope, providing advanced customization above 
+the default per-request scoping.
 
-> Remember: 
-> 
-> **registering Actions with Spring is not required**. The Spring alternative is there if you need it, but the framework will automatically create Actions objects from the action mappings. But, if you want to use Spring to inject your Actions, the option is there.
+> Remember:
+> **registering Actions with Spring is not required**. The Spring alternative is there if you need it, but the framework 
+> will automatically create Actions objects from the action mappings. But, if you want to use Spring to inject your Actions, 
+> the option is there.
 
-__Features__
+## Features
 
-+ Allow Actions, Interceptors, and Results to be created by Spring
-
-+ Struts-created objects can be autowired by Spring after creation
-
-+ Provides two interceptors that autowire actions, if not using the Spring ObjectFactory
+- Allow Actions, Interceptors, and Results to be created by Spring
+- Struts-created objects can be autowired by Spring after creation
+- Provides two interceptors that autowire actions, if not using the Spring ObjectFactory
 
 ## Usage
 
 To enable Spring integration, simply include struts2-spring-plugin-x-x-x.jar in your application.
 
-If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application,) you will need to set the struts.objectFactory property in [default.properties](/core-developers/default-properties)  or in one of several XML files via [Constant Configuration](/core-developers/constant-configuration):
+If you are using more than one object factory, (for example, by including both the Spring and Plexus plugins in your application) 
+you will need to set the struts.objectFactory property in [default.properties](/core-developers/default-properties)
+or in one of several XML files via [Constant Configuration](/core-developers/constant-configuration):
 
 **struts.properties**
 
@@ -49,9 +60,10 @@ struts.objectFactory = spring
 
 ```
 
-__Autowiring__
+## Autowiring
 
-The framework enables "autowiring" by default. (Autowiring means to look for objects defined in Spring with the same name as your object property). To change the wiring mode, modify the `spring.autowire` property.
+The framework enables "autowiring" by default. (Autowiring means to look for objects defined in Spring with the same 
+name as your object property). To change the wiring mode, modify the `spring.autowire` property.
 
 **Wiring Mode**
 
@@ -77,7 +89,6 @@ Enabling Spring integration for other application objects is a two-step process.
 
 **web.xml**
 
-
 ```xml
 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
@@ -90,7 +101,6 @@ Enabling Spring integration for other application objects is a two-step process.
 
 **applicationContext.xml**
 
-
 ```xml
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
@@ -103,7 +113,9 @@ Enabling Spring integration for other application objects is a two-step process.
 
 More applicationContext configuration files needed?
 
-Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than applicationContext.xml. Adding the following to your web.xml will cause Spring's ApplicationContext to be inititalized from all files matching the given pattern:
+Since the Spring integration uses a standard Listener, it can be configured to support configuration files other than 
+applicationContext.xml. Adding the following to your web.xml will cause Spring's ApplicationContext to be initialized 
+from all files matching the given pattern:
 
 ```xml
 <!-- Context Configuration locations for Spring XML files -->
@@ -115,19 +127,28 @@ Since the Spring integration uses a standard Listener, it can be configured to s
 
 See the Spring documentation for a full description of this parameter.
 
-__Initializing Actions from Spring__
+## Initializing Actions from Spring
 
-Normally, in `struts.xml` you specify the class for each Action. When using the default SpringObjectFactory, the framework will ask Spring to create the Action and wire up dependencies as specified by the default auto-wire behavior.
+Normally, in `struts.xml` you specify the class for each Action. When using the default SpringObjectFactory, the framework 
+will ask Spring to create the Action and wire up dependencies as specified by the default auto-wire behavior.
 
-We **strongly** recommend that you find declarative ways of letting Spring know what to provide for your actions. This includes making your beans able to be autowired by either naming your dependent properties on your action the same as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type and only having one of the required type registered with Spring. It also can include using JDK5 annotations to declare transactional and se [...]
+We **strongly** recommend that you find declarative ways of letting Spring know what to provide for your actions. 
+This includes making your beans able to be autowired by either naming your dependent properties on your action the same 
+as the bean defined in Spring which should be provided (to allow for name-based autowiring), or using autowire-by-type 
+and only having one of the required type registered with Spring. It also can include using JDK5 annotations to declare 
+ransactional and security requirements rather than having to explicitly set up proxies in your Spring configuration. 
+If you can find ways to let Spring know what it needs to do for your action without needing any explicit configuration 
+in the Spring applicationContext.xml, then you won't have to maintain this configuration in both places.
 
-However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do is configure the bean in your Spring `applicationContext.xml` and then _change_  the class attribute from your Action in the `struts.xml` to use the bean name defined in Spring instead of the class name.
+However, sometimes you might want the bean to be completely managed by Spring. This is useful, for example, if you wish 
+to apply more complex AOP or Spring-enabled technologies, such as Acegi, to your beans. To do this, all you have to do 
+is configure the bean in your Spring `applicationContext.xml` and then _change_ the class attribute from your Action 
+in the `struts.xml` to use the bean name defined in Spring instead of the class name.
 
 Your `struts.xml` file would then have the Action class attributes changed.
 
 **struts.xml**
 
-
 ```xml
 <!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
@@ -150,13 +171,13 @@ Your `struts.xml` file would then have the Action class attributes changed.
 
 ```
 
-Where you have a Spring bean defined in your `applicationContext.xml` named "bar". Note that the `com.acme.Foo` Action did not need to be changed, because it can be autowired.
+Where you have a Spring bean defined in your `applicationContext.xml` named "bar". Note that the `com.acme.Foo` 
+Action did not need to be changed, because it can be autowired.
 
 A typical spring configuration for bar could look as following.
 
 **applicationConext.xml**
 
-
 ```xml
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
@@ -164,34 +185,30 @@ A typical spring configuration for bar could look as following.
     <bean id="bar" class="com.my.BarClass" singleton="false"/>
     ...
 </beans>
-
 ```
 
 To use session-scoped components with Spring and Struts, see the [Spring Session Components Workarounds](spring-session-components-workarounds) analysis.
 
-__Class Reloading__
+## Class Reloading
 
-The Spring plugin can be configured to automatically reload classes that change in the file system. This feature will enable code changes to be "hot deployed" without having to restart the web container. To enable this feature follow these steps:
+The Spring plugin can be configured to automatically reload classes that change in the file system. This feature will 
+enable code changes to be "hot deployed" without having to restart the web container. To enable this feature follow 
+these steps:
 
 1. Set "struts.devMode" to "true"
-
 2. Set "struts.class.reloading.watchList" to a comma separated list of directories, or jar files (absolute or relative paths)
-
 3. Add this to web.xml:
 
-
 ```xml
-   <context-param>
-       <param-name>contextClass</param-name>
-       <param-value>org.apache.struts2.spring.ClassReloadingXMLWebApplicationContext</param-value>
-   </context-param> 
-
+<context-param>
+   <param-name>contextClass</param-name>
+   <param-value>org.apache.struts2.spring.ClassReloadingXMLWebApplicationContext</param-value>
+</context-param>
 ```
 
 {:start="4"}
 4. Add Apache Commons JCI FAM to the classpath. If you are using maven, add this to pom.xml
 
-
 ```xml
    <dependency>
        <groupId>org.apache.commons</groupId>
@@ -201,8 +218,10 @@ The Spring plugin can be configured to automatically reload classes that change
 
 ```
 
-Letting the reloading class loader handle all the classes can lead to ClassCastException(s) because instances of the same classes loaded by different class loaders can not be assigned to each other. To prevent this problem we suggest that `struts.class.reloading.acceptClasses` is used to limit the classes loaded by the reloading class loader, so only actions are handled by it. This constant supports a comma separated list of regular expressions:
-
+Letting the reloading class loader handle all the classes can lead to ClassCastException(s) because instances of the same 
+classes loaded by different class loaders can not be assigned to each other. To prevent this problem we suggest 
+that `struts.class.reloading.acceptClasses` is used to limit the classes loaded by the reloading class loader, 
+so only actions are handled by it. This constant supports a comma separated list of regular expressions:
 
 ```xml
 <constant name="struts.class.reloading.acceptClasses" value="com.myproject.example.actions..*" />
@@ -211,7 +230,7 @@ Letting the reloading class loader handle all the classes can lead to ClassCastE
 
 > This feature is experimental, and **should never** be used in production systems.
 
-__Settings__
+## Settings
 
 The following settings can be customized. See the [developer guide](/core-developers/configuration-files).
 
@@ -225,6 +244,6 @@ The following settings can be customized. See the [developer guide](/core-develo
 |struts.class.reloading.reloadConfig|Reload the runtime configuration (action mappings, results etc) when a change is detected in one of the watched directories|false|true or false|
 |DEPRECATED: struts.objectFactory.spring.enableAopSupport|Uses different logic to construct beans to allow support AOP, it uses an old approach to create a bean, switch this flag if you have problems with Spring beans and AOP|false|true or false|
 
-__Installation__
+## Installation
 
 This plugin can be installed by copying the plugin jar into your application's `/WEB-INF/lib` directory. No other files need to be copied or created.
diff --git a/source/plugins/struts-1/index.md b/source/plugins/struts-1/index.md
index 386a4ccd4..683aa4ee0 100644
--- a/source/plugins/struts-1/index.md
+++ b/source/plugins/struts-1/index.md
@@ -1,10 +1,18 @@
 ---
 layout: plugin
 title: Struts 1 Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Struts 1 Plugin
+{:.no_toc}
 
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
 The Struts 1 plugin allows you to use existing Struts 1 Actions and ActionForms in Struts 2 applications
 
 This plugin provides a generic Struts 2 Action class to wrap an existing Struts 1 Action, `org.apache.struts2.s1.Struts1Action`.  The wrapper class provides the expected calls to the legacy Struts 1 Action and ActionForm, converting incoming and outgoing objects into the expected forms.  It works by using the [scoped model driven](/core-developers/scoped-model-driven-interceptor)  technique that uses a single Object as the model for every page, very similar to how the Struts 1 ActionForm [...]
diff --git a/source/plugins/testng/index.md b/source/plugins/testng/index.md
index 19ba3bd93..9c8f5d1bb 100644
--- a/source/plugins/testng/index.md
+++ b/source/plugins/testng/index.md
@@ -1,12 +1,20 @@
 ---
 layout: plugin
 title: TestNG Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # TestNG Plugin
+{:.no_toc}
 
-The TestNG plugin provides integration with the popular [TestNG](http://testng.org) unit testing framework.
+* Will be replaced with the ToC, excluding a header
+{:toc}
+
+## Description
 
+The TestNG plugin provides integration with the popular [TestNG](http://testng.org) unit testing framework.
 This plugin provides a base `StrutsTestCase` class that can subclassed for tests that work on Struts 2 components.  
 
 > This plugin is only available with Struts 2.1.1 or later
diff --git a/source/plugins/tiles-3/index.md b/source/plugins/tiles-3/index.md
index a6c668344..9180f5374 100644
--- a/source/plugins/tiles-3/index.md
+++ b/source/plugins/tiles-3/index.md
@@ -1,13 +1,21 @@
 ---
 layout: plugin
 title: Tiles 3 Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Tiles 3 Plugin
+{:.no_toc}
+
+* Will be replaced with the ToC, excluding a header
+{:toc}
 
 > This plugin was dropped in Struts 2.5, instead please use [Tiles Plugin](../tiles) which was extended and upgraded to Tiles 3.
-> 
-> Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look and feel. It can be used for both page decorating and componentization. This is the first release of the plugin!
+
+> Tiles is a templating framework designed to easily allow the creation of web application pages with a consistent look 
+> and feel. It can be used for both page decorating and componentization. This is the first release of the plugin!
 
 The Tiles 3 plugin allows actions to return Tiles 3 pages.
 
diff --git a/source/plugins/tiles/index.md b/source/plugins/tiles/index.md
index 061ba274d..39e65f516 100644
--- a/source/plugins/tiles/index.md
+++ b/source/plugins/tiles/index.md
@@ -1,6 +1,9 @@
 ---
 layout: plugin
 title: Tiles Plugin
+parent:
+    url: index.html
+    title: Plugins
 ---
 
 # Tiles Plugin