昨天看了李刚的strurt2的书籍,在namespase中发现他的理解问题,实践出真知
原文如下:
现在,我们看下我的struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<!-- 默认的命名空间 namespace="" -->
<package name="default0" extends="struts-default" namespace="">
<action name="f">
<result>/a.jsp</result><!-- 在webroot下建立a.jap,内容是 namespace=""-->
</action>
</package>
<!-- 根目录命名空间 namespace="/" -->
<package name="default1" extends="struts-default" namespace="/">
<action name="f">
<result>/b.jsp</result><!-- 在webroot下建立a.jap,内容是 namespace="/"-->
</action>
</package>
<package name="default2" extends="struts-default" namespace="/a/b/c">
<action name="f">
<result>/c.jsp</result><!-- 在webroot下建立a.jap,内容是 namespace="/a/b/c"-->
</action>
</package>
<package name="default3" extends="struts-default" namespace="/a/b">
<action name="f">
<result>/d.jsp</result>
</action>
</package>
<package name="default4" extends="struts-default" namespace="/a">
<action name="f">
<result>/e.jsp</result>
</action>
</package>
<package name="default5" extends="struts-default" namespace="/b">
<action name="f">
<result>/f.jsp</result>
</action>
</package>
</struts>
工程的目录结构:
接着,我们进行url请求测试:
1、http://localhost:8080/namespace/a/b/c/f.action
2、url请求不变(http://localhost:8080/namespace/a/b/c/f.action),把struts.xml文件的
<package name="default2" extends="struts-default" namespace="/a/b/c">
<action name="f">
<result>/c.jsp</result><!-- 在webroot下建立a.jap,内容是 namespace="/a/b/c"-->
</action>
</package>
注释掉,(原因是找不着/a/b/c最后只能匹配/a/b)
2、url请求不变(http://localhost:8080/namespace/a/b/c/f.action),把struts.xml文件的
<package name="default3" extends="struts-default" namespace="/a/b">
<action name="f">
<result>/d.jsp</result>
</action>
</package>
注释掉,(原因是找不着/a/b/c也找不到/a/b,最后只能匹配/a)
3、url请求不变(http://localhost:8080/namespace/a/b/c/f.action),把struts.xml文件的
<package name="default4" extends="struts-default" namespace="/a">
<action name="f">
<result>/e.jsp</result>
</action>
</package>
注释掉,(原因是找不着/a/b/c也找不到/a/b,也找不到/a,最后只能匹配/)
4、url请求不变(http://localhost:8080/namespace/a/b/c/f.action),把struts.xml文件的
<package name="default1" extends="struts-default" namespace="/">
<action name="f">
<result>/b.jsp</result><!-- 在webroot下建立a.jap,内容是 namespace="/"-->
</action>
</package>
注释掉,(原因是找不着/a/b/c也找不到/a/b,也找不到/a,也找不到/,最后只能匹配默认的“”)
总结:通过上述的实验,并不是像李刚那样说的,直接匹配“/a/b”的namespace,有则跳转,没有则匹配默认的namespace“”,而是分层查找
关于如何从URI映射到一个action中我做了一些测试,发现可以遵循如下的一条规则:
1.获得请求路径的URI,例如url是:http://localhost:8080/namespace/a/b/c/f.action
2.首先寻找namespace为"/a/b/c"的package,如果存在这个package,则在这个package中寻找名字为f的action,若找到则执行,否则报错;如果不存在这个package则转步骤3;
3.寻找namespace为"/a/b"的package,如果存在这个package,则在这个package中寻找名字为f的action,若找到则执行,否则报错;如果不存在这个package则转步骤4;
4.寻找namespace为"/a"的package,如果存在这个package,则在这个package中寻找名字为f的action,若找到则执行,如果不存在这个package则转步骤5;
5.寻找namespace为"/"的package,如果存在这个package,则在这个package中寻找名字为f的action,若找到则执行,如果不存在这个package则转步骤6;
6.寻找namespace为""的package,如果存在这个package,则在这个package中寻找名字为f的action,若找到则执行,如果不存在报错页面提示找不到action;
附上源码:http://yunpan.cn/Qz88q8JZdQ8J7 访问密码 5762