1.先说一个action配置文件里的namespace,看下例
package name="user" namespace="/user" extends="struts-default"> <action name="logon" class="cn.net.cipe.ots.user.actions.UserAction" method="logon"> <result name="success">/JSP/main.jsp</result> <result name="input">/JSP/login.jsp</result> <result name="error">/JSP/login.jsp</result> </action> </package>
那么如果在jsp里这样三种写法:
第一种
<form action="logon.action" >
.....
</form>
第二种
<form action="/user/logon.action" >
.....
</form>
第三种
<s:form action="logon" namespace="/user" >
.....
</s:form>
注意:这两种写法:
action="HelloWorld" namespace="/tt" 等价于action="/tt/HelloWorld.action"
2.如果在struts.xml中设定某action的命名空间 namespace="/test",如:
<package name="mywork" extends="struts-default" namespace="/test">
将s:form标签中的指向某action的地址设为:
(a)
<s:form action="test/login.action">
则生成的相应页面代码为:
<form id="login" οnsubmit="return true;" action="test/login.action" method="post">
当多次执行这一页面时(如每次登陆验证都不通过),则浏览器url地址中的namespace将会重复出现,如:
http://localhost:8080/webAppName/test/test/test/test/login.action
(b)
<s:form action="/test/login.action">
生成的相应页面代码为:
<form id="login" οnsubmit="return true;" action="/webAppName/test/login.action" method="post">
此时多次执行这一页面url地址中的namespace也不会重复出现,浏览器url地址为
http://localhost:8080/webAppName/test/login.action, 运行正常.
实例:
struts.xml配置
<package name="default" namespace="/" extends="struts-default"> <action name="struts2/namespace/test"> <result name="success">/app/namespace/reput3.jsp</result> </action> </package> <package name="struts2" namespace="/struts2" extends="struts-default"> <action name="namespace/test"> <result name="success">/app/namespace/reput.jsp</result> </action> </package> <package name="spring" namespace="/spring" extends="struts-default"> <action name="namespace/test"> <result>/app/namespace/reput2.jsp</result> </action> </package> <package name="/struts2/namespace" namespace="/struts2/namespace" extends="struts-default"> <action name="test"> <result>/app/namespace/reput4.jsp</result> </action> </package>
jsp代码1:
<s:form action="namespace/test" namespace="/struts2">
<s:submit value="struts2"></s:submit>
</s:form>
url为:
http://localhost:8090/ssh2/struts2/namespace/test.action
jsp代码2:
<s:form action="namespace/test.action" namespace="/spring" method="post">
<s:submit value="spring"></s:submit>
</s:form>
url为:
http://localhost:8090/ssh2/struts2/namespace/test.action
jsp代码3:
<s:form action="struts2/namespace/test">
<s:submit value="struts2-1-1"></s:submit>
</s:form>
url为: namsespace 为空 ,最终url为http://localhost:8090/ssh2/struts2/namespace/test ,url路径加上默认 namespace: /
jsp代码4:
<s:form action="struts2/namespace/test.action">
<s:submit value="struts2-1-2"></s:submit>
</s:form>
最终url为http://localhost:8090/ssh2/struts2/namespace/test.action
jsp代码5:
<s:form action="struts2/namespace/test" namespace="/">
<s:submit value="struts2-1-3"></s:submit>
</s:form>
url为:http://localhost:8090/ssh2/struts2/namespace/test.action
jsp代码6:
<s:form action="namespace/test" namespace="/hibernate">
<s:submit value="hib1"></s:submit>
</s:form>
namespace = /hibernate不存在,url路径不加上 定义的/namcespace,url为http://localhost:8090/ssh2/namespace/test
总结:
1、如果jsp标明的namespace不存在,url不会加标明的namespace值;
2、若jsp标明的namespace存在,jsp定义的action加后缀.action,则url前缀则不会添加标明的namespace值;
3.Action名称的搜索顺序:
(a)获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
(b)首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package则转步骤c;
(c)寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤d;
(d)寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,就去默认的namaspace的package下面去找名字为test的action(默认的命名空间为空字符串"" ),如果还是找不到,页面提示找不到action。