Struts2知识点小结(三)–值栈与ognl表达式

Struts2知识点小结(三)–值栈与ognl表达式Struts2知识点小结(三)–值栈与ognl表达式

大家好,又见面了,我是你们的朋友全栈君。

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
        Struts2知识点小结(三)--值栈与ognl表达式

Struts2知识点小结(三)--值栈与ognl表达式

   

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;
        }

转载于:https://www.cnblogs.com/itworkerlittlewrite/p/9442189.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107372.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于软件质量的思考 – 什么是质量

    关于软件质量的思考 – 什么是质量

    当选择一个商品的时候,我们常挂在嘴边的一个词就是“质量”,这是影响我们选择的一个很重要的指标。这一篇我们就来探讨一下什么是软件的质量。当然,都是个人的一些观点,不同意可以拍砖或者来探讨。

    质量这个词用得太普遍以至于混乱,有时候它表示质量这个指标,有时候它隐含质量好的意思。而且不可避免的,好的质量常常和它的反面联系在一起,就好像以前的“质量万里行”,或者现在的3.15,列出的都是质量方面的问题,好像很少宣扬质量好的产品。所以很多时候,我们看质量

    2022年9月23日
    2
  • spring boot框架搭建_springboot工作原理

    spring boot框架搭建_springboot工作原理公司大部分的应用程序都使用springboot开发,作为测试人员,学习了解该框架也势在必行。此外作为想成长为测试开发的同学来说,使用springboot开发后端服务也是一项基本的技能。

    2022年8月20日
    6
  • 二十、Sql Server 保留几位小数的两种做法

    二十、Sql Server 保留几位小数的两种做法问题:数据库里的floatmomey类型,都会精确到多位小数。但有时候我们不需要那么精确,例如,只精确到两位有效数字。解决:1.使用Round()函数,如Round(@num,2)参数2表示保留两位有效数字。2.更好的方法是使用Convert(decimal(18,2),@num)实现转换,decimal(18,2)…

    2022年7月20日
    30
  • python psutil替代_python psutil

    python psutil替代_python psutil1、CPU1psutil.cpu_times(percpu=False)返回cpu使用时间元祖。若percpu=True,返回各个CPU的使用情况列表。1psutil.cpu_percent(interval,percpu)#返回CPU利用率2psutil.cpu_times_percent(interval=None,percpu=False)3psutil.cpu_count(lo…

    2022年6月7日
    29
  • IIS防盗链:ISAPI Rewrite图片防盗链规则写法

    IIS防盗链:ISAPI Rewrite图片防盗链规则写法以下ISAPIRewrite已经在我的服务器上正常运作。经测试四种情况正常,即站内链接正常,白名单里的链接正常,盗链者链接屏蔽,搜索引擎链接正常。详细如下;一、完全屏蔽所有盗链来源的写法(如已有其它规则,则置于已有规则的上面)代码:RewriteCondHost:(.+)RewriteCondReferer:(?!http://\1.*

    2022年7月23日
    5
  • sql server 字符串和日期的转换函数[通俗易懂]

    sql server 字符串和日期的转换函数[通俗易懂]字符串转换为日期:cast(‘20100514’asdatetime)日期转换为字符串:CONVERT(nvarchar(30),GETDATE(),126)日期格式规则如下:1101美国mm/dd/yyyy2102ANSIyy.mm.dd3103英国/法国dd/mm/yy4104德国dd.mm.yy5105意大利dd-m

    2022年10月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号