[Struts 2] 配置文件struts.xml的URL访问控制,及struts解析action方式

在配置struts.xml的时候,一定有如下结构:

<package name="" namespace="" extends="">
</package>

其中的namespace就是用来区分action类别,同名action在不同package下可以定义,主要原因就是namespace的限定。

namespace限定 后会影响请求的URL。

示例1:项目名称<gopain>

<package name="user_package" namespace="/" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result><!--//用户登录,测试案例-->
	</action>
	<action name="register">
		<result>/WEB-INF/pages/user/register.jsp</result><!--//用户注册,测试案例-->
	</action>
	<action name="exit">
		<result>/WEB-INF/pages/user/exit.jsp</result><!--//用户注销,测试案例-->
	</action>
</package>

显然,用户登录的访问方式是:http://ip:port/gopain/login,即http://127.0.1:8080/gopain/login.访问成功

示例2:同以上项目

<package name="user_package" namespace="/user" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result><!--//用户登录,测试案例-->
	</action>
	<action name="register">
		<result>/WEB-INF/pages/user/register.jsp</result><!--//用户注册,测试案例-->
	</action>
	<action name="exit">
		<result>/WEB-INF/pages/user/exit.jsp</result><!--//用户注销,测试案例-->
	</action>
</package>
那么,此时的访问用户登录方式就为:http://127.0.1:8080/gopain/user/login.访问成功

示例3:同以上项目

<package name="user_package" namespace="/user/gopain" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result><!--//用户登录,测试案例-->
	</action>
	<action name="register">
		<result>/WEB-INF/pages/user/register.jsp</result><!--//用户注册,测试案例-->
	</action>
	<action name="exit">
		<result>/WEB-INF/pages/user/exit.jsp</result><!--//用户注销,测试案例-->
	</action>
</package>
现在的访问方式为:http://gopain:8080/Struts2/user/gopain/login,访问成功。

好了,做了这些无聊的案例,现在来测试:

<package name="user_package" namespace="/" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result>
	</action>
</package>
<package name="user_package_1" namespace="/user" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result>
	</action>
</package>
<package name="user_package_2" namespace="/user/gopain" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result>
	</action>
</package>
现在才是测试,访问以下链接:

http://gopain:8080/Struts2/login,访问成功

http://gopain:8080/Struts2/user/login,访问成功

http://gopain:8080/Struts2/user/gopain/login,访问成功

添加不存在namespace路径:

http://gopain:8080/Struts2/12/12/login,访问成功

http://gopain:8080/Struts2/1/1/login,访问成功

http://gopain:8080/Struts2/333/login,访问成功

删除package name="user_package".

<package name="user_package_1" namespace="/user" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result>
	</action>
</package>
<package name="user_package_2" namespace="/user/gopain" extends="struts-default">
	<action name="login">
		<result>/WEB-INF/pages/user/login.jsp</result>
	</action>
</package>
访问以下链接:

http://gopain:8080/Struts2/login,访问失败

http://gopain:8080/Struts2/user/login,访问成功

http://gopain:8080/Struts2/user/gopain/login,访问成功

添加不存在namespace路径:

http://gopain:8080/Struts2/user/123/321/login,访问成功

http://gopain:8080/Struts2/user/gopain/login,访问成功

http://gopain:8080/Struts2/user/gopain/123/login,访问成功

http://gopain:8080/Struts2/user/123/gopain/123/login,访问成功


好了,测试那么多,太废了。要是靠这样测试出原理的话,那就太***。


首先,在namespace下的action能访问时正常,但是在添加未定义的namespace后也能访问需要说明。

struts总是在namespace下搜索action,在访问到某namespace时,struts自动搜索该命名空间下的所有action,如果匹配直接响应,不会再继续搜索。

那么,如同以上示例,多个package下有同名action,如果处理的action不是目标action如何处理,那么所有action不要同名就直接解决了,开玩笑的,不然就没有必要再讨论这个了。

说明:

http://gopain:8080/Struts2/user/123/gopain/123/login,访问成功。这个接受请求的不是/user/gopain/login,而是/user/login。

http://gopain:8080/Struts2/user/gopain/123/login,访问成功。访问的action是/user/gopain/login。

http://gopain:8080/Struts2/user/123/321/login,访问成功。访问的action是/user/gopain/login。

http://gopain:8080/Struts2/12/12/login,访问成功。访问的是/login。

好了,原理大概就清晰了,

struts的action搜索是按顺序的,暂且定义为搜索,因为action数量有限,内存中已经定义了所有匹配的索引,都是直接响应,不会搜索,以下是为了说明其定义顺序。

比如,http://gopain:8080/Struts2/1/2/3/4/login。此处只是为了说明,namespace不宜使用纯数字命名。

首先到namespace下搜索名为login的action,如果搜索到login则停止搜索,不再试图其它访问。也就是无论/2,/3,/4,下有没有login,都不会转发请求到这些action中。

那么就有一个问题,在请求的action之前无论添加什么路径(如,定义访问路径,/user/option/alert,可以使用/user/option/1/2/1/alert来访问)。这个问题就是在没有配置URL指定的情况下,也就是说URL的访问就是action的调用。

一般不建议直接让URL的访问地址就是直接指向action,或者action在执行之后浏览器的地址栏滞留的就是此方法的访问路径。

也可以配置struts禁止搜索上级namespace。

在struts.xml配置:

<constantname="struts.configuration.xml.reload"value="true"/>

此配置之后,所有访问都需要全路径。【更多struts2配置项详解,请参考:http://blog.csdn.net/gopain/article/details/40790523】


以下访问链接都失败,无法访问。

http://gopain:8080/Struts2/12/12/login

http://gopain:8080/Struts2/1/1/login

http://gopain:8080/Struts2/333/login


你可能感兴趣的:(struts,namespace,url,2)