java ognl jar_Java架构实践-OGNL解析

A.什么是OGNL?

全称叫ObjectGraphic Navigation Language(对象图导航语言),它是struts2框架里面的第三方语言(即可以再别的地方用,struts2只是拿过来了而已),它可以调用对象中的方法,获取struts2里值栈的数据,具体优点https://baike.baidu.com/item/OGNL/10365326?fr=aladdin

B.OGNL的三要素

表达式:OGNL表达式是功能强大的表达式语言,何解?在ognl中想要执行取值,赋值,调用方法等等操作,你都需要用表达式表示。通过表达式,底层会解析出来你的想要操作。它支持链式结构

根对象:即root对象,可以理解为OGNL的操作对象,表达式规定做什么,而该对象就指定对谁操作。OGNL叫做对象图导航语言,对象图就是以任意一个对象作为根,通过OGNL可以访问到与这个对象相关的其他对象。底层使用list集合做的。

Context对象:其实就是OGNL的上下文环境。root对象也在OGNL的上下文环境里,底层是一个Map集合。该上下文环境规定了OGNL操作在“哪里进行”,注意访问context对象时候需要在表达式中加上#。

C.OGNL在java环境的运用。

---导入OGNL jar包

---用法:

1.OGNL调用对象的方法

d24227f076f4

@Test

publicvoid demo1() {

try {//            创建context对象OgnlContext context =new OgnlContext();//            利用context来获取root对象Object root = context.getRoot();//            Ognl中的静态方法getValue(expression, context, root, resultType)可以用来获取数据Object value = Ognl.getValue("'helloworld'.length()", context, root);  //expression就是方法表达式

System.out.println(value.toString());

} catch (OgnlException e) {

e.printStackTrace();

}

}

d24227f076f4

运行结果

d24227f076f4

2.利用ognl访问类中的静态方法

d24227f076f4

@Test

publicvoid demo2() {

try {//            创建context对象OgnlContext context =new OgnlContext();//            利用context来获取root对象Object root = context.getRoot();//            Ognl中的静态方法getValue(expression, context, root, resultType)可以用来获取数据Object value = Ognl.getValue("@java.lang.Math@random()", context, root);//这里注意获取静态方法表达式是固定表达: @类名@方法名System.out.println(value.toString());        }catch (OgnlException e) {

e.printStackTrace();

}

}

d24227f076f4

运行结果

d24227f076f4

3.获取root区中的数据

d24227f076f4

d24227f076f4

创建context对象

OgnlContext context =new OgnlContext();//注意,这里不能在getValue方法外面初始化获取root对象,不然导致该root为null,传进方法里面,由于root在外面已经被定义,方法底层就不会帮助创建赋值,直接报异常,name值根本不会再存          Object root = context.getRoot();                  System.out.println(root);//            向root区域存值,setRoot(Object obj),root就是通过一个对象找到与它关联的对象,所以只能用来存对象类型User user =new User();

user.setName("张三");

context.setRoot(user);//            root的取值不需要加上#,它是ognl内部的,所以不需要加#来特意告诉ognl            String value;

try {

value = (String) Ognl.getValue("name", context, context.getRoot());

System.out.println(value);

} catch (OgnlException e) {

// TODO Auto-generated catch block                e.printStackTrace();

}

d24227f076f4

d24227f076f4

运行结果

d24227f076f4

4.获取context区域的值

d24227f076f4

@Test

publicvoid demo4() {//            创建context对象OgnlContext context =new OgnlContext();//            利用context来获取root对象Object root = context.getRoot();//            向context区域存值,set一般向里面存对象,而context区域用put是存值context.put("name","张萨姆");

String value;

try {//            root的取值不需要加上#,它是ognl内部的,所以不需要加#来特意告诉ognl,而context区域上该ognl的所处的上下文环境,外部,要加上#说明value = (String) Ognl.getValue("#name", context, root);

System.out.println(value);

} catch (OgnlException e) {

// TODO Auto-generated catch block                e.printStackTrace();

}

}

d24227f076f4

运行结果

d24227f076f4

D.ognl在struts2环境的介绍

如果是jsp页面,需要先引入ognl标签库才能用

1.访问对象中的方法

1

2

访问对象中的方法

 //剪切字符串

运行结果

d24227f076f4

2.访问静态方法

注意:struts2中默认静态访问方法是关闭的,怎么查看了,打开library---->/org/apache/struts2---->default.properties.所以我们需要手动在struts.xml文件里面开启它,才能实现静态访问

d24227f076f4

d24227f076f4

运行结果:

d24227f076f4

后面获取root还有context区域的值就涉及到了值栈的知识了,后面继续,还涉及到了在值栈存值的知识。当然在jsp中获取contex和root存值,也可以在jsp中利用ognl表达式取值,但是用action比较正规一点。先大致看一下,什么都不存时候context区域

访问context区域

运行结果

d24227f076f4

d24227f076f4

需要获取海量最新BATJ视频资料加群:345353515 备注(简书)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值