Struts 2命名空间(namespace)小结

Struts 2中的命名空间可以分为三种:普通的命名空间、根命名空间、默认命名空间。其中,如果在定义package的时候,继承自struts-default,没有指定package,那么此时是默认命名空间,等价于namespace="";如果在定义package的时候,指定了namespace="/",那么就是根命名空间;如果在定义package的时候,指定了具体的路径,比如namespace="/login",那么就是一般普通的命名空间定义。

当访问一个URL的时候,例如访问http://localhost:8080/struts2demo/login/login.action,其中struts2demo是应用名,当访问该URL的时候,会首先在struts2demo应用下按顺序搜索:

(1)查找指定命名空间下的Action,如果找到则执行;

(2)如果找不到,则进入默认命名空间中查找该Action,找到则执行;

(3)如果找不到Action,则Struts 2程序出现异常。

另外,据说默认命名空间和根命名空间的区别在于:使用根命名空间的时候,只能访问根目录下的URL,比如只能访问http://localhost:8080/struts2demo/login.action这种,而不能是http://localhost:8080/struts2demo/login/login.action这种。

不过,我做了下面这个实验,发现结果和这里说的有一定差距:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="default" extends="struts-default">
		<action name="login" class="action.LoginAction">
			<result name="success">/WEB-INF/jsp/login1.jsp</result>
		</action>
	</package>

	<package name="mypackage01" extends="struts-default" namespace="/">
		<action name="login" class="action.LoginAction">
			<result name="success">/WEB-INF/jsp/login2.jsp</result>
		</action>
	</package>

	<package name="mypackage02" extends="struts-default" namespace="/login">
		<action name="login" class="action.LoginAction">
			<result name="success">/WEB-INF/jsp/login3.jsp</result>
		</action>
	</package>
</struts>

首先,我的struts.xml配置信息如上所示,我分别访问了下面几个URL:

(1)当访问http://localhost:8080/strust2demo/login/login.action时,返回的结果是login3,这是可以理解的。

(2)当访问http://localhost:8080/strust2demo/login.action时,返回的结果是login2,也算可以理解吧。

(3)当访问http://localhost:8080/strust2demo/xxxxxx/login.action时,返回的结果还是login2,这该让我怎么理解,此时并不是访问根目录下,按理说应该返回的结果是在默认命名空间下找到login,然后返回login1。

不能光听别人说,对于这个问题,以后在用struts的时候,应该注意下默认命名空间和根命名空间,不然又是一个坑。

本文标题:Struts 2命名空间(namespace)小结

本文链接:http://yedward.net/?id=334

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章