《研磨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>元素的子元素,示例如下:

 

java代码:
  1. <package name="helloworld"  extends="struts-default">  
  2.         <global-results>  
  3.         <result name="toLogin">/login.jsp</result>  
  4.     </global-results>  
  5.   
  6.     <action ……>  
  7.        ……  
  8.     </action>  
  9. </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里面,示例如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <constant name="struts.devMode" value="true" />  
  7.     <constant name="struts.locale" value="zh_CN"></constant>  
  8. <constant name="struts.i18n.encoding" value="gb2312"></constant>  
  9.   
  10.     <package name="struts-abstract" extends="struts-default">  
  11.         <global-results>  
  12.             <result name="login" type=”redirect”>/login.jsp</result>  
  13.         </global-results>  
  14.     </package>  
  15.       
  16.     <include file="struts-hotel.xml"></include>  
  17.     <include file="struts-inbound.xml"></include>  
  18. </struts>  

接下来看看struts-hotel.xml,有一点变化,这个包由继承struts-default变为继承struts-abstract,以便能访问struts-abstract包下名为login的全局Result。代码示例如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="hotel" namespace="/hotel" extends="struts-abstract">  
  7.         <action name="bookingAction" class="cn.javass.hotel.action.HotelBookingAction">  
  8.             <result name="success">/hotel/booking.jsp</result>  
  9.         </action>  
  10.         <action name="queryAction" class="cn.javass.hotel.action.QueryAction">  
  11.             <result name="success">/hotel/query.jsp</result>  
  12.         </action>  
  13.     </package>  
  14. </struts>  

接下来看看struts-inbound.xml,有一点变化,这个包由继承struts-default变为继承struts-abstract,以便能访问struts-abstract包下名为login的全局Result。代码示例如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="inbound" namespace="/inbound" extends="struts-abstract">  
  7.         <action name="bookingAction" class="cn.javass.inbound.action.BookingAction">  
  8.             <result name="success">/inbound/booking.jsp</result>  
  9.         </action>  
  10.         <action name="queryAction" class="cn.javass.inbound.action.QueryAction">  
  11.             <result name="success">/inbound/query.jsp</result>  
  12.         </action>  
  13.     </package>  
  14. </struts>  

这么配置过后,就可以在HotelBookingAction和BookingAction里面的execute方法里面,返回名称为“login”的Result了。虽然看起来它们自己并没有配置名称为“login”的Result,但是它们继承的父包里面有,也就是有全局的Result。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4052.html

欢迎访问http://sishuok.com获取更多内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值