zoukankan      html  css  js  c++  java
  • struts2从浅至深(六)contextMap(存取数据)

    A:存数据

             1.利用ActionContext存数据

        

             这种方式最简便

    这是一个购物车案例

                       把查询来的数据放入到Session中存储起来

           2.利用valuestack值栈存数据

             

                     把查询出来的数据放入到值栈中存储起来

    总结

    //获取ValueStack对象的引用
    //第一种方式:获取HttpServletRequest对象,通过对象的getAttribute方法,从域中取
    //1.获取request对象
    HttpServletRequest request = ServletActionContext.getRequest();
    //2.根据key获取ValueStack对象的引用
    ValueStack vs1 = (ValueStack)request.getAttribute("struts.valueStack");
    System.out.println(vs1.hashCode());


    //第二种方式:先获取ActionContext对象,再取出requestMap,然后通过map的get方法获取
    //1.获取ActionContext对象
    ActionContext context = ActionContext.getContext();
    //2.获取requestMap
    Map<String,Object> requestAttribute = (Map<String,Object>)context.get("request");
    //3.根据key获取对象的引用
    ValueStack vs2 = (ValueStack)requestAttribute.get("struts.valueStack");
    System.out.println(vs2.hashCode());


    //第三种方式:使用ActionContext对象的方法,直接获取ValueStack对象的引用
    ValueStack vs3 = context.getValueStack();
    System.out.println(vs3.hashCode());


    //栈的操作
    ActionContext context = ActionContext.getContext();
    ValueStack vs = context.getValueStack();
    //压栈操作
    vs.push(new Student("泰斯特",21));
    /*
    * ValueStack的其他方法
    * setValue(String expr, Object value);
    * String expr:它是一个OGNL表达式
    * Object value:我们要操作的数据
    * 把数据存到哪里去?
    * 看expr是否使用了#
    * 如果使用了#,操作的就是ContextMap中
    * 如果没使用#,操作的就是ValueStack
    */
    vs.setValue("#name", "张三");//把数据放到ContextMap中。 key是name valeu=张三
    vs.setValue("name", "李四");//把ValueStack中第一个name属性的值换成李四。如果没有一个name属性的对应的setName方法,会报错。


    /*
    *set(String key, Object o);
    * String key : Map的key
    * Object o : map的value
    * 如果栈顶是一个Map元素,直接把key作为map的key,把Object作为map的value存入。存入的是栈顶。
    * 如果栈顶不是一个Map元素,创建一个Map对象,把key作为map的key,把Object作为map的value,压入栈顶。
    */
    vs.set("s1", new Student("王五",18));
    vs.push(new Student("test",23));
    vs.set("s2", new Student("aaa",28));

    B:取数据

             存方式有两种 那么取方式肯定会存在两种

             使用s:property取数据

                       1、取contextMap中的数据,需使用#

                  2、取contextMap里面ValueStack中对象的属性:直接写属性名

     

               特殊说明:当s:property不给定value属性时,默认取栈顶对象。

              OGNL的使用总结:

                                       1.取根中对象的属性,不使用#

                                       2.contextMapkey的值,要使用#

  • 相关阅读:
    sizeof--返回一个数据类型或变量占用的字节数
    跳出循环break continue
    c-for循环
    while循环语句
    什么是Python中的套接字编程?
    详解Vue八大生命周期钩子函数
    你应该知道的数仓安全
    云图说|华为云自研云数据库GaussDB NoSQL,兼容多款NoSQL接口的数据库服务
    又到一年“粽子节”,快来测测你包的粽子颜值几分
    云小课 | 华为云KYON之私网NAT网关
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/ognl_show.html
Copyright © 2011-2022 走看看