Struts2 第六讲 -- Struts2的结果类型

7.struts2的结果类型

  • l 每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果.
  • l 每个 Action 声明都必须包含有数量足够多的 result 元素, 每个result 元素分别对应着 action 方法的一个返回值.
  • l result 元素可以有下面两个属性
    • l   name: 结果的名字, 必须与 Action 方法的返回值相匹配, 默认值为 success
    • l   type: 响应结果的类型. 默认值为 dispatcher

struts2的所有结果类型在struts2-core-2.5.14.jar文件struts-default.xml中配置

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

7.1 dispatcher(请求转发)

  • l dispatcher 结果类型是最常用的结果类型, 也是 struts 框架默认的结果类型
  • l 该结果类型有一个 location 参数, 它是一个默认参数
<action name="contextAction02_test" class="cn.youric.you.two_context.ContextActionTwo">
            <result name="success" type="dispatcher">
                <param name="location">/context/attr.jsp</param>
            </result>
        </action>
<action name="contextAction02_test" class="cn.youric.you.two_context.ContextActionTwo">
        <result name="success" type="dispatcher">/context/attr.jsp</result>
</action>
<action name="contextAction02_test" class="cn.youric.you.two_context.ContextActionTwo">
            <result name="success">/context/attr.jsp    </result>
</action>

上面三个是等价的。

  • l dispatcher 结果类型将把控制权转发给应用程序里的某个资源.
  • l dispatcher 结果类型不能把控制权转发给一个外部资源. 若需要把控制权重定向到一个外部资源, 应该使用 redirect 结果类型

7.2 redirect(重定向到页面)

  • l redirect 结果类型将把响应重定向到另一个资源, 而不是转发给该资源.
  • l redirect 结果类型接受下面这些参数:
    •   l location: 用来给出重定向的目的地
    •   l param: 用来表明是否把 location 参数的值视为一个 OGNL 表达式来解释. 默认值为 true
  • l redirect 结果类型可以把响应重定向到一个外部资源

也可以重定向到其它项目下;

7.3 redirectAction(重定向到Action)

  • l redirectAction 结果类型把响应重定向到另一个 Action
  • l redirectAction 结果类型接受下面这些参数:
    •   l actionName: 指定 “目的地” 动作的名字. 它是默认属性
    •   l namespace: 用来指定 “目的地” 动作的命名空间. 如果没有配置该参数, Struts 会把当前 Action 所在的命名空间作为 “目的地” 的命名空间

7.4 chain(解决重定向request作用域失效)

  解决request作用域传递值失效的问题。我们知道请求转发是一个请求,那么重定向就是两个请求了,此时request域不是同一个,自然数据也就消失了,那么怎么解决作用域失效的问题呢?

  我们下面做这样一个操作,访问【创建一个新包,将原类copy过来】ContextAction,然后重定向到helloWorldAction.action,在对应的Action类中获取request域中中的username【两种情况,一种不考虑解决域失效,一种解决域失效】

  <body>
    <form action="${pageContext.request.contextPath}/resulttype/resulttypeAction.action"
          name="form1"  method="post">
      <input type="submit" value="提交">
    </form>
  </body>
@SuppressWarnings("serial")
public class ResulttypeAction extends ActionSupport{

    @Override
    public String execute() throws Exception {
        System.out.println("欢迎访问ResulttypeAction中的execute方法!");
        ActionContext.getContext().put("username", "request_username");
        return SUCCESS;
    }
}
<struts>
    <package name="resulttype" namespace="/resulttype" extends="struts-default">
        <default-action-ref name="resulttypeAction"></default-action-ref>

        <action name="resulttypeAction" class="cn.youric.you.c_resulttype.ResulttypeAction">
            <result name="success" type="redirectAction">
                <param name="namespace">/primer</param>
                <param name="actionName">helloWorldAction.action</param>
            /context/success.jsp</result>
        </action>
    </package>
</struts>
public class HelloWorldAction extends ActionSupport{

    @Override
    public String execute() throws Exception {
        System.out.println("欢迎访问HelloWorldAction中的execute方法!");
        String username = (String) ServletActionContext.getRequest().getAttribute("username");
        System.out.println("跨域获取:"+username);
        return "success";
    }

我们发现重定向的话,request域中的数据丢失了,因为这是两个请求,下面解决

方式一:

  type=redirectAction,使用OGNL表达式,从request作用域中获取username的值,然后再使用username作为名称,传递给重定向的的Action类

在HelloWorldAction类中使用:

String username = ServletActionContext.getRequest().getParameter("username");

Struts-resulttype。Xml      HelloWorldAction
<action name="resulttypeAction" class="cn.youric.you.c_resulttype.ResulttypeAction">
            <result name="success" type="redirectAction">
                <param name="namespace">/primer</param>
                <param name="actionName">helloWorldAction.action?username=${#request.username}</param>
            /context/success.jsp</result>
        </action>
    @Override
    public String execute() throws Exception {
        System.out.println("欢迎访问HelloWorldAction中的execute方法!");
        String username = (String) ServletActionContext.getRequest().getParameter("username");
        System.out.println("跨域获取:"+username);
        return "success";
    }

相当于是将request域中的参数取出,作为重定向请求的参数传递

方式二:

type=chain,此时不需要传递username的值

在HelloWorldAction类中使用:

String username = (String) ServletActionContext.getRequest().getAttribute("username");
ResulttypeAction@Override    public String execute() throws Exception {        System.out.println("欢迎访问ResulttypeAction中的execute方法!");        ActionContext.getContext().put("username", "request_username");        return SUCCESS;    }<result name="success" type="chain">
                <param name="namespace">/primer</param>
                <param name="actionName">helloWorldAction.action</param>
            </result>HelloWorldAction@Override    public String execute() throws Exception {        System.out.println("欢迎访问HelloWorldAction中的execute方法!");        String username = (String) ServletActionContext.getRequest().getAttribute("username");//        String username = (String) ServletActionContext.getRequest().getParameter("username");        System.out.println("跨域获取:"+username);        return "success";    }
String username = (String) ServletActionContext.getRequest().getAttribute("username");

测试Action类:

原文地址:https://www.cnblogs.com/lin-jing/p/8319784.html

时间: 2024-08-04 11:44:37

Struts2 第六讲 -- Struts2的结果类型的相关文章

Struts2 第四讲 -- Struts2的基本配置

5.struts2的基本配置 5.1 struts2的访问连接url 在struts1中,通过<action path=“/primer/helloWorldAction.action”>节点的path属性指定访问该action的URL路径. 在struts2中,访问struts2中action的URL路径由两部份组成:包的命名空间+action的名称 例如: 访问本例子HelloWorldAction的URL路径为: /primer/helloWorldAction.action (注意:完

Struts2 第二讲 -- Struts2的入门

搭建struts2环境时,我们一般需要做以下几个步骤的工作: 第一步:创建javaweb工程(这个很废话有木有) 第二步:找到开发Struts2应用需要使用到的jar文件.(这个很白痴有没有) 到http://struts.apache.org/download.cgi#struts2514.1下载struts-2.x.x-all.zip,最新的版本为2.5.14.下载完后解压文件,开发struts2应用需要依赖的jar文件在解压目录的lib文件夹下.不同的应用需要的JAR包是不同的.下面给出了

Java框架之Struts2(六)

一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. 它使用相同的表达式去存取对象的属性 Struts 2 默认的表达式语言是 OGNL,原因是它相对其它表达式语言具有下面几大优势: 1.支持对象方法调用,如xxx.doSomeSp

二十六:Struts2 和 spring整合

二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot---->WEB-INF目录下新建一个目录lib,用于存放jar包(Struts2和spring整合所需jar包) 将项目名称为day29_02_struts2Spring,WebRoot---->WEB-INF下的lib目录下的所有jar包拷贝到新项目对应的位置,同时将spring的配置文件appl

深入struts2.0(六)--ActionProxy类

1.1     ActionProxy接口以及实现 ActionProxy在struts框架中发挥着非常重要的作用.通过webwork和xwork交互关系图可以看出,它是action和xwork中间的一层. 正因为ActionProxy的存在导致Action调用更加简洁.接下来我们一起研究下这个核心类. 1.1.1       ActionProxy接口方法 图 3.3.1 ActionProxy接口主要方法图 ActionConfig getConfig();该方法主要是获得创建ActionP

菜鸟学SSH(十六)——Struts2内部是如何工作的

前面说完了Spring.Hibernate,很自然今天轮到struts了.struts的核心原理就是通过拦截器来处理客户端的请求,经过拦截器一系列的处理后,再交给Action.下面先看看struts官方的工作原理图: 图1 struts原理图 简单分析一下:首先客户端发来HttpServletRequest请求,传递给FilerDispatcher(ActionMapper是访问静态资源(struts的jar文件等)时用的,平时很少用),然后FilerDispatcher会为我们创建一个Acti

Struts2学习第一天——struts2基本流程与配置

struts2框架 什么是框架,框架有什么用? 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率. 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ? 什么是struts2框架,它有什么用? Struts 2是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架. 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大.Struts 2以WebWork为核心 struts2=struts1+

第六讲 map

2.  map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 3.  map的功能 自动建立Key - value的对应.key 和 value可以是任意你需要的类型. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次. 快速插入Key - Value 记录. 快速删除记录 根据Key 修

Struts2.x教程(三) Struts2拦截器

一.Struts2拦截器介绍 Struts2拦截器是使用AOP实现的,主要是针对action对象进行拦截,可以在访问action的某个方法.字段之前或之后实施拦截. 可以为action配置多个拦截器,Struts2会将这一组拦截器按照一定顺序组织成一个拦截器栈.action可以直接引用某个拦截器栈来实现配置多个拦截器的目的. 对于继承struts_default的package中的action,都会默认引用name=defaultStack的拦截器栈(在struts_default中定义了Str