Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4.4 命名空间配置

考虑到同一个Web应用中可能出现同名的Action,Struts 2允许以命名空间的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空间里可以有同名的Action。

Struts 2不支持为单独的Action设置命名空间,而是通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。

看下面的struts.xml配置文件代码。

程序清单:codes\03\3.4\namespace\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 配置Struts 2配置文件的根元素 -->
<struts>
    <!-- 配置常量,指定国际化资源文件的baseName为messageResource -->
    <constant name="struts.custom.i18n.resources" value="messageResource"/>
    <!-- Struts 2的Action必须放在包空间下定义 -->
    <package name="lee" extends="struts-default">
          <!-- 定义login的Action,该Action的实现类为org.crazyit.struts2.action.LoginAction类 -->
          <action name="login" class="org.crazyit.struts2.action.LoginAction">
                <!-- 定义处理结果和视图资源之间的映射关系 -->
                <!-- 定义input逻辑视图名,对应login.jsp页面 -->
                <result name="input">/WEB-INF/content/login.jsp</result>
                <result name="error">/WEB-INF/content/error.jsp</result>
                <result name="success">/WEB-INF/content/welcome.jsp</result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
    <!-- 指定一个新的package,该package的命名空间为/book -->
    <packagelt@span b=1> name="book"lt@span b=1> extends="struts-default" namespace="/book">
          <!--定义获取图书的Action,对应实现类为org.crazyit.struts2.action.GetBooksAction -->
          <action name="getBooks" class="org.crazyit.struts2.action.GetBooksAction">
                <!-- 如果处理结果返回login,则进入login.jsp页面 -->
                <result name="login">/WEB-INF/content/login.jsp</result>
                <!-- 如果处理结果返回success,则进入showBook.jsp页面 -->
                <result name="success">/WEB-INF/content/book/showBook.jsp</result>
          </action>
    </package>
</struts>

在上面的struts.xml配置文件中,配置了两个包:lee和book,在配置book包时,指定了该包的命名空间为/book。

对于名为lee的包而言,没有指定namespace属性。如果某个包没有指定namespace属性,则该包使用默认的命名空间,默认的命名空间总是""。

当某个包指定了命名空间后,该包下所有的 Action 处理的 URL 应该是命名空间+Action名。以上面名为book的包为例,该包下包含了名为getBooks的Action,则该Action处理的URL为:

/*
下面的URL是getBooks处理的URL。其中8888是笔者的Tomcat服务端口
namespace是应用名,/book是该Action所在包的命名空间,而/getBooks是Action名
*/
http://localhost:8888/namespace/book/getBooks.action

从上面内容可以看出,Struts 2命名空间的作用类似于Struts 1里模块的作用。

注意

Struts 2命名空间的作用等同于Struts 1里模块的作用,它允许以模块化的方式来组织Action。

除此之外,Struts 2还可以显式指定根命名空间,通过设置某个包的namespace="/"来指定根命名空间。

如果请求为/barspace/bar.action,系统首先查找/barspace命名空间里名为bar的Action,如果在该命名空间里找到对应的 Action,则使用该 Action 处理用户请求;否则,系统将到默认的命名空间中查找名为bar的Action,如果找到对应的Action,则使用该Action处理用户请求;如果两个命名空间里都找不到名为bar的Action,则系统出现错误。

注意

默认命名空间里的Action可以处理任何模块下的Action请求。意思是说:如果存在URL为/barspace/bar.action的请求,并且/barspace命名空间下没有名为bar的Action,则默认的命名空间下名为bar的Action也会处理用户请求。

如果请求为/login.action,系统会在根命名空间(“/”)中查找名为login的Action,如果在根命名空间中找到了名为login的Action,则由该Action处理用户请求;否则,系统将转入默认的命名空间中查找名为login的Action,如果默认的命名空间里有名为login的Action,则由该Action处理用户请求;如果两个命名空间里都找不到名为login的Action,则系统出现错误。

注意

命名空间只有一个级别。如果请求的URL是/bookservice/search/get.action,系统将先在/bookservice/search命名空间下查找名为get的Action,如果在该命名空间内找到名为get的Action,则由该Action处理用户请求;如果在该命名空间内没有找到名为get 的Action,系统将直接进入默认的命名空间中查找名为get的Action,而不会在/bookservice命名空间下查找名为get的Action。