当前位置: 首页 > news >正文

【struts2】Result和ResultType

  简单的说,Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里。Result仅仅是个字符串,仅仅是用来指示下一个页面的,那么如何才能够到达下一个页面呢?下一个页面如何能正确地展示结果呢?这就该引出一个新概念——ResultType,所谓ResultType,指的是具体执行Result的类,由它来决定采用哪一种视图技术,将执行结果展现给用户。

  很多时候,我们并不去区分Result和ResultType,而是笼统的称为Result。因此,Result除了当作上面讲述的字符串来理解外,还可以把Result当作技术,把Result当作实现MVC模型中的View视图的技术,也就是ResultType来看待。

  在Struts2中,可以使用多种视图技术,如jsp、freemarker、velocity、jfreechart等等,同时,Struts2也支持用户自定义ResultType,来打造自己的视图技术。

  1)预定义ResultType

  在Struts2中,预定义了很多ResultType,其实就是定义了很多展示结果的技术。Struts2把内置的<result-type>都放在struts-default包中。struts-default包就是我们配置的包的父包,这个包定义在struts-2.3.16.3.jar包中的根目录下的文件struts-default.xml中。在这个包中,可以找到相关的<result-type>的定义,<result-types>元素是<package>元素的直接子元素。Struts2预定义如下:

<result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
            <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
        </result-types>

  上面的每一个<result-type>元素都是一种视图技术或跳转方式的封装。其中的name属性是在<result>元素中如何引用这种视图技术或跳转方式,对应着<result>元素的type属性的值。

  可能有朋友会说,我们在配置<result>元素的时候,没有配置过type属性嘛。没错,你确实没有配置过,原因就在于Struts2里面设置了默认的type,如果你没有配置,默认就是“dispatcher”。这个“dispatcher”的技术就相当于在Servlet里面的“RequestDispatcher”的技术,也就是一个页面跳转的技术。而class属性是这种视图技术或跳转方式的具体实现类,这些实现类都已经是Struts2实现好的,我们只需要引用就可以了。

  2)Result的配置

  • 配置name属性

  name属性是用来跟Action的execute方法返回的字符串相对应的,用来指示Action运行后跳转到的下一个页面,因此name属性的值可以是任意字符串。比如有如下的execute方法:

public String execute() throws Exception {  
        return "toWelcome";  
}  

  那么,这里返回的“toWelcome”,在struts.xml里面就有如下的配置来对应:

<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
            <result name="toWelcome">/s2impl/welcome.jsp</result>  
</action>  

  如果不设置的话,默认值为“success”,正好和Action中的“SUCCESS”这个常量相对应,那样的话,execute方法就应该返回SUCCESS,如下:

public String execute() throws Exception {  
        return this.SUCCESS;  
}  

  此时在struts.xml里面就有如下的配置来对应:

<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
            <result>/s2impl/welcome.jsp</result>  
            <!-- 或者如下的配置 
            <result name="success">/s2impl/welcome.jsp</result>
            -->
</action>
  • 配置type属性

  <result>元素的type属性也可以是任意字符串,不过,一定是某一个<result-type>元素的name属性。在没有自定义ResultType的情况下,type属性的值,就是在struts-default.xml中所定义的<result-type>的name属性的值。比如:

<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
            <result name="toWelcome" type="dispatcher">/s2impl/welcome.jsp</result>  
</action>  

  这里的“dispatcher”就是在struts-default.xml中所定义的默认的<result-type>的name属性值。既然是默认的,那就可以不用配置,也就是说,上面的配置跟如下配置是等价的,示例如下:

<action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
            <result name="toWelcome">/s2impl/welcome.jsp</result>  
</action>  

  3)全局Result

  • 配置方法

  全局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的顺序

  在有了全局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为准。

  参考资料:http://www.iteye.com/topic/1124526

转载于:https://www.cnblogs.com/ningvsban/p/3735008.html

相关文章:

  • JVM调优[转]
  • cocos2d-x3.0 编译android出现的问题笔记  cocos2dx3.0 Android.mk No rule to make target
  • WCF学习笔记二
  • php利用新浪接口查询ip获取地理位置
  • 我的推送架构解决方案
  • Android NDK JNI C++ 13 pthread多线程
  • 铁大课表 详细设计说明书
  • 结合FireBreath在Chrome/FireFox的多进程模式下崩溃一例
  • Java多线程之Wait()和Notify()
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • 忘记scott密码解决
  • 采集/自动登录啊都可以用这两个方法实现 asp.net
  • windows phone随笔
  • [CLR via C#]11. 事件
  • Welcome to Swift (苹果官方Swift文档初译与注解九)---58~62页(第二章)
  • [case10]使用RSQL实现端到端的动态查询
  • __proto__ 和 prototype的关系
  • IDEA常用插件整理
  • js算法-归并排序(merge_sort)
  • MaxCompute访问TableStore(OTS) 数据
  • React+TypeScript入门
  • ReactNative开发常用的三方模块
  • 工程优化暨babel升级小记
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端面试之CSS3新特性
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 运行时添加log4j2的appender
  • 中文输入法与React文本输入框的问题与解决方案
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 正则表达式-基础知识Review
  • ​Linux·i2c驱动架构​
  • #define与typedef区别
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (a /b)*c的值
  • (ZT)薛涌:谈贫说富
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十)T检验-第一部分
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)mysql使用Navicat 导出和导入数据库
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat文件调用java类的main方法
  • .NET MVC 验证码
  • .NET 动态调用WebService + WSE + UsernameToken
  • :O)修改linux硬件时间
  • @RunWith注解作用
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [.NET]桃源网络硬盘 v7.4
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
  • [JavaWeb学习] idea新建web项目
  • [JMS 3] ActiveMQ实现简单的helloworld