1.问题一 : 什么是值栈 ValueStack
    
    回顾web阶段 数据交互问题?
        客户端提交数据  到  服务器端    request接受数据+BeanUtils实体封装
        服务器端数据 在页面上显示        在服务器端将数据存储到request域中  页面中通过el+jstl完成数据展示
        
    struts2阶段,数据交互问题?
        客户端提交数据  到  服务器端    属性驱动和模型驱动
        服务器端数据 在页面上显示        在服务器端将数据存储到值栈中    在页面中通过ognl+struts2标签数据展示
        
    request域    等于    值栈
    el表达式    等于    ognl表达式
    jstl标签    等于    struts2标签
    
    
    值栈是什么?
        值栈是服务器与客户端进行数据交互的数据中心,用于存储数据
        在服务器将数据存储到值栈中 在页面中从值栈取出数据进行展示
        
        值栈ValueStack是Struts2提供接口规范,于此同时也提供了该接口的实现OgnlValueStack
        
    值栈的生命周期?
        Action          ActionContext        ValueStack
            1                1                    1
        
        
        Action:多例的
            创建:每次访问都会创建一个新的的Action
            销毁:响应结束该Action销毁
            
        
2.问题二 : 值栈的内部结构
    获得值栈对象
        ActionContext context = ActionContext.getContext();
        VAlueStack valueStack = context.getValueStack();
        
    值栈的内部结构:
        Root栈:ArrayList
        context栈:map
        

3.问题三 : 值栈对象何时创建?ValueStack 和 ActionContext是什么关系
    源码分析:
        --->StrutsPrepareAndExecuteFilter
        --->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        --->prepare.createActionContext(request, response);
        --->ValueStack stack = createValueStack();
        
    ActionContext内部维护值栈的引用
    
4.问题四 : 如何获得值栈对象ValueStack
    第一种方式:
        ActionContext context = ActionContext.getContext();
        VAlueStack valueStack = context.getValueStack();
        
    第二种方式:
        通过request域对象 request.getAttribute("struts.valueStack");
        
        源码:
            --->StrutsPrepareAndExecuteFilter
            --->public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            --->execute.executeAction(request, response, mapping);
            --->dispatcher.serviceAction(request, response, mapping);
            --->request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());
                public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack"

5.问题五 : 如何手动向值栈保存数据
    5.1 向Root栈存储数据
        //获得值栈对象
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        //获得内部的Root栈
        CompoundRoot root = valueStack.getRoot();

//存数据
        root.add("itcast");        //存储到尾部
        root.add(0, "itheima"); //存储到头部(栈顶)

//CompoundRoot的存取数据的API
        root.push("xxx"); //压栈 add(0, o);
        root.peek(); //获得栈顶的值 return get(0);
        root.pop(); //弹栈 return remove(0);
    5.2 向context栈存储数据
        //获得值栈对象
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        //获得context栈
        Map<String, Object> map = valueStack.getContext();
        
        map.put("xxx", "XXX");
        map.get("xxx");
        
    5.3 valueStack对象维护着向值栈存取数据的API
        valueStack.push();
        valueStack.set();
        valueStack.findValue();
       
6.问题六 : struts2框架会将哪些数据自动保存到值栈中
    引入struts2的标签<s:debug/>   该标签可以在页面中直观看到值栈的内部数据
    
    6.1 struts2框架会自动将哪些数据存储到Root栈
        将当前访问的Action对象自动压栈
            作用:Action的get方法的属性值 可以通过ognl表达式方便获取
        将当前模型对象自动压到栈顶
            作用:模型对象压到栈顶 通过ognl表达式方便取出模型对象的属性值
    
    6.2 struts2框架会自动将哪些数据存储到context栈
        request对象
        response对象
        各种域数据
        请求参数
        ... ...
        
        维护本次请求的所有相关数据
    
7.问题七 : 如何取值栈的数据 (Ognl+struts2标签)
    7.1 取出普通数据
        注意:什么符号都不加 代表从Root栈取值
        <s:property value="ognl表达式"/>
        
        <h1>取出普通数据name</h1>
        <s:property value="name"/>
        <h1>取出user中的name</h1>
        <s:property value="user.name"/>
        
        
        注意:#代表直接从context栈取值
        <s:property value="#ognl表达式"/>
        
    7.2 遍历集合数据
        <!--
        会将集合中的每一个元素对象 依次临时存储到栈顶
         -->
        <%-- <s:iterator value="userList">
            <s:property value="name"/>==<s:property value="age"/><br/>
        </s:iterator> --%>
        
        <!--
            var: 变量名称  临时使用var指定的字符串作为key在context栈存储一份
         -->
        <s:iterator value="userList" var="user">
            <s:property value="#user.name"/>==<s:property value="#user.age"/><br/>
        </s:iterator>

8.问题八 : 为什么 EL也能访问值栈中的数据 (面试)
    原因:StrutsRequestWrapper
    ${} 底层调用getAttribute方法
    源码:
        request = prepare.wrapRequest(request);
        request = dispatcher.wrapRequest(request);
        
        //BufferedReader reader = new BufferedReader(new FileReader());
        StrutsRequestWrapper request = new StrutsRequestWrapper(request);
        
        增强的是getAttribute方法:
        public Object getAttribute(String key) {
            //调用原来的request的方法
            Object attribute = super.getAttribute(key); //从request域中获得值
            if (attribute == null) {
                attribute = stack.findValue(key);
            }
            return attribute;
        }

Struts2知识点小结(三)--值栈与ognl表达式的更多相关文章

  1. Struts2基础学习(七)—值栈和OGNL

    目录: 一.值栈 二.OGNL表达式 一.值栈(ValueStack) 1.定义      ValueStack贯穿整个Acton的生命周期,每个Action类的对象实例都拥有一个ValueStack ...

  2. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  3. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  4. struts2的总体回想(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)

    ValueStack:struts2的一个存放数据的数据结构(核心) ValueStack大致能够理解为:由Map和对象栈组成 ValueStack作用范围:一个请求,用它来取代request的作用域 ...

  5. 走进Struts2(五)— 值栈和OGNL

    值栈 1.值栈是什么? 简单说:就是相应每个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的优点就是:在大多数情况下,用户根本无须关心值栈,无论它在哪里,不用管它里面有什么,仅仅须要去获 ...

  6. 初学者易上手的SSH-struts2 04值栈与ognl表达式

    什么是值栈?struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值.,特点:先进后出.如果将它当做一个容器的话,而这个容器有两个元素,那么最上面的元素叫做栈顶元素,也就是所说的压 ...

  7. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  8. 学习Struts--Chap05:值栈和OGNL

    1.值栈的介绍 1.1 值栈的介绍: 值栈是对应每一个请求对象的数据存储中心,struts2会给每一个请求对象创建一个值栈,我们大多数情况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据 ...

  9. Struts2知识点小结汇总

    Struts2部分 1. JavaEE软件三层结构和MVC的区别? JavaEE软件三层机构是由sun公司提供JavaEE开发规范的:Web层(表现层).业务逻辑层.数据持久层.[其中WEB层会使用前 ...

随机推荐

  1. 认识Spring AOP

    Spring AOP AOP是Aspect/'æspekt/ Oriented/ɔːrɪentɪd/ Programming的缩写,意为:面向切面编程. 是什么 通过预编译方式和运行期动态代理实现程序 ...

  2. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...

  3. JavaScirpt(JS)——js介绍及ECMAScript

    一.JavaScript历史发展 JavaScript语言的历史:http://javascript.ruanyifeng.com/introduction/history.html 1994年12月 ...

  4. P2085 最小函数值(minval)

    题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix^2+Bix+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...

  5. 【Android】8.0活动的生命周期(一)——理论知识、活动的启动方式

    1.0 Android是使用任务(Task)来管理活动的,活动就像栈一样堆放着在一起. 每个活动的生命周期最多可能会有四种状态: 1.1 运行状态 位于栈顶 1.2 暂停状态 不在栈顶但在界面上仍处于 ...

  6. H5分享到微信好友朋友圈QQ好友QQ空间微博二维码

    这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...

  7. JavaScript中文拼音排序函数

    要对很多设备根据名称排序,找了找没有找到特别适合的,然后就自己写了一个根据中文拼音首字母排序的方法. github: https://github.com/haboll/sort.git

  8. 转:ArcGIS提取面状道路中心线(转载)

    1.首先把所有的面要素merge成一个要素 2.把merge后的数据转成线数据 3.此时转换后的线数据一定是闭合的,为了防止提取中心线失败(只提取出外围轮廓)我们在随意一个道路末端使用打断工具打一个开 ...

  9. spring boot 项目在启动时执行指定sql文件

    参考博客: https://www.jianshu.com/p/88125f1cf91c 1. 启动时执行 当有在项目启动时先执行指定的sql语句的需求时,可以在resources文件夹下添加需要执行 ...

  10. matlab练习程序(毛玻璃模糊)

    算是一种特效模糊方式吧,算法原理就是用邻域随机像素代替当前所处理的像素就可以了. 效果如下图所示: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; i ...