5.3 全局Result
5.3.1 全局Result概述
以前的<result>元素都是作为<action>的子元素出现的,这被称为局部Result,只可以由本<action>元素访问。
要是有一些Result需要由多个Action共用,比如,系统的每个页面都会判断用户是否登陆,如果没有登陆,那么都要跳转到登录页面。这种情况该怎么办呢?
这个时候,就可以配置全局Result,让这多个Action共享这些全局的Result,而不是每个Action都去配置一个跳转回到登录页面的result。
5.3.2 配置和使用
全局Result本身没有任何的特异之处,同样是配置name属性和type属性,包括如何指定jsp的位置都和普通的Result一样,只不过其<result>元素并不是<action>元素的子元素,而是作为<global-results>元素的子元素,而<global-results>元素又是<package>元素的子元素,示例如下:
<package name="helloworld" extends="struts-default">
<global-results>
<result name="toLogin">/login.jsp</result>
</global-results>
<action ……>
……
</action>
</package>
上面的result省略了type的配置,同样是使用“dispatcher”的ResultType,除了位置不同之外,全局Result和普通的Result完全一样。
5.3.3 搜寻Result的顺序
在有了全局Result之后,需要讨论一下在Action运行之后,根据execute方法的返回值寻找Result顺序了。
(1)首先,先找自己的<action>元素内的<result>元素是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(2)其次,再找自己的<action>所在的包的全局Result,看看是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(3)再次,递归的寻找自己的包的父包、祖父包中的全局Result是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(4)最后,如果上述三种情况都没有匹配的Result的话,则抛出Exception。
注意:如果出现同名的Result,上述的顺序也是Result之间的优先顺序。也就是说,如果Action的execute方法返回的字符串,在局部Result和全局Result中都有能匹配的配置,那么以局部Result为准。
5.3.4 应用示例
回忆一下前面讲述的Action的分模块配置,把一个旅游项目,分成了饭店管理模块和入境管理模块,并为他们分别定义了配置文件:struts-hotel.xml和struts-inbound.xml。
这两个模块中的任何操作,都必须登陆后才能操作,因此,任何一个操作都有直接跳转回登陆页面的可能。
前面已经把配置文件分成了三个,其中,总配置文件struts.xml引用了分模块的配置文件struts-hotel.xml和struts-inbound.xml。因为hotel模块和inbound模块都需要使用跳转到登录页面这个Result,如果每个模块里面都去配置这个Result,会很累赘,因此,可以设置一个父包,把这个全局Result放在父包里。
父包设置在struts.xml里面,示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.locale" value="zh_CN"></constant>
<constant name="struts.i18n.encoding" value="gb2312"></constant>
<package name="struts-abstract" extends="struts-default">
<global-results>
<result name="login" type=”redirect”>/login.jsp</result>
</global-results>
</package>
<include file="struts-hotel.xml"></include>
<include file="struts-inbound.xml"></include>
</struts>
接下来看看struts-hotel.xml,有一点变化,这个包由继承struts-default变为继承struts-abstract,以便能访问struts-abstract包下名为login的全局Result。代码示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="hotel" namespace="/hotel" extends="struts-abstract">
<action name="bookingAction" class="cn.javass.hotel.action.HotelBookingAction">
<result name="success">/hotel/booking.jsp</result>
</action>
<action name="queryAction" class="cn.javass.hotel.action.QueryAction">
<result name="success">/hotel/query.jsp</result>
</action>
</package>
</struts>
接下来看看struts-inbound.xml,有一点变化,这个包由继承struts-default变为继承struts-abstract,以便能访问struts-abstract包下名为login的全局Result。代码示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="inbound" namespace="/inbound" extends="struts-abstract">
<action name="bookingAction" class="cn.javass.inbound.action.BookingAction">
<result name="success">/inbound/booking.jsp</result>
</action>
<action name="queryAction" class="cn.javass.inbound.action.QueryAction">
<result name="success">/inbound/query.jsp</result>
</action>
</package>
</struts>
这么配置过后,就可以在HotelBookingAction和BookingAction里面的execute方法里面,返回名称为“login”的Result了。虽然看起来它们自己并没有配置名称为“login”的Result,但是它们继承的父包里面有,也就是有全局的Result。
本教程是ajava.org会员hellospring的原创作品,转载请注明出处。
作者博客:http://sishuok.com/forum/blogPost/list/3983.html
作者ajava空间:http://ajava.org/space-uid-2358.html