Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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种结果类型。