namespace的作用是定义访问Action的url,在不同的namespace中可以定义同名的action,不同的包可以共享同一个 namespace,可以通过namespace控制action的访问。
第一个问题,在<s:form>标签中如何指定namespace,是否必须指定namespace。
如果你访问的jsp路径与action的namespace重合,那么并不需要指定namespace,struts2会首先自动寻找跟你jsp路径相同 的namespace,如果没有会寻找默认namespace。
如果form标签中没有指定namespace,那么会使用jsp路径作为namespace,在struts.xml中寻找action。如果form 标签中指定了namespace,那么直接使用指定的namespace查找action。
例子:
访问URL="http://localhost:8080/struts2/test1/test1.jsp",中"/test1"为Web应用程序下 的访问路径,如果在test1.jsp中的form标签中没有指定namespace,那么默认action的namespace为"/test1",如 果test1.jsp中设置了form标签的namespace<s:form namespace="/mySpace"/>,那么action的namespace则为"/mySpace"。
第二个问题,在struts.xml的<package>标签中如何指定namespace
在<package>中指定了namespace,不仅为action提供了namespace,也同时规定了result返回结果的路径。 在result中可以使用绝对路径和相对路径对返回结果进行配置,绝对路径以"/"开头,代表了Web应用程序上下文的根目录,相对路径不以"/"开头。 绝对路径不受Action的namespace影响,而相对路径则以Action的namespace为根路径。
P.S. 在result返回结果时,如果采用默认namespace,并且返回结果在根目录下,也请使用绝对路径,不要使用相对路径。否则当form中的 namspace无法匹配struts.xml中的namespace,那么会在默认namespace中找,如果找到的result返回结果采用相对路 径,那么会使用form中的namespace作为根路径继续访问。
例子:
jsp1中<s:form action="test1" namespace="mySapce"/>,jsp1访问路径为http://localhost:8080/jsp1,而struts.xml 中不存在namespace为mySpace的action,那么当访问jsp1时,返回的结果为http://localhost:8080 /mySpace/jsp1