Struts2使用18 -- 结果类型

本文介绍了Struts2框架中的结果类型配置及使用方法,包括默认的dispatcher类型、自定义结果类型实现,以及如何配置全局结果等。还详细列举了各种结果类型的特点,如chain、freemarker和velocity等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

    在前面我们已经演示过如何配置Action来向用户返回一个JSP。但这只是Action的结果之一。Struts 2里面提供了多种结果类型,有些是可见的,有些只是与运行环境之间的交互。

type”属性被用来配置Action的结果类型,如果没有配置该属性的话,那么默认类型就是“dispatcher”,它将会渲染一个JSP结果并返回给用户。下面就是这样的Action配置:

<action name="my" class="com.fdar.infoq.MyAction" >

       <result type="dispatcher">view.jsp</result>

</action>

结果类型的配置项在<package />标签内部,和拦截器的配置看上去很相似。“name”属性提供了结果类型的统一标识,“class”属性描述了实现类的全限定名。它多出了第三个属性:“default”——通过这个属性可以修改默认的结果类型。如果一个Web应用是基于Velocity而不是JSP的话,那么把默认结果类型修改一下,就可以节省很多配置的时间。

<result-types>

       <result-type name="dispatcher" default="true"

                            class="org.apache.struts2.dispatcher.ServletDispatcherResult"/>

       <result-type name="redirect"

                            class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

      

</result-types>

结果类型:

Action生成并返回给用户的结果可能会有多个值,而且也可能是不同的类型。“success”的结果可能会渲染一个JSP页面,而“error”的结果可能需要向浏览器发送一个HTTP头。

结果类型是通过result节点的“type”属性来定义的。和“name”属性一样,这个属性有一个默认值——“dispatcher”——用来渲染JSP。大多数情况下,你只需要使用默认的结果类型就可以了,但是你可以提供自定义的实现。

名称

描述

chain

将一个action的执行与另外一个配置好的action串连起来。用第一个actiongetter方法和第二个actionsetter方法来完成action之间属性的复制。

dispatcher

渲染JSP。这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。

freemarker

渲染Freemarker模板。

httpheader

返回HTTP头和用户定义的值。

redirect

重定向到任意的URL

redirect-action

重定向到配置好的action。可以用来提供post完成以后的重定向功能。

stream

将数据流返回给浏览器。可以用来把数据注入PDFMicrosoft Work,图像或其他数据中。

velocity

渲染 Velocity模板。

xslt

使用XSLT来转换已执行完毕的action的属性格式。

 

实现结果类型:

和拦截器一样,你也可以创建自己的结果类型并在Web应用中加以配置。Struts 2中已经有了很多常用的结果类型,所以在创建自己的结果类型之前,你应该检查一下你想要的类型是否已经存在。

创建一个新的结果类型需要实现Result接口。

public interface Result extends Serializable {

       public void execute(ActionInvocation invocation)throws Exception;

}

ActionInvocation 对象可以用来访问运行时环境,新的结果类型还可以通过它来访问刚刚执行的Action以及Action执行的上下文。在上下文中包括有HttpServletRequest对象,可以用来访问当前请求的输入流。

结果和视图技术:

在上面的所有示例中,我们假设了所使用的视图技术都是对JSP进行渲染,虽然这是最常用的方式,但并不是渲染结果的唯一方式。

结果类型是与所使用的视图技术联系在一起的。我们在前面的小节中看到过,如果没有“type”属性或者该属性的值是“dispatcher”的话,那么最后就会渲染JSP页面。在Struts 2应用中,有其他三种技术可以用来替代JSP

l         Velocity Templates

l         Freemarker Templates

l         XSLT Transformations

另外,你还可以为任何一种已有的视图技术实现一种新的结果类型,这样就可以得到另外的结果了。

抛开各自的语法差异不谈,FreemarkerVelocity还是和JSP很相似的。Action的所有属性都可以被模板访问(通过getter方法),就像使用JSP标签库和在标签库中使用OGNL一样。在action的配置文件中,只需要把JSP模板的名字换成Velocity或者Freemarker模板的名字就可以了。下面的配置文件中,用Freemarker代替了JSP的返回结果:

<action name="my" class="com.fdar.infoq.MyAction" >

       <result type="freemarker">view.ftl</result>

</action>

XSLT结果和其他的有所不同。它不是用stylesheet名代替模板名,而是使用了另外的参数。“stylesheetLocation”参数提供了用于渲染XML文件的stylesheet。如果没有为该参数赋值的话,那么返回给用户的就是未经转换过的XML文件。

exposedValue”属性用来提供将要作为XML来展现的Action属性或是OGNL表达式。如果该参数没有赋值的话,那么Action本身就会被作为XML显示出来。

<result type="xslt">

       <param name="stylesheetLocation">render.xslt</param>

       <param name="exposedValue">model.address</param>

</result>

在使用XSLT作为结果的时候,还可以使用“struts.properties”来进行属性配置。该属性为“struts.xslt.nocache”,它决定了stylesheet是否会被缓存。在开发的过程中,你可能需要移除所有的缓存,以提高开发速度。但是当应用被部署到产品环境以后,被缓存的stylesheet就会提高渲染性能。

全局结果

结果的作用域可以是针对特定Action的,也可以是全局的。我们可以对通用的Action结果——例如“error”和“logon”——进行重构,这样每一个Action就可以只处理和自身特有逻辑相关的结果了。

在全局结果中使用的<result />标签和普通的Action结果标签的形式基本相同——有一个唯一的“name”属性,还有一个“type”属性,描述了不同的渲染选项。它们的不同点在于,全局的结果标签是放在<package />根标签下的<global-results />标签里面的。

<package … >

       <global-results>

              <result name=”logon”>/logon.jsp</result>

              <result name=”error”>/error.jsp</result>

             

       <global-results>

      

</package>

全局结果在“struts.xml”定义了以后,它就可以被应用程序中的所有Action使用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值