• 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.)  值栈内部结构

            分为根区与非根区

            根区:存放当前action中的数据,此次请求的数据。

            非根区:整个程序相关的数据,相关域,res,session,application.

          获取值栈:

    public String execute(){
            //获取值栈
            //根区,非根区
            //根区存放当前action相关的数据
            //非根区:整个程序相关的数据,相关域 res session application
            ValueStack valueStack = ActionContext.getContext().getValueStack();//获取值栈
            //往域中写入一些信息
            ActionContext context = ActionContext.getContext();
            context.put("reqName","reqValue");
            context.getSession().put("SessionName","SessionValue");
            context.getApplication().put("ApplicationName","ApplicationValue");
    
            System.out.println(goods);
            return null;
        }

          出入值栈:

      

       Goods goods1= new Goods();
            goods1.setName("xx");
            goods1.setPrice(32.2);
            valueStack.push(goods1);//入栈
            valueStack.pop();//出栈 

        3.)页面中获取数据

          由于request域中已经存入了值栈,所以页面中可以获取值栈。

           1.在页面获取调试信息

              1.1在struts.xml中加入:

               1.2在jsp页面引入标签库,与调试标签

     

          2.元素获取     :value中的值就是写入OGNL表达式。

            2.1存入根区的数据可以直接获取属性值

                获取根元素时,获取的是栈顶元素。

    <s:property value="name"/><%--value :ognl表达式,只能取栈顶的元素--%>

            2.2非根区取出数据:#Key值

          

    <%--取非根元素--%>
    <s:property value="#reqName"/><%--#键值--%>

          

        3.页面中通过OGNL执行方法

          默认情况下,不允许执行静态方法。需要在struts.xml中配置

     <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

          方法调用同上面OGNL介绍。

  • 相关阅读:
    JSP第七次作业
    JSP第六次作业
    Jsp第五次作业
    软件测试第二次作业
    Jsp第四次作业2
    Jsp第四次作业1
    软件测试第一次作业
    JSP第三次作业
    JSP第二次作业
    第七次作业
  • 原文地址:https://www.cnblogs.com/UalBlog/p/10623127.html
Copyright © 2020-2023  润新知