在配置struts.xml的时候,一定有如下结构:
<package name="" namespace="" extends=""> </package>
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>
示例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