`

Struts2的Result Type

阅读更多

chain

    用来处理Action链

    com.opensymphony.xwork2.ActionChainResult

dispatcher

    用来转向页面,通常处理JSP

    org.apache.struts2.dispatcher.ServletDispatcherResult

freemaker

    处理FreeMarker模板

    org.apache.struts2.views.freemarker.FreemarkerResult

httpheader

    控制特殊HTTP行为的结果类型

    org.apache.struts2.dispatcher.HttpHeaderResult

redirect

    重定向到一个URL

    org.apache.struts2.dispatcher.ServletRedirectResult

redirectAction

    重定向到一个Action

    org.apache.struts2.dispatcher.ServletActionRedirectResult

stream

    向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据

    org.apache.struts2.dispatcher.StreamResult

velocity

    处理Velocity模板

    org.apache.struts2.dispatcher.VelocityResult

xslt

    处理XML/XLST模板

    org.apache.struts2.views.xslt.XSLTResult

plainText

    显示原始文件内容,例如文件源代码

    org.apache.struts2.dispatcher.PlainTextResult

redirect-action

    重定向到一个Action

    org.apache.struts2.dispatcher.ServletActionRedirectResult

plaintext

    显示原始文件内容,例如文件源代码

    org.apache.struts2.dispatcher.PlainTextResult

 

 

 

 

Struts2将Result列为一个独立的层次,可以说是整个Struts2的Action层架构设计中的另外一个精华所在。Result之所以成为一个层次,其实

 

是为了解决MVC框架中,如何从Control层转向View层这样一个问题而存在的

 

 

 

在struts2-core.jar/struts-default.xml中,我们可以找到关于result-type的一些配置信息,从中可以看出struts2组件默认为我们提供了这

些result-type

 

       <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" />

            <!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->

            <result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>

            <result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" />

        </result-types>
 

 

封装跳转逻辑

 

  Result的首要职责,是封装Action层到View层的跳转逻辑。之前我们已经反复提到,Struts2的Action是一个与Web容器无关的POJO。所以,在Action执行完毕之后,框架需要把代码的执行权重新交还给Web容器,并转向到相应的页面或者其他类型的View层。而这个跳转逻辑,就由Result来完成。这样,好处也是显而易见的,对Action屏蔽任何Web容器的相关信息,使得每个层次更加清晰。

 

  View层的显示类型非常多,有最常见的JSP、当下非常流行的Freemarker/Velocity模板、Redirect到一个新的地址、文本流、图片流、甚至是JSON对象等等。所以Result层的独立存在,就能够对这些显示类型进行区分,并封装合理的跳转逻辑。

 

  以JSP转向为例,在Struts2自带的ServletDispatcherResult中就存在着核心的JSP跳转逻辑:

 

常用的Result 

 

  接下来,大致介绍一下Struts2内部已经实现的Result,并看看他们是如何工作的。

 

  dispatcher

 

<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

 dispatcher主要用于返回JSP,HTML等以页面为基础View视图,这个也是Struts2默认的Result类型。在使用dispatcher时,唯一需要指定的,是JSP或者HTML页面的位置,这个位置将被用于定位返回的页面:

 

 

<result name="success">/index.jsp</result>

  而Struts2本身也没有对dispatcher做出什么特殊的处理,只是简单的使用Servlet API进行forward。

 

  freemarker / velocity

 

<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>  
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> 
 

  随着模板技术的越来越流行,使用Freemarker或者Velocity模板进行View层展示的开发者越来越多。Struts2同样为模板作为Result做出了支持。由于模板的显示需要模板(Template)与数据(Model)的紧密配合,所以在Struts2中,这两个Result的主要工作是为模板准备数据。

 

  以Freemarker为例,我们来看看它是如何为模板准备数据的:

 

 

public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException {   
    this.location = location;   
    this.invocation = invocation;   
    this.configuration = getConfiguration();   
    this.wrapper = getObjectWrapper();   
  
    // 获取模板的位置   
    if (!location.startsWith("/")) {   
        ActionContext ctx = invocation.getInvocationContext();   
        HttpServletRequest req = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);   
        String base = ResourceUtil.getResourceBase(req);   
        location = base + "/" + location;   
    }   
  
    // 得到模板   
    Template template = configuration.getTemplate(location, deduceLocale());   
    // 为模板准备数据   
    TemplateModel model = createModel();   
  
    // 根据模板和数据进行输出   
    // Give subclasses a chance to hook into preprocessing   
    if (preTemplateProcess(template, model)) {   
        try {   
            // Process the template   
            template.process(model, getWriter());   
        } finally {   
            // Give subclasses a chance to hook into postprocessing   
            postTemplateProcess(template, model);   
        }   
    }   
} 

public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException {
    this.location = location;
    this.invocation = invocation;
    this.configuration = getConfiguration();
    this.wrapper = getObjectWrapper();

    // 获取模板的位置
    if (!location.startsWith("/")) {
        ActionContext ctx = invocation.getInvocationContext();
        HttpServletRequest req = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);
        String base = ResourceUtil.getResourceBase(req);
        location = base + "/" + location;
    }

    // 得到模板
    Template template = configuration.getTemplate(location, deduceLocale());
    // 为模板准备数据
    TemplateModel model = createModel();

    // 根据模板和数据进行输出
    // Give subclasses a chance to hook into preprocessing
    if (preTemplateProcess(template, model)) {
        try {
            // Process the template
            template.process(model, getWriter());
        } finally {
            // Give subclasses a chance to hook into postprocessing
            postTemplateProcess(template, model);
        }
    }
}
 

 

  从源码中,我们可以看到,createModel()方法真正为模板准备需要显示的数据。而之前,我们已经看到过这个方法的源码,这个方法所准备的数据不仅包含ValueStack中的数据,还包含了被封装过的HttpServletRequest,HttpSession等对象的数据。从而使得模板能够以它特定的语法输出这些数据。 [SPAN]

 

  Velocity的Result也是类似,有兴趣的读者可以顺着思路继续深究源码。

 

  redirect

 

<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>  
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>  
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> 
 

  如果你在Action执行完毕后,希望执行另一个Action,有2种方式可供选择。一种是forward,另外一种是redirect。有关forward和redirect的区别,这里我就不再展开,这应该属于Java程序员的基本知识。在Struts2中,分别对应这两种方式的Result,就是chain和redirect。

 

  先来谈谈redirect,既然是重定向,那么源地址与目标地址之间是2个不同的HttpServletRequest。所以目标地址将无法通过ValueStack等Struts2的特性来获取源Action中的数据。如果你需要对目标地址传递参数,那么需要在目标地址url或者配置文件中指出:

 

Xml代码 

 

<!--   
   The redirect-action url generated will be :   
   /genReport/generateReport.jsp?reportType=pie&width=100&height=100  
   -->  
   <action name="gatherReportInfo" class="...">  
      <result name="showReportResult" type="redirect">  
         <param name="location">generateReport.jsp</param>  
         <param name="namespace">/genReport</param>  
         <param name="reportType">pie</param>  
         <param name="width">${width}</param>  
         <param name="height">${height}</param>  
      </result>  
   </action> 
 

 

  同时,Redirect的Result支持在配置文件中,读取并解析源Action中ValueStack的值,并成为参数传递到Redirect的地址中。上面给出的例子中,width和height就是ValueStack中的值。

 

分享到:
评论

相关推荐

    struts2 result type 介绍

    在Struts2中,Result Type是控制流程的重要部分,用于定义动作执行后如何转发或重定向到特定的视图。这篇博客文章将深入探讨Struts2的Result Type,以及它在实际应用中的工作原理。 首先,我们需要了解Struts2的...

    struts2中result类型之redirect

    在Struts2框架中,`Result`类型是动作(Action)执行后的一种处理方式,它定义了动作执行完后页面跳转或者数据处理的行为。`Redirect`是`Result`类型中的一种,它涉及到Web应用程序中的URL重定向概念,对用户浏览器...

    struts2 result配置详解

    Struts2 Result 配置详解 Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果....

    struts2 result转向到action

    ### Struts2 Result 转向到 Action 的深入解析 #### 一、基本概念与应用场景 **Struts2** 是一款流行的 Java Web 开发框架,它支持多种开发模式(如 MVC),并提供了一系列用于简化 Web 应用程序开发的功能。在 ...

    struts2 Demo

    这是一个struts2框架的处理流程的demo,里面有...struts2 result type类型的基本解释图片;相信对于初学者,通过这个demo可以基本掌握struts2的使用,注意,该demo是纯粹的struts2,没有其他框架内容,请注意甄别......

    Struts2 result和type

    ### Struts2中的Result与Type详解 #### 一、引言 在Struts2框架中,`Result`和`Type`是两个非常重要的概念。它们主要用于控制Action执行完毕后页面的跳转方式以及如何处理Action返回的结果。通过合理配置`Result`与...

    struts2的action的几种result type说明

    在`struts-default.xml`配置文件中,我们可以看到Struts2支持多种内置的Result Type。 1. **dispatcher** (默认): 这是最常见的Result Type,它使用Servlet Dispatcher将请求转发到指定的JSP页面或Servlet。`class=...

    struts2中常用Result类型(type)的用法和出现的问题

    Struts2 中常用 Result 类型(type)的用法和出现的问题 Struts2 中的 Result 类型(type)是指在 Struts2 框架中用于确定 action 执行结果的方式。常用的 Result 类型有 dispatcher、redirect 和 chain 三种。这三...

    Struts2 Result类型

    Struts2 Result类型是Struts2框架中一个关键的概念,它是控制Action执行后响应到何处的重要组件。在处理用户请求并执行相应的业务逻辑后,Action需要将结果返回给客户端,而Result类型就是用来定义这个返回过程的...

    struts2中的result的type类型

    struts2 跳转类型 result type chain dispatcher redirect redirect action

    Struts2学习资源Result part1.rar

    Result是Struts2框架中的一个核心组件,它负责处理动作执行后的结果,如视图渲染、跳转等操作。在Struts2的学习过程中,理解并熟练运用Result类型是至关重要的。 在Struts2中,Result主要负责将处理后的数据传递给...

    struts2的result标签使用

    在Struts2中,`Result`标签是核心组件之一,用于定义动作执行后如何跳转到相应的视图。让我们深入探讨一下`Result`标签的使用以及在Struts2框架中的作用。 ### 1. Struts2框架概述 Struts2框架基于MVC设计模式,...

    struts2中result类型之redirectAction

    在Struts2中,Result是Action执行后控制流程的重要组件,它定义了Action执行完毕后如何转发或重定向到一个新的页面。"redirectAction"是Struts2中的一种Result类型,专门用于实现HTTP级别的重定向。 重定向是一种...

    Struts2--result配置的各种视图转发类型

    在Struts2中,结果(Result)是Action执行后控制流程的重要部分,它负责将处理后的数据或者控制逻辑转向合适的视图。这篇博文将深入探讨Struts2中的result配置以及各种视图转发类型。 首先,让我们理解Result的基本...

    struts2+json

    &lt;result type="json"&gt; *.* &lt;/result&gt; ``` 在这个例子中,所有AjaxAction的属性都会被包含在返回的JSON中。 在Action类中,可能有一个方法处理AJAX请求,如下: ```java public class AjaxAction { private ...

    struts2配置文件之result

    ### Struts2配置文件中的Result详解 在Struts2框架中,`result`是一个非常重要的概念,它主要用于定义Action执行完成后页面的跳转规则。本文将深入探讨Struts2配置文件中`result`的配置方法及其不同的类型,并通过...

    Struts2主要Lib

    5. **结果类型(Result Type)**:结果类型定义了Action执行后如何跳转到视图。例如,"dispatcher"是最常见的结果类型,用于将控制权交给Servlet容器来处理JSP页面的渲染。 6. **OGNL(Object-Graph Navigation ...

    struts2-src

    Struts2内置了多种Result类型,也可以自定义Result类型满足特定需求。 5. **配置文件**:Struts2的配置文件(struts.xml)是应用的蓝图,包含了Action、拦截器、结果类型等的定义。开发者可以根据项目需求进行配置...

    struts2ajax项目

    本项目"struts2ajax"是基于Struts2框架,利用jQuery库实现的Ajax功能示例。jQuery是一个轻量级的JavaScript库,它简化了DOM操作、事件处理以及Ajax交互,使得开发者更容易实现复杂的前端效果和交互。 首先,我们...

    struts2实例 学生信息管理系统

    struts2实现的学生信息管理系统 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ...

Global site tag (gtag.js) - Google Analytics