This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/struts-site.git
The following commit(s) were added to refs/heads/master by this push: new ee1bdd84c Update Results page (#172) ee1bdd84c is described below commit ee1bdd84ca234acf5c50d579292554c702422298 Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Wed Oct 19 16:04:58 2022 +0200 Update Results page (#172) * Cleans up navigation and content * Explains how to use results * Cleans up content * Includes _site again * Adds missing parent header * Excludes _site * Lists folder * Stops using docker * Reverts build to version before starts using Docker * Fixes typo in env name * Defines envs in script * Avoids using env prefix * Sets proper envs * Reverts to Docker again * List folders after Docker ends * Performs all git operations in Docker * Puts back Docker * Cleans up workspace and add missing git user data * Uses local git config * Builds with Docker and moves content out of Docker * Uses full path * Uses context path * Maps dedicated folder to store generated site * Uses Dockerfile with dedicate UID * Uses proper dockerfile syntax in pipeline * Moves building site into pipeline * Defines proper WORKSPACE env * Moves building commands back to pipeline * Uses proper GID * Reverts to non-Docker build * Stops installing ruby * Pushes changed Gemfile.lock * Adds remote refs where to push * Adds branch to push * Shows bundler version * Show git changes * Restores Gemfile.lock * Uses checkout to restore file * Adds ToC * Cleans up page * Cleans up page --- Gemfile.lock | 1 + Jenkinsfile | 30 ++-- source/core-developers/chain-result.md | 4 +- source/core-developers/dispatcher-result.md | 4 +- .../execute-and-wait-interceptor.md | 152 +++++++++++---------- source/core-developers/freemarker-result.md | 4 +- source/core-developers/httpheader-result.md | 4 +- source/core-developers/plain-result.md | 4 +- source/core-developers/plaintext-result.md | 4 +- source/core-developers/postback-result.md | 88 +++--------- source/core-developers/redirect-action-result.md | 4 +- source/core-developers/redirect-result.md | 4 +- source/core-developers/result-types.md | 55 ++++++-- source/core-developers/stream-result.md | 4 +- source/core-developers/velocity-result.md | 3 + source/core-developers/xsl-result.md | 4 +- source/plugins/index.md | 53 +++---- 17 files changed, 214 insertions(+), 208 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f82d005c9..712360637 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -59,6 +59,7 @@ GEM unicode-display_width (1.8.0) PLATFORMS + x86_64-darwin-21 x86_64-linux-musl DEPENDENCIES diff --git a/Jenkinsfile b/Jenkinsfile index ef5004548..e1a29e778 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,20 +10,24 @@ pipeline { disableConcurrentBuilds() skipStagesAfterUnstable() } + environment { + RUBY_PATH="${env.WORKSPACE}/.rvm" + GEM_HOME="${RUBY_PATH}/gems" + PATH="${GEM_HOME}/bin:${RUBY_PATH}/bin:${env.PATH}" + } stages { stage('Build a staged website') { - agent { - docker { - image 'jekyll/builder:4.2.2' - } - } steps { sh ''' - export GEM_HOME="$WORKSPACE/.gems" - export PATH="$GEM_HOME/bin:$PATH" - export BUNDLE_USER_HOME="$WORKSPACE/.bundle" + echo Generating a new version of website + + curl -sSL https://get.rvm.io | bash -s -- --path ${RUBY_PATH} + mkdir -p ${GEM_HOME} - bundle config set --local path $GEM_HOME + gem install --install-dir ${GEM_HOME} bundler -v '2.3.23' + + bundle -v + bundle config set --local path ${GEM_HOME} bundle install bundle exec jekyll build ''' @@ -31,17 +35,19 @@ pipeline { } stage('Deploy to stage area') { steps { - sh """ + sh ''' echo "Pushing changes into stage site" if ! git config remote.asf.url > /dev/null; then git remote add asf https://gitbox.apache.org/repos/asf/struts-site.git fi + git checkout Gemfile.lock + git fetch asf git checkout asf-staging git pull asf asf-staging - + cp -r _site/* content cp -r _site/.htaccess content/.htaccess @@ -51,7 +57,7 @@ pipeline { git commit -m "Updates stage by Jenkins" --allow-empty git push asf asf-staging - """ + ''' } } stage('Comment on PR') { diff --git a/source/core-developers/chain-result.md b/source/core-developers/chain-result.md index b25a4ecc3..e443bb452 100644 --- a/source/core-developers/chain-result.md +++ b/source/core-developers/chain-result.md @@ -2,8 +2,8 @@ layout: default title: Chain Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Chain Result diff --git a/source/core-developers/dispatcher-result.md b/source/core-developers/dispatcher-result.md index 9073b00b8..58ee47013 100644 --- a/source/core-developers/dispatcher-result.md +++ b/source/core-developers/dispatcher-result.md @@ -2,8 +2,8 @@ layout: default title: Dispatcher Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Dispatcher Result diff --git a/source/core-developers/execute-and-wait-interceptor.md b/source/core-developers/execute-and-wait-interceptor.md index e9ec02abb..9bf87ebef 100644 --- a/source/core-developers/execute-and-wait-interceptor.md +++ b/source/core-developers/execute-and-wait-interceptor.md @@ -8,34 +8,34 @@ parent: # Execute and Wait Interceptor -The ExecuteAndWaitInterceptor is great for running long-lived actions in the background while showing the user a nice +The ExecuteAndWaitInterceptor is great for running long-lived actions in the background while showing the user a nice progress meter. This also prevents the HTTP request from timing out when the action takes more than 5 or 10 minutes. -Using this interceptor is pretty straight forward. Assuming that you are including struts-default.xml, this interceptor -is already configured but is not part of any of the default stacks. Because of the nature of this interceptor, it must +Using this interceptor is pretty straight forward. Assuming that you are including struts-default.xml, this interceptor +is already configured but is not part of any of the default stacks. Because of the nature of this interceptor, it must be the `last` interceptor in the stack. -This interceptor works on a per-session basis. That means that the same action name (`myLongRunningAction`, in +This interceptor works on a per-session basis. That means that the same action name (`myLongRunningAction`, in the above example) cannot be run more than once at a time in a given session. On the initial request or any subsequent -requests (before the action has completed), the `wait` result will be returned. +requests (before the action has completed), the `wait` result will be returned. ->The wait result is responsible for issuing a subsequent request back to the action, giving the effect +> The wait result is responsible for issuing a subsequent request back to the action, giving the effect > of a self-updating progress meter. -If no `wait` result is found, Struts will automatically generate a wait result on the fly. This result is written -in FreeMarker and cannot run unless FreeMarker is installed. If you don't wish to deploy with FreeMarker, you must +If no `wait` result is found, Struts will automatically generate a wait result on the fly. This result is written +in FreeMarker and cannot run unless FreeMarker is installed. If you don't wish to deploy with FreeMarker, you must provide your own wait result. This is generally a good thing to do anyway, as the default wait page is very plain. -Whenever the wait result is returned, the action that is currently running in the background will be placed on top -of the stack. This allows you to display progress data, such as a count, in the wait page. By making the wait page +Whenever the wait result is returned, the action that is currently running in the background will be placed on top +of the stack. This allows you to display progress data, such as a count, in the wait page. By making the wait page automatically reload the request to the action (which will be short-circuited by the interceptor), you can give the appearance of an automatic progress meter. -This interceptor also supports using an initial wait delay. An initial delay is a time in milliseconds we let the server -wait before the wait page is shown to the user. During the wait this interceptor will wake every 100 millis to check -if the background process is done premature, thus if the job for some reason doesn't take to long the wait page is not +This interceptor also supports using an initial wait delay. An initial delay is a time in milliseconds we let the server +wait before the wait page is shown to the user. During the wait this interceptor will wake every 100 millis to check +if the background process is done premature, thus if the job for some reason doesn't take to long the wait page is not shown to the user. -This is useful for e.g. search actions that have a wide span of execution time. Using a delay time of 2000 millis we +This is useful for e.g. search actions that have a wide span of execution time. Using a delay time of 2000 millis we ensure the user is presented fast search results immediately and for the slow results a wait page is used. > Important: Because the action will be running in a separate thread, you > can't use ActionContext because it @@ -47,76 +47,78 @@ For example, the `search` action would run as a thread named `searchBackgroundPr ## Parameters - - `threadPriority` (optional) - the priority to assign the thread. Default is `Thread.NORM_PRIORITY`. - - `delay` (optional) - an initial delay in millis to wait before the wait page is shown (returning `wait` as result code). - Default is no initial delay. - - `delaySleepInterval` (optional) - only used with delay. Used for waking up at certain intervals to check if the background - process is already done. Default is 100 millis. +- `threadPriority` (optional) - the priority to assign the thread. Default is `Thread.NORM_PRIORITY`. +- `delay` (optional) - an initial delay in millis to wait before the wait page is shown (returning `wait` as result + code). Default is no initial delay. +- `delaySleepInterval` (optional) - only used with delay. Used for waking up at certain intervals to check if the + background process is already done. Default is 100 millis. ## Extending the Interceptor -If you wish to make special preparations before and/or after the invocation of the background thread, you can extend -the `BackgroundProcess` class and implement the `beforeInvocation()` and `afterInvocation()` methods. This may be useful -for obtaining and releasing resources that the background process will need to execute successfully. To use your background +If you wish to make special preparations before and/or after the invocation of the background thread, you can extend +the `BackgroundProcess` class and implement the `beforeInvocation()` and `afterInvocation()` methods. This may be useful +for obtaining and releasing resources that the background process will need to execute successfully. To use your +background process extension, extend `ExecuteAndWaitInterceptor` and implement the `getNewBackgroundProcess()` method. ## Examples +### Example code 1 + ```xml - <action name="someAction" class="com.examples.SomeAction"> - <interceptor-ref name="completeStack"/> - <interceptor-ref name="execAndWait"/> - <result name="wait">longRunningAction-wait.jsp</result> - <result name="success">longRunningAction-success.jsp</result> - </action> +<action name="someAction" class="com.examples.SomeAction"> + <interceptor-ref name="completeStack"/> + <interceptor-ref name="execAndWait"/> + <result name="wait">longRunningAction-wait.jsp</result> + <result name="success">longRunningAction-success.jsp</result> +</action> +``` +```html <%@ taglib prefix="s" uri="/struts" %> - <html> - <head> - <title>Please wait</title> - <meta http-equiv="refresh" content="5;url=<s:url includeParams="all" />"/> - </head> - <body> - Please wait while we process your request. - Click <a href="<s:url includeParams="all" />"></a> if this page does not reload automatically. - </body> - </html> - </pre> - - <p><u>Example code2:</u></p> - <p> - This example will wait 2 second (2000 millis) before the wait page is shown to the user. Therefore - if the long process didn't last long anyway the user isn't shown a wait page. - </p> - - <pre> - <action name="someAction" class="com.examples.SomeAction"> - <interceptor-ref name="completeStack"/> - <interceptor-ref name="execAndWait"> - <param name="delay">2000<param> - <interceptor-ref> - <result name="wait">longRunningAction-wait.jsp</result> - <result name="success">longRunningAction-success.jsp</result> - </action> - </pre> - - <p><u>Example code3:</u></p> - <p> - This example will wait 1 second (1000 millis) before the wait page is shown to the user. - And at every 50 millis this interceptor will check if the background process is done, if so - it will return before the 1 second has elapsed, and the user isn't shown a wait page. - </p> - - <pre> - <action name="someAction" class="com.examples.SomeAction"> - <interceptor-ref name="completeStack"/> - <interceptor-ref name="execAndWait"> - <param name="delay">1000<param> - <param name="delaySleepInterval">50<param> - <interceptor-ref> - <result name="wait">longRunningAction-wait.jsp</result> - <result name="success">longRunningAction-success.jsp</result> - </action> - </pre> +<html> +<head> + <title>Please wait</title> + <meta http-equiv="refresh" content="5;url=<s:url includeParams='all' />"/> +</head> +<body> +Please wait while we process your request. +Click <a href="<s:url includeParams=" all" />"></a> if this page does not reload automatically. +</body> +</html> +</pre> +``` + +### Example code 2: +This example will wait 2 second (2000 millis) before the wait page is shown to the user. Therefore if the long process +didn't last long anyway the user isn't shown a wait page. + +```xml +<action name="someAction" class="com.examples.SomeAction"> + <interceptor-ref name="completeStack"/> + <interceptor-ref name="execAndWait"> + <param name="delay">2000</param> + </interceptor-ref> + <result name="wait">longRunningAction-wait.jsp</result> + <result name="success">longRunningAction-success.jsp</result> +</action> + ``` + +### Example code 3: + +This example will wait 1 second (1000 millis) before the wait page is shown to the user. +And at every 50 millis this interceptor will check if the background process is done, if so +it will return before the 1 second has elapsed, and the user isn't shown a wait page. + +```xml +<action name="someAction" class="com.examples.SomeAction"> + <interceptor-ref name="completeStack"/> + <interceptor-ref name="execAndWait"> + <param name="delay">1000</param> + <param name="delaySleepInterval">50</param> + </interceptor-ref> + <result name="wait">longRunningAction-wait.jsp</result> + <result name="success">longRunningAction-success.jsp</result> +</action> ``` diff --git a/source/core-developers/freemarker-result.md b/source/core-developers/freemarker-result.md index 7d429f768..73e77a313 100644 --- a/source/core-developers/freemarker-result.md +++ b/source/core-developers/freemarker-result.md @@ -2,8 +2,8 @@ layout: default title: FreeMarker Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # FreeMarker Result diff --git a/source/core-developers/httpheader-result.md b/source/core-developers/httpheader-result.md index eaa1234ef..e48fe857b 100644 --- a/source/core-developers/httpheader-result.md +++ b/source/core-developers/httpheader-result.md @@ -2,8 +2,8 @@ layout: default title: HttpHeader Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # HttpHeader Result diff --git a/source/core-developers/plain-result.md b/source/core-developers/plain-result.md index 7a2593ff0..f4a641209 100644 --- a/source/core-developers/plain-result.md +++ b/source/core-developers/plain-result.md @@ -2,8 +2,8 @@ layout: default title: Plain Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Plain Result diff --git a/source/core-developers/plaintext-result.md b/source/core-developers/plaintext-result.md index 678cadd1c..6aed2565f 100644 --- a/source/core-developers/plaintext-result.md +++ b/source/core-developers/plaintext-result.md @@ -2,8 +2,8 @@ layout: default title: PlainText Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # PlainText Result diff --git a/source/core-developers/postback-result.md b/source/core-developers/postback-result.md index 2e8061cf0..806112919 100644 --- a/source/core-developers/postback-result.md +++ b/source/core-developers/postback-result.md @@ -1,83 +1,39 @@ --- layout: core-developers title: Postback Result +parent: + title: Result types + url: result-types --- # Postback Result ## Description - - -{% comment %}start snippet id=description|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} -<p> <p> - - A result that renders the current request parameters as a form which - - immediately submits a <a href="http://en.wikipedia.org/wiki/Postback">postback</a> - - to the specified destination. - - </p> -</p> -{% comment %}end snippet id=description|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} +A result that renders the current request parameters as a form which immediately submits +a [postback](http://en.wikipedia.org/wiki/Postback) to the specified destination. ## Parameters - - -{% comment %}start snippet id=params|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} -<p> <ul> - - <li>location - http location to post the form</li> - - <li>prependServletContext (true|false) - when location is relative, controls if to add Servlet Context, default "true"</li> - - <li>actionName - action name to post the form (resolved as an expression)</li> - - <li>namespace - action's namespace to use (resolved as an expression)</li> - - <li>method - actions' method to use (resolved as an expression)</li> - - <li>cache (true|false) - when set to true adds cache control headers, default "true"</li> - - <li>parse (true|false) - when set to true actionName, namespace and method are parsed, default "true"</li> - - </ul> -</p> -{% comment %}end snippet id=params|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} +- location - http location to post the form +- prependServletContext (true|false) - when location is relative, controls if to add Servlet Context, default "true" +- actionName - action name to post the form (resolved as an expression) +- namespace - action's namespace to use (resolved as an expression) +- method - actions' method to use (resolved as an expression) +- cache (true|false) - when set to true adds cache control headers, default "true" +- parse (true|false) - when set to true actionName, namespace and method are parsed, default "true" ## Examples - - -{% comment %}start snippet id=example|lang=xml|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} - - ```xml - - <action name="registerThirdParty" > - - <result type="postback">https://www.example.com/register</result> - - </action> - - - - <action name="registerThirdParty" > - - <result type="postback"> - - <param name="namespace">/secure</param> - - <param name="actionName">register2</param> - - </result> - - </action> - - +<action name="registerThirdParty" > + <result type="postback">https://www.example.com/register</result> +</action> + +<action name="registerThirdParty" > + <result type="postback"> + <param name="namespace">/secure</param> + <param name="actionName">register2</param> + </result> +</action> ``` - - -{% comment %}end snippet id=example|lang=xml|javadoc=true|url=org.apache.struts2.result.PostbackResult {% endcomment %} diff --git a/source/core-developers/redirect-action-result.md b/source/core-developers/redirect-action-result.md index de9e27cbf..11e236000 100644 --- a/source/core-developers/redirect-action-result.md +++ b/source/core-developers/redirect-action-result.md @@ -2,8 +2,8 @@ layout: default title: Redirect Action Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Redirect Action Result diff --git a/source/core-developers/redirect-result.md b/source/core-developers/redirect-result.md index 82adde1aa..753f83996 100644 --- a/source/core-developers/redirect-result.md +++ b/source/core-developers/redirect-result.md @@ -2,8 +2,8 @@ layout: default title: Redirect Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Redirect Result diff --git a/source/core-developers/result-types.md b/source/core-developers/result-types.md index c85a6d081..3ec5b0da3 100644 --- a/source/core-developers/result-types.md +++ b/source/core-developers/result-types.md @@ -4,11 +4,15 @@ title: Result Types --- # Result Types +{:.no_toc} Most use cases can be divided into two phases. First, we need to change or query the application's state, and then we need to present an updated view of the application. The Action class manages the application's state, and the Result Type manages the view. +* Will be replaced with the ToC, excluding a header +{:toc} + ## Predefined Result Types The framework provides several implementations of the `com.opensymphony.xwork2.Result` interface, ready to use in your @@ -23,21 +27,54 @@ own applications. |[Stream Result](stream-result)|Used to stream an InputStream back to the browser (usually for file downloads)| |[Velocity Result](velocity-result)|Used for _Velocity_ integration| |[XSL Result](xsl-result)|Used for XML/XSLT integration| -|[Plain Result](plain-result)|A plain result which all you to write directly to a HttpResponse using a simplified API (since Struts 2.6)| +|[Plain Result](plain-result)|A plain result which all you to write directly to a HttpResponse using a simplified API (since Struts 6.x)| |[PlainText Result](plaintext-result)|Used to display the raw content of a particular file/page (i.e jsp, HTML)| |[Tiles Result](../plugins/tiles/)|Used to provide Tiles integration| -|[Tiles 3 Result](../plugins/tiles-3/)|Used to provide Tiles 3 integration| |[Postback Result](postback-result)|Used to postback request parameters as a form to the specified destination| |[JSON Result](../plugins/json/) |Used to serialize actions into JSON| - -## Optional - -|[JasperReports Plugin](../plugins/jasperreports/)|Used for [JasperReports Tutorial](../getting-started/jasper-reports-tutorial) integration|Optional, third-party plugin| +|[JasperReports Plugin](../plugins/jasperreports/)|Used for [JasperReports Tutorial](../getting-started/jasper-reports-tutorial) integration| Additional Result Types can be created and plugged into an application by implementing the `com.opensymphony.xwork2.Result` interface. Custom Result Types might include generating an email or JMS message, generating images, and so forth. -## Default Parameters +## How to use results + +Once your action has been executed it must either return a result name (as `java.lang.String`) or instance +of `com.opensymphony.xwork2.Result` and then the result will be executed directly. + +If a String has been returned, the framework will try to find a matching result in the configuration and then it will +execute the result of a given type, see example: + +```xml +<result name="success" type="dispatcher">/WEB-INF/index.jsp</result> +``` + +You can define many results per action distinguishing them by different names: + +```xml +<result name="success" type="dispatcher">/WEB-INF/index.jsp</result> +<result name="input" type="dispatcher">/WEB-INF/form.jsp</result> +<result name="error" type="dispatcher">/WEB-INF/error.jsp</result> +``` + +## Default result type + +In `struts-default.xml` the Dispatcher result type is registered as a default result type, which means you don't have to +specify the `type` attribute if you want to use it: + +```xml +<result name="success">/WEB-INF/index.jsp</result> +``` + +## Default result name + +If you action method returns `success`, which is a default name of the result, you don't have specify the `name` attribute as well: + +```xml +<result>/WEB-INF/index.jsp</result> +``` + +## Default parameters To minimize configuration, Results can be configured with a single value, which will be converted into a parameter, and each Result can specify which parameter this value should be set as. For example, here is a result defined in XML @@ -59,7 +96,7 @@ Since probably 95% of your actions won't need results that contain multiple para a significant amount of configuration. It also follows that if you have specified the default parameter, you don't need to set the same parameter as a specifically-named parameter. -## Registering Result Types +## Registering result types All Result Types are plugged in via the [Result Configuration](result-configuration). @@ -72,7 +109,7 @@ Check [Define dedicated factory](object-factory) to see how to do it. Struts 2 provides one such extension for you: `ParamNameAwareResult` interface when used with `StrutsResultBuilder` can limit parameters assigned to the result. -So you can simple extend existing result with such a functionality as below: +So you can simply extend existing result with such a functionality as below: ```java public class MyResult extends ServletDispatcherResult implements ParamNameAwareResult { diff --git a/source/core-developers/stream-result.md b/source/core-developers/stream-result.md index 303137a0a..f6c67687a 100644 --- a/source/core-developers/stream-result.md +++ b/source/core-developers/stream-result.md @@ -2,8 +2,8 @@ layout: default title: Stream Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # Stream Result diff --git a/source/core-developers/velocity-result.md b/source/core-developers/velocity-result.md index 562c8811b..57e00d076 100644 --- a/source/core-developers/velocity-result.md +++ b/source/core-developers/velocity-result.md @@ -1,6 +1,9 @@ --- layout: core-developers title: Velocity Result +parent: + title: Result types + url: result-types --- # Velocity Result diff --git a/source/core-developers/xsl-result.md b/source/core-developers/xsl-result.md index 428714de2..7d2f38c5f 100644 --- a/source/core-developers/xsl-result.md +++ b/source/core-developers/xsl-result.md @@ -2,8 +2,8 @@ layout: default title: XSL Result parent: - title: Core Developers Guide - url: index.html + title: Result types + url: result-types --- # XSL Result diff --git a/source/plugins/index.md b/source/plugins/index.md index 13b2176af..a11e72f29 100644 --- a/source/plugins/index.md +++ b/source/plugins/index.md @@ -5,44 +5,45 @@ title: Plugins # Plugin Developers Guide -Apache Struts 2 provides a simple [plugin architecture](plugins-architecture) so that developers can extend the framework just by -adding a JAR to the application's classpath. Since plugins are contained in a JAR, they are easy to share with others. -Several plugins are bundled with the framework, and others are available from third-party sources. +Apache Struts 2 provides a simple [plugin architecture](plugins-architecture) so that developers can extend the +framework just by adding a JAR to the application's classpath. Since plugins are contained in a JAR, they are easy +to share with others. Several plugins are bundled with the framework, and others are available from third-party sources. - [Plugins Architecture](plugins-architecture) - [Extending an Application with Custom Plugins](extending-an-application-with-custom-plugins) ## Bundled Plugins -| Name | Versions | Note | -|-------------------------------------------|----------------------|--------------------------------------------------------------------| -| [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) | +| Name | Versions | Note | +|-------------------------------------------|------------------------|-----------------------------------------------------------------------| +| [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) | | [Config Browser Plugin](config-browser) ||| -| [Convention Plugin](convention) | 2.1.3+ || +| [Convention Plugin](convention) | 2.1.3+ || | [DWR Plugin](dwr) ||| -| [Embedded JSP Plugin](embedded-jsp) | 2.1.7+ | deprecated since 2.6 | +| [Embedded JSP Plugin](embedded-jsp) | 2.1.7+ | deprecated since 6.0.0 | | [JasperReports Plugin](jasperreports) ||| -| [Java 8 Support Plugin](java-8-support) | 2.3.21 - 2.5.2 || -| [Javatemplates Plugin](javatemplates) | 2.1.3+ || +| [Java 8 Support Plugin](java-8-support) | 2.3.21 - 2.5.2 || +| [Javatemplates Plugin](javatemplates) | 2.1.3+ || | [JFreeChart Plugin](jfreechart) ||| -| [JSF Plugin](jsf) | < 2.5 | removed since 2.5 | -| [JSON Plugin](json) | 2.1.7+ || +| [JSF Plugin](jsf) | < 2.5 | removed since 2.5 | +| [JSON Plugin](json) | 2.1.7+ || | [JUnit Plugin](junit) ||| -| [OVal Plugin](oval) | 2.1.7+ | deprecated since 2.6, use [Bean Validation Plugin](bean-validation) | -| [OSGi Plugin](osgi) | 2.1.7+ | deprecated since 2.6 | -| [Plexus Plugin](plexus) || deprecated since 2.6 | -| [Portlet Plugin](portlet) || deprecated since 2.6 | -| [Portlet Tiles Plugin](portlet-tiles) | 2.3.5+ | deprecated since 2.6 | -| [REST Plugin](rest) | 2.1.1+ || -| [SiteGraph Plugin](sitegraph) | < 2.5 | removed since 2.5 | -| [SiteMesh Plugin](sitemesh) || deprecated since 2.6 | +| [OVal Plugin](oval) | 2.1.7+ | deprecated since 6.0.0, use [Bean Validation Plugin](bean-validation) | +| [OSGi Plugin](osgi) | 2.1.7+ | deprecated since 6.0.0 | +| [Plexus Plugin](plexus) || deprecated since 6.0.0 | +| [Portlet Plugin](portlet) || deprecated since 6.0.0 | +| [Portlet Tiles Plugin](portlet-tiles) | 2.3.5+ | deprecated since 6.0.0 | +| [REST Plugin](rest) | 2.1.1+ || +| [SiteGraph Plugin](sitegraph) | < 2.5 | removed since 2.5 | +| [SiteMesh Plugin](sitemesh) || deprecated since 6.0.0 | | [Spring Plugin](spring) ||| -| [Struts 1 Plugin](struts-1) | < 2.5 | removed since 2.5 | +| [Struts 1 Plugin](struts-1) | < 2.5 | removed since 2.5 | | [TestNG Plugin](testng) ||| | [Tiles Plugin](tiles) ||| -| [Tiles 3 Plugin](tiles-3) | < 2.5 | removed since 2.5 | -| [Velocity Plugin](velocity) | < 6.0.0 | | +| [Tiles 3 Plugin](tiles-3) | < 2.5 | removed since 2.5 | +| [Velocity Plugin](velocity) | | | -> For a complete list of bundled and third-party plugins, visit the [Plugin Registry](http://cwiki.apache.org/S2PLUGINS/Home). +> For a complete list of bundled and third-party plugins, visit +> the [Plugin Registry](http://cwiki.apache.org/S2PLUGINS/Home).