struts基础3-把数据写入页面

一、OGNL(Object-Groph Navigation Language)

    是一种强大的表达式语言,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

  1)与EL表达式对比:

        OGNL对象图导航语言,比EL表达语言更强大:EL只能从域中获取数据,OGNL可以存取数据,可以调用对象的方法,获取struts的值栈的数据。

        是第三方的表达式语言(但struts中自带OGNLjar包)

  2)OGNL功能:

      1.支持运算符(+-*/)

      2.支持对象的方法调用,如xxx.doSomeSpecial();

      3.支持类静态的方法调用和值访问。

      4.支持赋值操作和表达式串联。

      5.访问OGNL上下文。

      6.操作集合对象。

      7.可以直接new一个对象。

  3)OGNL使用要素:

      1.表达式(取)

      2.根对象(存)

      3.Context对象(非根对象)(存)

  4)OGNL入门

      1.OGNL核心类:OgnlContext,本质是一个map

        1.1往根里存取数据(重要)存入的是Root去

          可以取出存的对象的字段的值

    @Test
    public void test(){
        //ognl使用
        OgnlContext ognlContext = new OgnlContext();
        //存数据  根对象
        ognlContext.setRoot("aa");
        //取数据
        Object ognlroot = Ognl.getRoot(ognlContext);
        System.out.println(ognlroot);
    }

      

  @Test
    public void test2() throws OgnlException {
        OgnlContext ognlContext = new OgnlContext();
        //存数据 根对象
        goods goods = new goods();
        goods.setName("ual");
        goods.setPrice(123.0);
        ognlContext.setRoot(goods);
        //取数据 直接取值:用Ognl.getValue(),有三个参数:1.取哪一个字段,2.ognlContext 3.root
        //获取root
        Object root = ognlContext.getRoot();
        Object name = Ognl.getValue("name", ognlContext, root);
        System.out.println(name);
    }

      1.2往非根对象中存取数据(重要)存入的是map Value区

    不可以取出存的对象的字段的值,只能取出存入的对象。

 @Test
    public void test3() throws OgnlException {
        OgnlContext ognlContext = new OgnlContext();
        //存数据,非根对象
        goods goods= new goods();
        goods.setName("ual");
        goods.setPrice(11.1);
        ognlContext.put("goods",goods);//相当于往map中存
        //非根对象无法直接取出字段,取的就是存的内容
        //获取root
        Object root = ognlContext.getRoot();
        //用Ognl.getValue(),有三个参数:1.#key,2.ognlContext 3.root
        goods obj = (goods)Ognl.getValue("#goods", ognlContext, root);//key值前要加#
        System.out.println(obj.getName());
        System.out.println(obj.getPrice());

    }

    1.3调用对象的方法

    调用静态方法要写完整名,且前面后后面加@

   @Test
    public void test4() throws OgnlException {
        OgnlContext ognlContext = new OgnlContext();
        Object root = ognlContext.getRoot();
        //调用对象的普通方法
        Object value = Ognl.getValue("'hello'.length()", ognlContext, root);
        System.out.println(value);
        //调用静态方法
        Object value1 = Ognl.getValue("@java.lang.Math@random()", ognlContext, root);
        System.out.println(value1);
    }

二、值栈

    1.什么是值栈

       ValueStack实际上就是一个容器,是一个接口,实现类是OgnlValueStack,当用户每次访问action对象的业务方法时,首先会创建ActionContext对象,OgnlValueStack对象(所有的数据放入其中),Action对象。OgnlValueStack对象由struts框架创建,当前端页面,如jsp发送请求时,struts默认的拦截器会将请求中的数据进行封装,并入ValueStack栈顶,struts框架中的数据就不存到域中了,而是保存到了ValueStack中。ValueStack贯穿整个action的生命周期,action一旦创建,就会创建一个ValueStack对象。

      存到域中的数据只能在页面中把它取出来,存入值栈中的数据可以在任意地方取出(如页面中,action中,配置文件中),存入域中的数据也可以从值栈中获取出来。

    2.

    2.  

猜你喜欢

转载自www.cnblogs.com/UalBlog/p/10623127.html