Struts2---ognl(Object Graph Navigation language)

Struts2—ognl(Object Graph Navigation language)

OGNL简介
  • ognl是一种功能的强大的表达式语言
  • 它可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。
ognl与el表达式对比
  • ognl对象图导航的语言比el表达式强大很多倍
  • el表达是只能从域当中获取数据
  • ognl可以调用对象的方法,获取struts的值栈数据(根区和非根区)
ognl功能
  • 支持运算符
  • 支持对象方法调用
  • 支持静态方法调用(@java.lang.Math@random())和值访问
  • 支持赋值操作和表达式串联
  • 访问ognl上下文
  • 操作集合对象
  • 可以直接new一个对象
ognl使用要素
  • 表达式
  • 根对象
  • context对象(非根对象)
ognl入门
  • ognl根对象中存取数据

    • 往根对象中直接存取值
     //ognl的使用
     /*1.获取ognl对象*/
      OgnlContext ognlContext = new OgnlContext();
      //往OgnlContext对象中存数据       往根对象中存数据
      ognlContext.setRoot("aaa");
      //从根当中取数据 直接获取这个对象
      Object obj = Ognl.getRoot(ognlContext);
      System.out.println(obj);
    
    • 往根对象中存取对象

      • 方法1(取对象):
      //ognl的使用
             /*step1.获取ognl对象*/
             OgnlContext ognlContext = new OgnlContext();
      
             //存数据 往根对象中存数据
             /*step2.创建一个商品对象*/
             Goods goods = new Goods();
             goods.setName("T恤");
             goods.setPrice(12.2);
             /*step3.将对象存放到root根对象当中*/
             ognlContext.setRoot(goods);
      
             //取对象 从根对象中取出数据
             /*从根对象中获取数据 方法1*/
             Object obj = Ognl.getRoot(ognlContext);
             System.out.println(obj);
      
      • 方法二(常用 取字段):
      //ognl的使用
             /*step1.获取ognl对象*/
             OgnlContext ognlContext = new OgnlContext();
      
             //存数据 往根对象中存数据
             /*step2.创建一个商品对象*/
             Goods goods = new Goods();
             goods.setName("T恤");
             goods.setPrice(12.2);
             /*step3.将对象存放到root根对象当中*/
             ognlContext.setRoot(goods);
      
       /*从根对象中获取数据 方法2*/
             /**
              * getValue参数:
              * 1.表达式 取哪一个字段(domain中类所对应的字段名)
              * 2.ognlContext
              * 3.root 获取root
              */
             /*获取root*/
             Object root = ognlContext.getRoot();
      
             Object name = Ognl.getValue("name", ognlContext, root);
             System.out.println(name);
      
  • ognl非根对象中存取数据

      ```
      //注意往非根对象中存取数据得时候对象名称前面要加上#号
       //ognl的使用
              /*step1.获取ognlContext对象*/
              OgnlContext ognlContext = new OgnlContext();
      
              //存数据 往非根对象中存数据 就是将的数据存放到Map当中
              /*step2.创建一个商品对象*/
              Goods goods = new Goods();
              goods.setName("T恤");
              goods.setPrice(12.2);
              /*将数据存放到map当中,所以使用put这种方式进行 key,value*/
              //非根对象 不能够取出对象中的某一个字段  而是取出存放的内容
              ognlContext.put("goods",goods);
      
      
              //取对象 根非根对象中取出数据
      
              /*从非根对象中获取数据*/
              /**
               * getValue参数:
               * 1.表达式 :#key(前面put中取的key值)
               * 2.ognlContext
               * 3.root 获取root
               */
              /*获取root*/
              Object root = ognlContext.getRoot();
      
              /*注意key(goods之前也要加上一个#号) 返回的为put进非根的对象*/
              Goods obj = (Goods)Ognl.getValue("#goods", ognlContext, root);
              /*取出其中字段的方法 就是从对象中获取字段的get方法*/
              System.out.println(obj);
              System.out.println(obj.getName());
              System.out.println(obj.getPrice());
      ```
    
  • ognl调用对象方法

    • 访问静态方法的时候要在struts.xml中开启允许访问静态方法这个常量

      //在struts.xml中开启常量(在package之外开启常量)
      <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
      //引入标签库(jsp当中)
      <%@ taglib prefix="c" uri="/struts-tags" %>
      然后就可以在jsp中获取根与非根对象中的数据
      
       /*1.获取ognlContext对象*/
              OgnlContext ognlContext = new OgnlContext();
              /*2.提前拿到root的值,因为后面getValue的时候要使用到*/
              Object root = ognlContext.getRoot();
              /*
              * getValue参数:
              * 1.表达式
              * 2.ognlContext
              * 3.root
              * */
              //调用普通的方法  例如:将字符串中对象中的长度返回
              Object value = Ognl.getValue("'hello'.length()", ognlContext, root);
              System.out.println(value);
      
              //调用静态方法 在静态方法前面加上@符号  将方法名的前面的“.”也要换成“@” 注意表达式是使用的包的全名称
              Object random = Ognl.getValue("@java.lang.Math@random()", ognlContext, root);
              System.out.println(random);
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值