namespace 将action 分成逻辑上的不同模块,每一个模块有自己独立的前缀。使用namespace可以有效地避免action重名的冲突,例如每一个package 都可以有自己独立的menu 和 help action,但是事项方式各有不同。Struts2标签带有namespace选项,可以根据namespace 的不同向服务器提交不同的package的action 请求。
"/" 表示根 namespace ,所有直接在应用程序上下文环境上的请求(Context)都在这个package 中查找。
"" 表示默认 namespace ,当所有的namespace 中都找不到的时候就在这个namespace 中寻找。
struts2 的基本流程:
struts2的基本流程,当客户发生请求以后,触发struts2 的 FilterDispatcher 过滤器(默认配置是所有请求都会触发)。如果请求是以 .action 结尾,FilterDispatcher会去 struts.xml 里面查找action 元素的name属性配置,找到匹配的,然后运行其class属性指定的类。
(我的尝试:如果不是以.action 结尾,就会出错了: 如form 无namespace 属性,或者 namespace="",则生成的JSP 文件里action 没有后缀)
在strtus2 基本流程里是这样说明的,现在补充一点,匹配的不光是name 属性,还要package 的namespace属性。
定义并生成Action:
在一个Struts2 应用程序中,一个指向Action 的链接通常有 Struts Tag 产生,这个Tag 需要指定Action 名字,Struts框架会自动添加,诸如后缀等的扩展,例如:
<s:form action="Hello">
<s:textfield label="Please enter your name" name="name"/>
<s:submit/>
</s:form>
将产生一个如下的链接的请求:http://hostname:post/appname/Hello.action
在定义Action 的名字的时候不要使用.和/ ,最好使用英文字母和下划线。
Struts框架接受请求及匹配action:
每当struts2框架接受到一个请求的时候,它会去掉Host,Application和后缀等信息,得到Action 的名字,例如如下的请求将得到Welcome 这个action 。http://www.planetstruts.org/struts2-mailreader/Welcome.action
Struts2 在匹配一个action 的时候,先到它指定的命名空间中去找,如果没有再到这个默认的命名空间中去找。
Struts2 还支持跟命名空间("/"),当一个request 直接请求context path 下面的资源时,struts2 会首先到跟命名空间下去寻找匹配的action,例如请求是http://server/myapp/bar.action,那么我们首先会去”/”命名空间下去寻找这个action。
如何从URL映射到一个action中:
关于如何从URL映射到一个action 中我做了一些测试,发现可以遵循如下的一个规则:
1. 获得请求路径的URL,例如url 是:http://server/myapp/path1/path2/path3/test.acton
2. 首先寻找namespace 为/path1/path2/path3 的package。如果存在这个package ,则在这个package中寻找名字为test的action ,若找到则执行,否则报错; 如果不存在这个package 则转步骤3。
3.寻找namespace为/path1/path2/path2 的package。如果存在这个package ,则在这个package 中寻找名字为test的action,若找到则执行,否则报错,如果不存在这个package 则转步骤4;
4.寻找namespace 为/path1 的package,如果存在这个package ,则在这个package 中寻找名字为test 的action,若找到则执行,否则报错;
如果仍然不存在这个package ,就去namespace为空字符串的package 下面找名字为test 的action ,如果还是找不到,页面提示找不到action。
这里有几点特殊的情况要说明一下,如下所示:
1. 如果匹配到了多个package ,比如上述流程中有多个namespace为 /path1/path2/path3的package, 此时按照package 出现的顺序从前向后(我修改过)查询action,直至找完为止。(执行最后一个)
2.如果在一个package中有多个name 属性相同的action ,那么执行最后一个action 。比如上述流程中,有一个namespace为/path1/path2/path3的package ,它里面含有多个名字为test的action,那么选择最后一个执行。