3.6.3 Struts2支持的处理结果类型
Struts 2支持使用多种视图技术,例如JSP、Velocity和FreeMarker等。当一个Action处理用户请求结束后,仅仅返回一个字符串,这个字符串只是逻辑视图名,该逻辑视图并未与任何的视图技术及任何的视图资源关联——直到在struts.xml文件中为该逻辑视图指定实际的视图资源。
结果类型决定了Action处理结束后,下一步将使用哪种视图资源。
Struts 2的结果类型要求实现com.opensymphony.xwork.Result,这个结果是所有Action执行结果的通用接口。如果我们需要自己的结果类型,则应该提供一个实现该接口的类,并且在struts.xml文件中配置该结果类型。
Struts 2默认提供了一系列的结果类型,下面是struts-default.xml配置文件的配置片段。
<!-- 配置系统支持的结果类型 --> <result-types> <!-- Action链式处理的结果类型 --> <result-type name="chain" class="com.opensymphony.xwork2. ActionChainResult"/> <!-- 用于与JSP整合的结果类型 --> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult"default="true"/> <!-- 用于与FreeMarker整合的结果类型 --> <result-type name="freemarker" class="org.apache.struts2.views. freemarker.FreemarkerResult"/> <!-- 用于控制特殊的HTTP行为的结果类型 --> <result-type name="httpheader" class="org.apache.struts2.dispatcher. HttpHeaderResult"/> <!-- 用于直接跳转到其他URL的结果类型 --> <result-type name="redirect" class="org.apache.struts2.dispatcher. ServletRedirectResult"/> <!-- 用于直接跳转到其他Action的结果类型 --> <result-type name="redirectAction" class="org.apache.struts2. dispatcher.ServletActionRedirectResult"/> <!-- 用于向浏览器返回一个InputStream的结果类型 --> <result-type name="stream" class="org.apache.struts2.dispatcher. StreamResult"/> <!-- 用于整合Velocity的结果类型 --> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <!-- 用于整合XML/XSLT的结果类型 --> <result-type name="xslt" class="org.apache.struts2.views.xslt. XSLTResult"/> <!-- 用于显示某个页面原始代码的结果类型 --> <result-type name="plainText" class="org.apache.struts2.dispatcher. PlainTextResult" /> </result-types>
上面文件中列出的就是Struts 2内置支持的结果类型,每个<result-type .../>元素定义一个结果类型,<result .../>元素中的name属性指定了该结果类型的名字,class属性指定了该结果类型的实现类。
除此之外,我们在struts2-jasperreports-plugin-2.3.1.2.jar的struts-plugin.xml文件中看到如下配置片段。
<result-types> <!-- 用于整合JasperReport的结果类型 --> <result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/> </result-types>
在struts2-jfreechart-plugin-2.3.1.2.jar的struts-plugin.xml文件中看到如下配置片段。
<result-types> <!-- 用于整合JFreeChart的结果类型 --> <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult" default="false"> <param name="height">150</param> <param name="width">200</param> </result-type> </result-types>
通过这些插件提供的结果类型不难看出,Struts 2具备了极好的可扩展性:开发者只要提供一个插件JAR包,在其中实现自己的结果类型,并在struts-plugin.xml文件中配置该结果类型,即可新增一个结果类型。
在struts-default.xml文件中配置dispatcher结果类型时,指定了default="true"属性,该属性表明该结果类型是默认的结果类型——这也是为什么当定义<result .../>元素时,如果省略了type属性,默认type属性为dispatcher的原因。
归纳起来,Struts 2内建支持的结果类型如下。
chain结果类型:Action链式处理的结果类型。
dispatcher结果类型:用于与JSP整合的结果类型。
freemarker结果类型:用于与FreeMarker整合的结果类型。
httpheader结果类型:用于控制特殊的HTTP行为的结果类型。
redirect结果类型:用于直接跳转到其他URL的结果类型。
redirectAction结果类型:用于直接跳转到其他Action的结果类型。
stream结果类型:用于向浏览器返回一个InputStream的结果类型(一般用于文件下载)。
velocity结果类型:用于与Velocity 整合的结果类型。
xslt结果类型:用于与XML/XSLT 整合的结果类型。
plainText结果类型:用于显示某个页面的原始代码的结果类型。
上面一共列出了10种类型,其中dispatcher结果类型是默认的类型,主要用于与JSP页面整合。而其他大部分结果类型将会在后面有更详细的介绍,例如stream结果类型,将在Struts 2的文件下载中有更详细的介绍。下面将简要介绍chain、plainText、redirect和redirectAction 4种结果类型。