Struts2系列教程之结果类型实例源码介绍



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

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

 

<action name=”my” >

<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串连起来。用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。
dispatcher 渲染JSP。这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。
freemarker 渲染Freemarker模板。
httpheader 返回HTTP头和用户定义的值。
redirect 重定向到任意的URL。
redirect-action 重定向到配置好的action。可以用来提供post完成以后的重定向功能。
stream 将数据流返回给浏览器。可以用来把数据注入PDF,Microsoft 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

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

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

 

<action name=”my” >

<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使用了。