Struts.xml中namespace 的使用
原文:http://blog.sina.com.cn/s/blog_6368ea770100gi4c.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
可以加些层次。