struts2.1.8解决请求寻找namespace路径顺序

昨天看了李刚的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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ldw4033

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值