比如项目deom的struts.xml中有如下片段
Java代码
<package name="demo" extends="struts-default"> <action name="demo" class="***.demoController" <result>/demo.jsp</result> </action> </package>
我们可以用http://localhost:8080/demo/demo.action路径来访问action demo,也可以用http://localhost:8080/demo/***/demo.action路径来访问该action
上述路径中,http://localhost:8080/demo用来找到我们的demo project,之后的路径用来找到我们位于某一命名空间下的某一action。在struts中,我们的package继承了struts-default,也就拥有了struts的根空间,在这里我们没有指明namespace属性,但其实此时我们的namespace属性相当于namespace="",或者namespace="/"。
当我们用http://localhost:8080/demo/demo.action时,由于我们没有指定命名空间,struts直接在根空间中寻找name=demo的action,根空间有这个action,所以我们能访问。
当我们用http://localhost:8080/demo/***/demo.action时,struts首先在namespace=***的package中寻找,没有找到。此时struts继续在根空间里寻找,找到了,所以我们还是可以访问。
如果我们做如下设置,即将<package name="demo" extends="struts-default"> 中添加namespace="/demo"属性,修改为"]<package name="demo" extends="struts-default" namespace="/demo"> ,此时,我们只有用http://localhost:8080/demo/demo/demo.action路径才能访问到该action了,如果再用http://localhost:8080/demo/abc/demo.action或其他路径,就会出现异常。因为此时struts首先在命名空间为abc中寻找,如果没有找到,会继续在根空间寻找,而现在根空间已经没有名为demo的action了。
这就是我理解的struts2的命名空间和访问路径间的关系。