关闭

Struts2 的 struts.xml 配置中 namespace 的使用

2870人阅读 评论(0) 收藏 举报
分类:

转载自:http://www.blogjava.net/feicer/articles/258036.html

Struts2 的 struts.xml 中是分 package 配置的,可以为 package 设置 namespace 属性,如

<package namespace="/secure"   ....>
    ......
</package>

如果没有指定 namespace 属性,默认 namespace 是 ""。使用 namespace 可以方便于按不同目的规划对应用的访问规则。比如不同 namespace 下配置了不同的拦截器就可以实现权限的控制,如 "/secure" 下已登陆用户才能访问,"/public" 下可公开访问的。

配置了 namespace 直接就是反应在访问 URL 上,例如 namespace="/secure"  name="test" 的 action

 <package namespace="/secure"   ....>
       <action name="test"  ....
</package>

访问它的 URL 就是 http://ip:port/context/secure/test.action,那如果在 namespace "/secure" 下没有 test action 会出现什么情况呢?Struts 还会尝试在默认 namespace,即 "" 下找 test。

再举个例子,URL 是 http://ip:port/context/some/path/test.action 时,如果在 "/some/path" namespace 下找不到 test action,也是到 "" (default namespace) 下找 test action,但不会去 "/some" 下找的。

用标签 <s:url value="/secure/test.action"/>  对应页面源文件是 /context/secure/test.action

稍有麻的就是 <s:form action="/secure/test.action" .... 对应的源文件是 <form action="/context/secure/test.action" ...

但是后台会有警告:

警告: No configuration found for the specified action: '/secure/test.action' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

Struts2 把 action 属性值当整一个 Action Name 了,但这也不影响使用,这个 URL 正好能与 (package namespace) + (action name) 合上拍。

但是对于使用了动态方法调用(struts.enable.DynamicMethodInvocation = true)就没这么幸运了。很容易想当然的
 
<s:form action="/secure/test!update.action" ....  生成的 HTML 源文件却是 action="/TestStruts2/om/test"

同时后台的警告信息是:

警告: No configuration found for the specified action: '/secure/test' in namespace: ''. Form action defaulting to 'action' attribute's literal value.

很显然对于这个 action="/TestStruts2/om/test",提交时是会得到 HTTP Status 404 - /context/secure/test  错误。

正确的用法是 <s:action...> 也有一个 namespace 属性,对了,就是

<s:form namespace="/secure" action="test!login">  生成的 HTML 源文件是:<form action="/TestStruts2/om/test!login.action" ....>

我们要的就是这个。

如果不配置 namespace 属性,我们能不能在访问 action 时也用上目录层次呢?可以,那是在 struts1 习惯的做法,配置 <action name="secure/test" ....> name 中使用斜杠,但在 Struts2 中 Action Name 中使用斜杠需要设置

struts.enable.SlashesInActionNames=true                      默认为 false

可是 Struts2 大概不赞同这种做法,力挺 namespace 的作用。

对于上面使用了斜框的 Action Name,<s:form 中的写法要用

<s:form action="secure/test">                 生成 HTML 源文件:<form action="/context/secure/test.action" .....

<s:form action="secure/test!update">            生成 HTML 源文件:<form action="/context/secure/test!login.action" .....



上面的 action 后加不加 .action 无所谓,只是要保证 <s:form>  的 action 属性一定要与 struts.xml 中的 <action> 的 name 匹配上,如果你自作多情的在前面加个斜杠,如写成了
 
<s:form action="/secure/test!update"> 、 <s:form action="/secure/test">  或者 <s:form action="/secure/test!update.action">   生成的 HTML 源文件就都成了:<form action="/context/secure/test" .....

这也是从 Struts1 带来的弊病,因为 Struts1 中 <html:form> action 属性对应的是 <action> 的 path,而 Struts2 中 <s:form> 的 action 属性对应的是 <action> 的 name;name 要完全匹配,path 可以加些层次。

2
2
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

struts2的namespace的用法

name:该属性为package的name名字,在其他的package中不能重复。  namespace:该属性是默认路径,一般在模块中会有不同的文件夹,最好把你的模块的文件夹的路径写在此属性里...
  • fljxzxb
  • fljxzxb
  • 2011-11-03 11:25
  • 4093

Struts2中namespace的用法

Struts2中关于Action的namespace在很多地方出现,如struts.xml、form标签等等,有些莫名其妙的错误就是由于 namespace设置错误造成的。如无法找到匹配的Action...
  • sunboyzsm
  • sunboyzsm
  • 2012-03-01 09:28
  • 3933

struts2 namespace 用法解析

namespace 的配置很简单 只是在package里加个namespace属性/log"> //一定要有斜杠  /success.jsp /error.jsp jsp页面namespace="/l...
  • id19870510
  • id19870510
  • 2010-03-09 12:46
  • 2527

struts2学习:配置篇之namespace

把namespace单独拉出来讲一方面是因为它实际上不是一个element,而只是一个attribute,前面已经说了,它是package的一个attribute;另外一方面是因为这个属性是我接触St...
  • CMTobby
  • CMTobby
  • 2007-09-06 20:15
  • 18120

struts中package元素的namespace属性用法

struts中package元素的namespace属性几乎在所有的项目中都会使用到,开始总是不知道怎么用,后来在百度了一下,找到了一些解法,但是我自己尝试的时候却不能成功。后来我自己在他们的基础上做...
  • kqygww
  • kqygww
  • 2013-03-19 20:47
  • 10274

struts2命名空间namespace和访问路径的关系

我是在看了别人的博客之后,对namespace和访问路径的关系算是搞明白了,故记录下来供大家参阅和自己以后进行查看。 假设我的struts.xml配置文件中一个action配置如下: ...
  • menghuannvxia
  • menghuannvxia
  • 2015-07-31 14:56
  • 8857

struts2的路径和namespace问题

一个名为 myStruts2_0400_Path 项目里的struts.xml文件中有这样一个package配置:    package name="path" extends=...
  • u013246459
  • u013246459
  • 2017-02-22 16:05
  • 145

Struts2的package的的命名空间(默认命名空间与根命名空间)

首先要了解什么是包的根命名空间与默认命名空间         根命名空间,即namespace="/"。         默认命名空间,即...
  • kingsonyoung
  • kingsonyoung
  • 2015-10-04 11:15
  • 3209

struts.xml中package的namespace属性

struts.xml文件中package标签除了有name、extends属性外,还有一个十分重要的属性:namespace。如下:      namespace="/abc">     ...
  • u011628400
  • u011628400
  • 2013-08-07 20:03
  • 892

Struts.xml命名空间配置

一个应用中的多个Action类都需要在struts.xml中配置,重名现象不可避免。 通过为Action所在的包指定namespace属性来为该包下的所有Action指定共同的命名空间。 <a...
  • m_future1993
  • m_future1993
  • 2016-05-18 21:53
  • 495
    个人资料
    • 访问:1688185次
    • 积分:20932
    • 等级:
    • 排名:第435名
    • 原创:201篇
    • 转载:1111篇
    • 译文:2篇
    • 评论:202条
    程序员日记
    微信扫描关注我!
    个人淘宝
    博客专栏