转载

《研磨struts2》第五章 Result 之 5.3 全局Result

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

正文到此结束
Loading...