blob: d50b0e168d98c2dc995bd08be4fde760dfc7e121 [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>Namespace Configuration</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>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '41']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<a href="https://github.com/apache/struts" class="github-ribbon">
<img decoding="async" loading="lazy" style="position: absolute; right: 0; border: 0;" width="149" height="149" src="https://github.blog/wp-content/uploads/2008/12/forkme_right_red_aa0000.png?resize=149%2C149" class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1">
</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-2024.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>
<li><a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</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><a href="/commercial-support.html">Commercial Support</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 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="/contributors/">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 href="index.html" title="back to Core Developers Guide"><< back to Core Developers Guide</a>
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/core-developers/namespace-configuration.md" title="Edit this page on GitHub">Edit on GitHub</a>
<h1 id="namespace-configuration">Namespace Configuration</h1>
<p>The namespace attribute subdivides action configurations into logical modules, each with its own identifying prefix.
Namespaces avoid conflicts between action names. Each namespace can have its own “menu” or “help” action, each with
its own implementation. While the prefix appears in the browser URI, the tags are “namespace aware”, so the namespace
prefix does not need to be embedded in forms and links.</p>
<blockquote>
<p>Struts 2 Namespaces are the equivalent of Struts Action 1 modules, but more convenient and flexible.</p>
</blockquote>
<h2 id="default-namespace">Default Namespace</h2>
<p>The default namespace is <code class="language-plaintext highlighter-rouge">""</code> - an empty string. The default namespace is used as a “catch-all” namespace. If an action
configuration is not found in a specified namespace, the default namespace is also be searched. The local/global
strategy allows an application to have global action configurations outside of the action element “extends” hierarchy.</p>
<p>The namespace prefix can be registered with Java declarative security, to ensure only authorized users can access
the actions in a given namespace.</p>
<h2 id="root-namespace">Root Namespace</h2>
<p>A root namespace <code class="language-plaintext highlighter-rouge">"/"</code> is also supported. The root is the namespace when a request directly under the context path is
received. As with other namespaces, it will fall back to the default <code class="language-plaintext highlighter-rouge">""</code> namespace if a local action is not found.</p>
<h2 id="namespace-example">Namespace Example</h2>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"default"</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"foo"</span> <span class="na">class=</span><span class="s">"mypackage.simpleAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"dispatcher"</span><span class="nt">&gt;</span>greeting.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"mypackage.simpleAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"dispatcher"</span><span class="nt">&gt;</span>bar1.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;/package&gt;</span>
<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"mypackage1"</span> <span class="na">namespace=</span><span class="s">"/"</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"moo"</span> <span class="na">class=</span><span class="s">"mypackage.simpleAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"dispatcher"</span><span class="nt">&gt;</span>moo.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;/package&gt;</span>
<span class="nt">&lt;package</span> <span class="na">name=</span><span class="s">"mypackage2"</span> <span class="na">namespace=</span><span class="s">"/barspace"</span><span class="nt">&gt;</span>
<span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"bar"</span> <span class="na">class=</span><span class="s">"mypackage.simpleAction"</span><span class="nt">&gt;</span>
<span class="nt">&lt;result</span> <span class="na">name=</span><span class="s">"success"</span> <span class="na">type=</span><span class="s">"dispatcher"</span><span class="nt">&gt;</span>bar2.jsp<span class="nt">&lt;/result&gt;</span>
<span class="nt">&lt;/action&gt;</span>
<span class="nt">&lt;/package&gt;</span>
</code></pre></div></div>
<h3 id="how-the-code-works">How the Code Works</h3>
<p>If a request for <code class="language-plaintext highlighter-rouge">/barspace/bar.action</code> is made, the <code class="language-plaintext highlighter-rouge">/barspace</code> namespace is searched for the <code class="language-plaintext highlighter-rouge">bar</code> action.
If found, the <code class="language-plaintext highlighter-rouge">bar</code> action is executed, else it will fall back to the default namespace. In the Namespace Example,
the <code class="language-plaintext highlighter-rouge">bar</code> action does exist in the <code class="language-plaintext highlighter-rouge">/barspace</code> namespace, so the <code class="language-plaintext highlighter-rouge">bar</code> action will be executed, and if “success” is
returned, the request will be forwarded to <code class="language-plaintext highlighter-rouge">bar2.jsp</code>.</p>
<p>If a request is made to <code class="language-plaintext highlighter-rouge">/barspace/foo.action</code>, the namespace <code class="language-plaintext highlighter-rouge">/barspace</code> will be checked for action <code class="language-plaintext highlighter-rouge">foo</code>.
If a local action is not found, the default namespace is checked. In the Namespace Example, there is no action <code class="language-plaintext highlighter-rouge">foo</code>
in the namespace <code class="language-plaintext highlighter-rouge">/barspace</code>, therefore the default will be checked and <code class="language-plaintext highlighter-rouge">/foo.action</code> will be executed.</p>
<p>In the Namespace Example, if a request for <code class="language-plaintext highlighter-rouge">moo.action</code> is made, the root namespace <code class="language-plaintext highlighter-rouge">"/"</code> is searched for a <code class="language-plaintext highlighter-rouge">moo</code>
action; if a root action is not found, the default namespace is checked. In this case, the <code class="language-plaintext highlighter-rouge">moo</code> action does exist
and will be executed. Upon success, the request would be forwarded to <code class="language-plaintext highlighter-rouge">moo.jsp</code>.</p>
<p>If a request is made for <code class="language-plaintext highlighter-rouge">/foo.action</code>, the root <code class="language-plaintext highlighter-rouge">"/"</code> namespace will be checked. If <code class="language-plaintext highlighter-rouge">foo</code> is found, the root action
will be selected. Otherwise, the framework will check the default namespace. In the Namespace Example, the <code class="language-plaintext highlighter-rouge">foo</code> action
does not exist in the root namespace, so the default namespace is checked, and the default foo action is executed.</p>
<p>Namespace are not hierarchical like a file system path. There is one namespace level. For example if the URL
<code class="language-plaintext highlighter-rouge">/barspace/myspace/bar.action</code> is requested, the framework will first look for namespace <code class="language-plaintext highlighter-rouge">/barspace/myspace</code>.
If the action does not exist at <code class="language-plaintext highlighter-rouge">/barspace/myspace</code>, the search will immediately fall back to the default namespace <code class="language-plaintext highlighter-rouge">""</code>.
The framework will not parse the namespace into a series of “folders”. In the Namespace Example, the bar action
in the default namespace would be selected.</p>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation. All Rights Reserved.
</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>