包和命名空间 Struts2使用包来组织Action,因此,需要将Action放在包下定义。 定义Action需要使用<package../>下的<action>子元素来完成,而每个<package>元素配置一个包。
Struts框架的核心组件就是Action,拦截器等,Struts框架使用包来管理Action和拦截器等。每个包就是多个Action,多个拦截器,多个拦截器引用的集合; 注:配置Action是必须制定name属性,这个属性是引用该包的唯一标示,除此之外,还可以指定一个可选的extends属性,extends属性的值必须是另一个包的name属性,表示让该报继承另一个包。子包可以继承父包中的action,拦截器,拦截器栈等配置; Struts2还提供了一个抽象包,,意味着该不能包含action定义 可以在<package../>元素中添加abstarct="true"指定该包为抽象包。 定义包配置是可以选用如下属性: name:必须属性; extends:可选属性 namespace:可选属性 abstract:可选属性
注:因为Struts2的配置文件是从上到下处理的,所以父包应该在子包前面定义。
struts-default是Struts2框架的默认包;该包下包含了大量结果类型定义,拦截器定义,拦截器引用定义,这些定义是普通Action的基础,所以开发者定义的package通常应该基础struts-default包。
命名空间namespace:主要是为了处理同一个web应用中包含同名的Action的情景。
列如: 在<package>中如下: <package name="Demo" namespace="/book' extends="struts-default"> <action name="*"> <result>/WEB-INF/content/{1}.jsp</result> </action> </package>
则在浏览器下需要这样访问: http://localhost:8080/web应用名/book/jsp名 (jsp不加后缀.jsp)
<package name="Demo" namespace="/"...>为根命名空间。
默认命名空间和根命名空间的区别: 假如在URL为/book/loginForm,则会先在/book的命名空间下寻找名为loginForm的jsp,如果没有找到,就会到默认命名空间中找。 而根命名空间只处理根命名空间下的Action。
如果请求为/loginForm,则会先在根命名空间中找,找不到再在默认命名空间中找。
命名空间只有一个级别,即先在你的URL的命名空间中找,找不到再在默认命名空间中找,不能因为你的命名空间有多层而返回上一级找。