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。