默认的命名空间“ namespace="" ”。 根命名空间 “ namespace="/" ”。
<package name="test" extends="struts-default"> ,假设未指定命名空间,则命名空间默觉得 “ namespace="" ”。
默认命名空间里的Action能够处理不论什么命名空间下的Action请求。
比如,假设存在URL为/barspace/bar.action的请求,而且/barspace的命名空间下没有名为bar的Action,则默认命名空间下名为bar的Action也会处理用户请求。但根命名空间下的Action仅仅处理根命名空间下的Action的请求,这是根命名空间和默认命名空间的差别。
命名空间仅仅有一个级别。假设请求的URL是/bookservice/search/get.action。系统将先在/bookservice/search的命名空间下查找名为get的Action,假设在该命名空间内找到名为get的Action。则由该Action处理用户的请求。假设未找到。系统将直接进入默认的命名空间中查找名为get的Action,而不会在/bookservice的命名空间下查找名为get的Action 。
在struts2中,Action的名称的搜索时遵循一定原则的。以下就是struts2在请求到来后。怎么去找到合适的action进行调用。总结例如以下 (获得请求路径的URI。比如url是:http://server/struts2/path1/path2/path3/test.action):
1.首先寻找namespace为/path1/path2/path3的package。假设不存在这个package则运行步骤2;假设存在这个 package,则在这个package中寻找名字为test的action,当在该package下寻找不到action 时就会直接跑到默认namaspace的package里面去寻找action(默认的命名空间为空字符串""),假设在默认namaspace的 package里面还寻找不到该action,页面提示找不到action。
2.寻找namespace为/path1/path2的package,假设不存在这个package。则转至步骤3;假设存在这个package,则在这个package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action,页面提示找不到action。
3.寻找namespace为/path1的package。假设不存在这个package则运行步骤4;假设存在这个package。则在这个 package中寻找名字为test的action,当在该package中寻找不到action 时就会直接跑到默认namaspace的package里面去找名字为test的action ,在默认namaspace的package里面还寻找不到该action。页面提示找不到action。
4.寻找namespace为/的package,假设存在这个package,则在这个package中寻找名字为test的action。当在 package中寻找不到action或者不存在这个package时,都会去默认namaspace的package里面寻找action,假设还是找不到。页面提示找不到action。
总的来说。就是相当于是最大匹配原则。假设一直没有匹配的。则一级一级往上找。直至根文件夹。假设在某处出现了匹配路径。则去那个名称空间下找 action。这个时候假设找不到,就直接跳到默认package中去找了。假设仍然找不到。那就仅仅能报错了。
所以说,这个寻找过程是先匹配大的名称空间,有匹配了才去找对应的action,假设在匹配的名称空间没有须要的action,则直接跳到默认包中找,不会再次跳回去匹配名称空间
另一篇
在struts.xml配置文件当中packet有一个属性字段namespace,这里必须详细了解一下,他的作用是可以让不同的packet里面包含相同action名称
一般情况,如果没有namespace属性字段的默认为"",会被最后才搜索
如果有两个相同的package,他们里面有相同的方法,有namespace的action会优先被搜索,在下面的代码当中,有两个package,一个是default,另一个是test1,大家里面都有Hello的action,如果Hello的action被调用,test1会被执行优先于default,意思是,程序会先搜索test1里面的Hello的action,所以这里的结果是会返回Hello2.jsp而不是Hello.jsp
(注意:struts.xml配置文件中的package是由上往下读取的,被继承的package要先于继承的package,意思就是编写这个配置文件时父级别要优先于子级别的package)
另外要主要的是这个namespace所指的在这个web app的根目录下的一个文件路径,namespace="/test"代表在根目录下的/test里面。所以以下的 代码表示返回的Hello3.jsp在Web App下的/test/里面
最后还有一个要点就,如下面例子,请求http://localhost:8080/Strut2Namespace/test/Hello会出现404的结果,
如果修改一下,在Hello.jsp前加上"/"代表相对路径的意思,则能显示Hello3.jsp的页面,我们来分析一下这个案例
按照规则,先读取名为test2的package然后然后未能找到Hello的action,则开始读取默认的package,发现有Hello的action,则返回成功页面,Hello.jsp,因为这里默认的路径是"",所以为根目录,但在根目录下根本不能找到这个页面,则报404,如果改成/Hello.jsp,则返回的页面路径从test开始的Hello.jsp,这样在test下能找到Hello.jsp的页面,则能返回正确的页面,所这里需要这一点
另一篇
Struts2中关于Action的namespace在很多地方出现,如struts.xml、form标签等等,有些莫名其妙的错误就是由于 namespace设置错误造成的。如无法找到匹配的Action,访问不了result指定的页面等等。
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
补充
今天开始学习@Namespace注解。
还是先看一段代码:
- package com.example.actions;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Namespace;
- import com.opensymphony.xwork2.ActionSupport;
- @Namespace("/custom")
- public class HelloWorld6 extends ActionSupport {
- @Action("/H6/url")
- public String execute() {
- return SUCCESS;
- }
- @Action("url")
- public String doSomething() {
- return SUCCESS;
- }
- }
- 名称空间注释允许操作类名称空间改变而不是使用Convention Plugin约定的Java包的名称。
这是什么原因呢?
关键在于@Action("/H6/url")。此处“/H6/url”是对Action的名称空间进行了完全限定。实验证明@Namespace("/custom")注解对名称空间进行完全限定的不起作用。
- 针对某个Action类进行@Namespace注释后,该注释的效果将应用于该类中所有未完全限定的action URLs
此回合操作验证了一个问题,@Namespace注解已经作用到doSomething()方法上。
仔细观察每一个细节。该方法上有@Action("url")注解。它“url”的前面没有“/”。这是未完全限定的action URL啊。这样正好说明了针对某个Action类进行@Namespace注释后,该注释的效果将应用于该类中所有未完全限定的action URLs。
这样我们在浏览器中输入http://应用服务器ip:端口/应用/cutsom/url访问时,成功。跳转页面为“/custom/url.jsp”。