Struts2入门--namespace属性详解

  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,那么选择最后一个执行。

你可能感兴趣的:(应用服务器,jsp,框架,struts)