zoukankan      html  css  js  c++  java
  • Struts2 第六讲 -- Struts2的结果类型

    7.struts2的结果类型

    • 每个 action 方法都将返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果.
    • 每个 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 框架默认的结果类型
    • 该结果类型有一个 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类:

  • 相关阅读:
    Components controls 区别
    lazarus 2016 2月18 4:22:35 支持android开发了, 既ios,linux,macosx,window,web 后 囊括一切啦。 哈哈
    Delphi MlSkin V1.1 发布啦! 它能让你的程序拥有像QQ一样多彩炫丽的外观!
    Tclientdataset的CloneCursor问题 clientdataset 复制 赋值 的问题
    字符串 映射 函数
    字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke
    一分钟了解nohup和&的功效
    Linux shell标准输入,标准输出,错误输出
    (一)shell编程之执行脚本的三种方式
    Shell:执行脚本文件方法
  • 原文地址:https://www.cnblogs.com/lin-jing/p/8319784.html
Copyright © 2011-2022 走看看