美文网首页
Web开发最佳实践-Struts2之四数据传递

Web开发最佳实践-Struts2之四数据传递

作者: 紫荆秋雪_文 | 来源:发表于2019-09-29 00:05 被阅读0次

    一、OGNL和ValueStack(值栈)

    Struts2数据共享.png

    1、Action把数据传递给JSP

    • 1、在原生的servlet情况下
    Servlet共享值:
    request.setAttribute(String name,Object value);
    JSP获取值:
     通过EL来获取 ${name}
    
    • 2、在Struts2中引入OGNL和ValueStack,把数据共享在某一个作用域对象中
    Action共享值:
            ActionContext.getContext().put(String name,Object value);
            ActionContext.getContext().getSession().put(String name,Object value);
    JSP获取值:
            此时得依赖Struts2的标签:
             <%@ taglib uri="/struts-tags" prefix="s" %>
            再通过<s:property value=”OGNL的语法”>标签来获取数据.
    

    2、OGNL

    OGNL是Object Graphic Navigation Language(对象图导航语言[负责:对象和页面之间数据传递])的缩写,它是一个开源项目。

    • Struts2框架使用OGNL作为默认的表达式语言
    • OGNL就是EL的升级版
    • OGNL是Action和视图JSP之间数据交互的桥梁

    3、ValueStack(值栈)

    • 1、ValueStack是对应每一个请求对象的轻量级的内存数据中心。
      每一次请求的时候,都会创建一个新的ValueStack对象,该ValueStack对象封装了这一次请求相关的数据信息
    • 2、ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是现实了该接口OGNLValueStack类,这个类是Struts2利用OGNL的基础
    • 3、ValueStack贯彻整个Action的生命周期(一次请求):每个Action类的实例都拥有一个ValueStack对象。ValueStack相当于数据的中转站,在其中保存该次请求和当前Action对象和其他相关对象信息
    • 4、Struts2框架把ValueStack对象保存在名为"struts.valueStack"的request属性中。

    4、获取ValueStack

    • 1、方式一:因为ValueStack在请求中,属性名为struts.valueStack
    ValueStack vs = request.getAttribute("struts.valueStack");
    ValueStack vs = ServletActionContext.getRequest().getAttribute("struts.valueStack");
    ValueStack vs = ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
    
    • 2、方式二:通过ActionContext对象获取
    ValueStack vs = ActionContext.getContext().getValueStack();
    

    二、ValueStack的内部结构

    ValueStack对象中有两个很重要的属性,这两个属性就是ValueStack的主要内部结构

    • root属性:CompoundRoot extends ArrayList:是栈的数据结构(后进先出,后进栈的数据在栈顶)。root中主要存储Action对象相关的数据信息。
    • context属性:Map类型。主要存储映射关系数据(key-value),context中存在root对象的引用,只要拿到context对象就可以获取到root对象
    • context中存在request、session、application、attr、parameters对象的应用。获取到context,就可以获取ValueStack中所有的数据
    • 获取root中数据方式:直接使用属性名获取
    <s:property value="属性名/位置"/>
    
    • 获取context中获取数据方式
    <s:property value="#key"/>
    
    ValueStack内部结构.png

    1、Struts2 Debug标签

    • 1、jsp
    <%@ taglib uri="/struts-tags" prefix="s"%>
    使用debug标签
    <s:debug></s:debug>
    

    注意:在Struts2的 2.5.20版本中<s:debug>标签默认是关闭的,需要在struts.xml中打开开发者模式

    <constant name="struts.devMode" value="true" />
    
    • 2、debug内容


      debug.png

    2、共享数据到ValueStack中的root区域

    • 1、使用add
    private void rootData() {
            ValueStack valueStack = ActionContext.getContext().getValueStack();
            valueStack.getRoot().add(0, "Revan");
        }
    
    root_add.png

    root区域存储数据结构变化,在没有存储数据到root区域时,key:com.revanwang.stack.StackAction在栈顶

    • 获取数据
    <s:property value="[0].top"/>
    
    • 2、使用push
        private void rootData_push() {
            ValueStack valueStack = ActionContext.getContext().getValueStack();
            valueStack.getRoot().push("Revan");
        }
    
    root_push![root_set.png](https://img.haomeiwen.com/i2338406/0f0a53e32ad1f42a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) .png
    • 获取数据
    <s:property value="[0].top"/>
    
    • 3、使用set方法
        private void rootData_set() {
            ValueStack valueStack = ActionContext.getContext().getValueStack();
            valueStack.set("name", "Revan");
        }
    
    • 获取数据
    <s:property value="[0].name"/>
    
    • 4、在Action中提供一个可访问的属性(getter方法),这个样保证Action在栈顶
        @Setter
        @Getter
        private String name;
    
        @Override
        public String execute() throws Exception {
    
            this.name = "123456";
    
            return SUCCESS;
        }
    
    root_getter.png
    • jsp中获取数据
    <s:property value="name"/>    //123456
    

    3、共享数据到ValueStack中的context区域

    • 1、存储到context区域
        private void context() {
            ActionContext.getContext().put("name", "Revan12345");
        }
    
    • 获取数据
    <s:property value="#name"/>
    
    • 存储位置 context.png
    • 2、存储到context区域的session中

        private void context_session() {
            ActionContext.getContext().getSession().put("type", "Session-Revan");
        }
    
    • 获取数据
    <s:property value="#session.type"/>
    
    • 存储位置 context_session.png
    • 3、存储到context区域的application中

        private void context_application() {
            ActionContext.getContext().getApplication().put("type", "Application-Revan");
        }
    
    • 获取数据
    <s:property value="#application.type"/>
    
    • 存储位置 application属性中

    相关文章

      网友评论

          本文标题:Web开发最佳实践-Struts2之四数据传递

          本文链接:https://www.haomeiwen.com/subject/lcmkuctx.html