Struts2中的namespace

在Struts2中,namespace负责对package的模块路径进行定义,从而避免Action名称相同所带来的冲突。在浏览器所访问的URL中,namespace作为Action的前缀而出现 — 如package的namespace为/samplens而该package中某个action的名称为test,那么浏览器所访问的URL则为/samplens/test.action。

namespace示例

以下是一个Struts2中使用namespace的例子:

<package name="defaultPkg">  
  <action name="foo" class="samplePackage.SimpleFooAction">
    ...
  </action>
  <action name="bar" class="samplePackage.SimpleBarAction">
    ...
  </action>
</package>  
<package name="testPackage1" namespace="/">  
  <action name="moo" class="samplePackage.MooAction">
    ...
  </action>
</package>  
<package name="testPackage2" namespace="/barspace">  
  <action name="bar" class="samplePackage.BarAction">
    ...
  </action>
</package>  

默认namespace

package标签中namespace属性的默认值为空(空字符串),表示接受所有与action名称相匹配的URL。如果某个URL中action的namespace并未在struts配置文件中找到,那么struts2将在namespace值为空的package中进行搜索。以上面的代码为例,如果浏览器访问的URL为/fooPath/foo.action,那么由于/fooPath这个namespace不存在,struts2将使用defaultPkg这个package里的foo action(调用samplePackage.SimpleFooAction类)。

根namespace

根namespace (“/”)是一种比较特殊的namespace,在该namespace下定义的action均可在Web应用的根路径上访问到。比如上述例子中的moo action可以通过/moo.action访问到。与其它的namespace相同,假如某个定义在根namespce上的action不存在,那么struts2将从默认namespace中进行搜索。

值得注意的是,尽管在URL上呈现出层级路径的样子,struts2在搜索namespace的时候却并不会做层级遍历。 还是以上面的代码为例,如果浏览器访问的URL为/barspace/myspace/bar.action,那么由于/barspace/myspace并不存在,struts2会直接到默认namespace中进行搜索(defaultPkg包)而不是在/barspace中进行查找,因此最终访问到的action类为samplePackage.SimpleBarAction。

Chuan Shao

Read more posts by this author.

Shanghai

Subscribe to Chuan's blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!