This is an automated email from the ASF dual-hosted git repository. git-site-role pushed a commit to branch asf-staging in repository https://gitbox.apache.org/repos/asf/struts-site.git
The following commit(s) were added to refs/heads/asf-staging by this push: new 1bf0f39f3 Updates stage by Jenkins 1bf0f39f3 is described below commit 1bf0f39f32596665fad7861f9e332105106214d8 Author: jenkins <bui...@apache.org> AuthorDate: Thu Oct 20 11:30:22 2022 +0000 Updates stage by Jenkins --- content/plugins/rest/index.html | 66 ++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/content/plugins/rest/index.html b/content/plugins/rest/index.html index 0e55cf604..f4eaaada0 100644 --- a/content/plugins/rest/index.html +++ b/content/plugins/rest/index.html @@ -153,6 +153,7 @@ </ul> </li> <li><a href="#advanced-topics" id="markdown-toc-advanced-topics">Advanced Topics</a> <ul> + <li><a href="#xstream-configuration" id="markdown-toc-xstream-configuration">XStream configuration</a></li> <li><a href="#custom-contenttypehandlers" id="markdown-toc-custom-contenttypehandlers">Custom ContentTypeHandlers</a></li> <li><a href="#settings" id="markdown-toc-settings">Settings</a></li> </ul> @@ -204,38 +205,38 @@ the Javadoc for the class, details this logic.</p> <p>This Restful action mapper enforces Ruby-On-Rails REST-style mappings. If the method is not specified (via <code class="language-plaintext highlighter-rouge">!</code> or <code class="language-plaintext highlighter-rouge">method:</code> prefix), the method is “guessed” at using REST-style conventions that examine the URL and the HTTP method. -Special care has been given to ensure this mapper works correctly with the codebehind plugin so that XML configuration +Special care has been given to ensure this mapper works correctly with the Convention plugin so that XML configuration is unnecessary.</p> <p>This mapper supports the following parameters:</p> <ul> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.idParameterName</code> - If set, this value will be the name of the parameter under which the id is stored. -The id will then be removed from the action name. Whether or not the method is specified, the mapper will try + <li><code class="language-plaintext highlighter-rouge">struts.mapper.idParameterName</code> - If set, this value will be the name of the parameter under which the id is stored. +The id will then be removed from the action name. Whether the method is specified, the mapper will try to truncate the identifier from the url and store it as a parameter.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.indexMethodName</code> - The method name to call for a GET request with no id parameter. Defaults to <strong>index</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.getMethodName</code> - The method name to call for a GET request with an id parameter. Defaults to <strong>show</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.postMethodName</code> - The method name to call for a POST request with no id parameter. Defaults to <strong>create</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.putMethodName</code> - The method name to call for a PUT request with an id parameter. Defaults to <strong>update</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.deleteMethodName</code> - The method name to call for a DELETE request with an id parameter. Defaults to <strong>destroy</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.editMethodName</code> - The method name to call for a GET request with an id parameter and the <strong>edit</strong> view specified. Defaults to <strong>edit</strong>.</li> - <li><code class="language-plaintext highlighter-rouge">struts.mapper.newMethodName</code> - The method name to call for a GET request with no id parameter and the <strong>new</strong> view specified. Defaults to <strong>editNew</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.indexMethodName</code> - The method name to call for a GET request with no id parameter. Defaults to <strong>index</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.getMethodName</code> - The method name to call for a GET request with an id parameter. Defaults to <strong>show</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.postMethodName</code> - The method name to call for a POST request with no id parameter. Defaults to <strong>create</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.putMethodName</code> - The method name to call for a PUT request with an id parameter. Defaults to <strong>update</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.deleteMethodName</code> - The method name to call for a DELETE request with an id parameter. Defaults to <strong>destroy</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.editMethodName</code> - The method name to call for a GET request with an id parameter and the <strong>edit</strong> view specified. Defaults to <strong>edit</strong>.</li> + <li><code class="language-plaintext highlighter-rouge">struts.mapper.newMethodName</code> - The method name to call for a GET request with no id parameter and the <strong>new</strong> view specified. Defaults to <strong>editNew</strong>.</li> </ul> <p>The following URL’s will invoke its methods:</p> <ul> - <li><code class="language-plaintext highlighter-rouge">GET: /movies</code> => method=<strong>index</strong></li> - <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers</code> => method=<strong>show</strong>, id=<strong>Thrillers</strong></li> - <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers;edit</code> => method=<strong>edit</strong>, id=<strong>Thrillers</strong></li> - <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers/edit</code> => method=<strong>edit</strong>, id=<strong>Thrillers</strong></li> - <li><code class="language-plaintext highlighter-rouge">GET: /movies/new</code> => method=<strong>editNew</strong></li> + <li><code class="language-plaintext highlighter-rouge">GET: /movies</code> => method=<strong>index</strong></li> + <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers</code> => method=<strong>show</strong>, id=<strong>Thrillers</strong></li> + <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers;edit</code> => method=<strong>edit</strong>, id=<strong>Thrillers</strong></li> + <li><code class="language-plaintext highlighter-rouge">GET: /movies/Thrillers/edit</code> => method=<strong>edit</strong>, id=<strong>Thrillers</strong></li> + <li><code class="language-plaintext highlighter-rouge">GET: /movies/new</code> => method=<strong>editNew</strong></li> <li><code class="language-plaintext highlighter-rouge">POST: /movies</code> => method=<strong>create</strong></li> - <li><code class="language-plaintext highlighter-rouge">PUT: /movies/Thrillers</code> => method=<strong>update</strong>, id=<strong>Thrillers</strong></li> - <li><code class="language-plaintext highlighter-rouge">DELETE: /movies/Thrillers</code> => method=<strong>destroy</strong>, id=<strong>Thrillers</strong></li> + <li><code class="language-plaintext highlighter-rouge">PUT: /movies/Thrillers</code> => method=<strong>update</strong>, id=<strong>Thrillers</strong></li> + <li><code class="language-plaintext highlighter-rouge">DELETE: /movies/Thrillers</code> => method=<strong>destroy</strong>, id=<strong>Thrillers</strong></li> </ul> -<p>To simulate the HTTP methods PUT and DELETE, since they aren’t supported by HTML, the HTTP parameter <code class="language-plaintext highlighter-rouge">_method</code> will be used.</p> +<p>To simulate the HTTP methods PUT and DELETE, since they aren’t supported by HTML, the HTTP parameter <code class="language-plaintext highlighter-rouge">_method</code> will be used.</p> <p>Or, expressed as a table:</p> @@ -302,7 +303,7 @@ in the following content types:</p> <ul> <li>HTML</li> - <li>XML </li> + <li>XML</li> <li>JSON</li> </ul> @@ -464,15 +465,38 @@ header and a last modified date so that the information will be cached properly is a convenient way to control the response in a type-safe way.</p> <p>Also, notice we aren’t returning the usual “success” result code in either method. This allows us to use the special -features of the <a href="../codebehind">Codebehind Plugin</a> to intuitively select the result template to process when this +features of the <a href="../convention">Conventio Plugin</a> to intuitively select the result template to process when this resource is accessed with the <code class="language-plaintext highlighter-rouge">.xhtml</code> extension. In this case, we can provide a customized XHTML view of the resource by creating <code class="language-plaintext highlighter-rouge">/orders-show.jsp</code> and <code class="language-plaintext highlighter-rouge">/orders-update.jsp</code> for the respective methods.</p> <h2 id="advanced-topics">Advanced Topics</h2> -<p>The following sections describe some of the non-standard bells and whistles that you might need to utilize for your +<p>The following sections describe some non-standard bells and whistles that you might need to utilize for your application’s more non-standard requirements.</p> +<h3 id="xstream-configuration">XStream configuration</h3> + +<p>Since Struts 6.1.0 you can customise XStream handler by implementing a few interfaces:</p> +<ul> + <li><code class="language-plaintext highlighter-rouge">XStreamAllowedClasses</code> - to control which classes can be accessed by the XStream</li> + <li><code class="language-plaintext highlighter-rouge">XStreamAllowedClassNames</code> - similar to the above but you can specify class names</li> + <li><code class="language-plaintext highlighter-rouge">XStreamPermissionProvider</code> - you can define a custom set of <code class="language-plaintext highlighter-rouge">TypePermission</code>s used by XStream</li> + <li><code class="language-plaintext highlighter-rouge">XStreamProvider</code> - you can create your own instance of <code class="language-plaintext highlighter-rouge">XStream</code> which will be used to serialise/deserialize objects</li> +</ul> + +<p>These interfaces need to be implemented by an action:</p> + +<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">private</span> <span class="kd">static</span> <span class="kd">class</span> <span class="nc">SimpleAction</span> <span class="kd">extends</span> <span class="nc">ActionSupport</span> <span class="kd">implements</span> <span class="nc">XStreamProvider</span> <span class="o">{</span> + <span class="nd">@Override</span> + <span class="kd">public</span> <span class="nc">XStream</span> <span class="nf">createXStream</span><span class="o">()</span> <span class="o">{</span> + <span class="nc">XStream</span> <span class="n">stream</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">XStream</span><span class="o">(</span><span class="k">new</span> <span class="nc">StaxDriver</span><span class="o">());</span> + <span class="n">stream</span><span class="o">.</span><span class="na">alias</span><span class="o">(</span><span class="s">"parents"</span><span class="o">,</span> <span class="nc">ArrayList</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="n">stream</span><span class="o">.</span><span class="na">alias</span><span class="o">(</span><span class="s">"data"</span><span class="o">,</span> <span class="nc">SimpleBean</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="k">return</span> <span class="n">stream</span><span class="o">;</span> + <span class="o">}</span> +<span class="o">}</span> +</code></pre></div></div> + <h3 id="custom-contenttypehandlers">Custom ContentTypeHandlers</h3> <p>If you need to handle extensions that aren’t supported by the default handlers, you can create your own <code class="language-plaintext highlighter-rouge">ContentTypeHandler</code>