blob: 5eaafffeb2fbe5c4d61fd122ef7164f2837420bc [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="Date-Revision-yyyymmdd" content="20140918"/>
<meta http-equiv="Content-Language" content="en"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Default Workflow Interceptor</title>
<link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<link href="/highlighter/github-theme.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="/js/community.js"></script>
</head>
<body>
<a href="http://github.com/apache/struts" class="github-ribbon">
<img style="position: absolute; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
</a>
<header>
<nav>
<div role="navigation" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
Menu
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
</div>
<div id="struts-menu" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Home<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/index.html">Welcome</a></li>
<li><a href="/download.cgi">Download</a></li>
<li><a href="/releases.html">Releases</a></li>
<li><a href="/announce-2021.html">Announcements</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Support<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/mail.html">User Mailing List</a></li>
<li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
<li><a href="/security.html">Reporting Security Issues</a></li>
<li class="divider"></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
<li class="divider"></li>
<li><a href="/maven/project-info.html">Maven Project Info</a></li>
<li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
<li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Documentation<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/birdseye.html">Birds Eye</a></li>
<li><a href="/primer.html">Key Technologies</a></li>
<li><a href="/kickstart.html">Kickstart FAQ</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
<li class="divider"></li>
<li><a href="/getting-started/">Getting Started</a></li>
<li><a href="/security/">Security Guide</a></li>
<li><a href="/core-developers/">Core Developers Guide</a></li>
<li><a href="/tag-developers/">Tag Developers Guide</a></li>
<li><a href="/maven-archetypes/">Maven Archetypes</a></li>
<li><a href="/plugins/">Plugins</a></li>
<li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
<li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
<li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Contributing<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/youatstruts.html">You at Struts</a></li>
<li><a href="/helping.html">How to Help FAQ</a></li>
<li><a href="/dev-mail.html">Development Lists</a></li>
<li><a href="/contributors/">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/submitting-patches.html">Submitting patches</a></li>
<li><a href="/builds.html">Source Code and Builds</a></li>
<li><a href="/coding-standards.html">Coding standards</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Contributors+Guide">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/release-guidelines.html">Release Guidelines</a></li>
<li><a href="/bylaws.html">PMC Charter</a></li>
<li><a href="/volunteers.html">Volunteers</a></li>
<li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
<li><a href="/updating-website.html">Updating the website</a></li>
</ul>
</li>
<li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
</ul>
</div>
</div>
</div>
</nav>
</header>
<article class="container">
<section class="col-md-12">
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/core-developers/default-workflow-interceptor.md" title="Edit this page on GitHub">Edit on GitHub</a>
<a href="interceptors.html" title="back to Interceptors"><< back to Interceptors</a>
<h1 id="default-workflow-interceptor">Default Workflow Interceptor</h1>
<p>An interceptor that makes sure there are not validation, conversion or action errors before allowing the interceptor
chain to continue. If a single FieldError or ActionError (including the ones replicated by the Message Store Interceptor
in a redirection) is found, the INPUT result will be triggered.</p>
<p>This interceptor does not perform any validation.</p>
<p>This interceptor does nothing if the name of the method being invoked is specified in the <code class="highlighter-rouge">excludeMethods</code> parameter.
<code class="highlighter-rouge">excludeMethods</code> accepts a comma-delimited list of method names. For example, requests to <code class="highlighter-rouge">foo!input.action</code> and
<code class="highlighter-rouge">foo!back.action</code> will be skipped by this interceptor if you set the <code class="highlighter-rouge">excludeMethods</code> parameter to <code class="highlighter-rouge">input, back</code>.</p>
<blockquote>
<p>Note: As this method extends off MethodFilterInterceptor, it is capable of deciding if it is applicable only to selective
methods in the action class. This is done by adding param tags for the interceptor element, naming either a list of excluded
method names and/or a list of included method names, whereby <code class="highlighter-rouge">includeMethods</code> overrides <code class="highlighter-rouge">excludedMethods</code>. A single *
sign is interpreted as wildcard matching all methods for both parameters. <code class="highlighter-rouge">MethodFilterInterceptor</code> for more info.</p>
</blockquote>
<p>This interceptor also supports the following interfaces which can implemented by actions:</p>
<ul>
<li><code class="highlighter-rouge">ValidationAware</code> - implemented by ActionSupport class</li>
<li><code class="highlighter-rouge">ValidationWorkflowAware</code> - allows changing result name programmatically</li>
<li><code class="highlighter-rouge">ValidationErrorAware</code> - notifies action about errors and also allow change result name</li>
</ul>
<p>You can also use <code class="highlighter-rouge">InputConfig</code> annotation to change result name returned when validation errors occurred.</p>
<p>In <code class="highlighter-rouge">DefaultWorkflowInterceptor</code> applies only when action implements <code class="highlighter-rouge">com.opensymphony.xwork2.Validateable</code></p>
<ol>
<li>if the action class have <code class="highlighter-rouge">validate{MethodName}()</code>, it will be invoked</li>
<li>else if the action class have <code class="highlighter-rouge">validateDo{MethodName}()</code>, it will be invoked</li>
<li>no matter if 1] or 2] is performed, if <code class="highlighter-rouge">alwaysInvokeValidate</code> property of the interceptor is <code class="highlighter-rouge">true</code> (which is by
default <code class="highlighter-rouge">true</code>), <code class="highlighter-rouge">validate()</code> will be invoked.</li>
</ol>
<h2 id="parameters">Parameters</h2>
<ul>
<li><code class="highlighter-rouge">inputResultName</code> - Default to “input”. Determine the result name to be returned when an action / field error is found.</li>
</ul>
<h2 id="extending-the-interceptor">Extending the Interceptor</h2>
<p>There are no known extension points for this interceptor.</p>
<h2 id="examples">Examples</h2>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"someAction"</span> <span class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>good_result.ftl<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;--</span> <span class="err">In</span> <span class="err">this</span> <span class="err">case</span> <span class="err">myMethod</span> <span class="err">as</span> <span class="err">well</span> <span class="err">as</span> <span class="err">mySecondMethod</span> <span class="err">of</span> <span class="err">the</span> <span class="err">action</span> <span class="err">class</span>
<span class="err">will</span> <span class="err">not</span> <span class="err">pass</span> <span class="err">through</span> <span class="err">the</span> <span class="err">workflow</span> <span class="err">process</span> <span class="err">--</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"someAction"</span> <span class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">&gt;</span>
<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">&gt;</span>myMethod,mySecondMethod<span class="nt">&lt;/param&gt;</span>
<span class="err">&lt;</span>/interceptor-ref name="workflow"&gt;
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>good_result.ftl<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;--</span> <span class="err">In</span> <span class="err">this</span> <span class="err">case,</span> <span class="err">the</span> <span class="err">result</span> <span class="err">named</span> <span class="err">"error"</span> <span class="err">will</span> <span class="err">be</span> <span class="err">used</span> <span class="err">when</span>
<span class="err">an</span> <span class="err">action</span> <span class="err">/</span> <span class="err">field</span> <span class="err">error</span> <span class="err">is</span> <span class="err">found</span> <span class="err">--</span><span class="nt">&gt;</span>
<span class="nt">&lt;--</span> <span class="err">The</span> <span class="err">Interceptor</span> <span class="err">will</span> <span class="err">only</span> <span class="err">be</span> <span class="err">applied</span> <span class="err">for</span> <span class="err">myWorkflowMethod</span> <span class="err">method</span> <span class="err">of</span> <span class="err">action</span>
<span class="err">classes,</span> <span class="err">since</span> <span class="err">this</span> <span class="err">is</span> <span class="err">the</span> <span class="err">only</span> <span class="err">included</span> <span class="err">method</span> <span class="err">while</span> <span class="err">any</span> <span class="err">others</span> <span class="err">are</span> <span class="err">excluded</span> <span class="err">--</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"someAction"</span> <span class="na">class=</span><span class="s">"com.examples.SomeAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"params"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">&gt;</span>
<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"inputResultName"</span><span class="nt">&gt;</span>error<span class="nt">&lt;/param&gt;</span>
<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"excludeMethods"</span><span class="nt">&gt;</span>*<span class="nt">&lt;/param&gt;</span>
<span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"includeMethods"</span><span class="nt">&gt;</span>myWorkflowMethod<span class="nt">&lt;/param&gt;</span>
<span class="nt">&lt;/interceptor-ref&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span><span class="nt">&gt;</span>good_result.ftl<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
</code></pre></div></div>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2018 <a href="http://www.apache.org/">The Apache Software Foundation </a>.
All Rights Reserved.
</div>
<div class="col-md-12">
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation.
</div>
<div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
</footer>
<script>!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = "//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");</script>
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
<div id="fb-root"></div>
<script>(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>