大家好,欢迎来到IT知识分享网。
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调用对象的方法
@Test public void 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(); } }
运行结果
2.利用ognl访问类中的静态方法
@Test public void 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(); } }
运行结果
3.获取root区中的数据
创建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(); }
运行结果
4.获取context区域的值
@Test public void 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(); } }
运行结果
D.ognl在struts2环境的介绍
如果是jsp页面,需要先引入ognl标签库才能用
<%@ taglib uri=”/struts-tags” prefix=”s” %>
1.访问对象中的方法
<h3>访问对象中的方法</h3> <s:property value="'helloworld'.substring(5)"/> //剪切字符串
运行结果
2.访问静态方法
注意:struts2中默认静态访问方法是关闭的,怎么查看了,打开library—->/org/apache/struts2—->default.properties.所以我们需要手动在struts.xml文件里面开启它,才能实现静态访问
<struts>
<!– 开启静态方法访问常量 –>
<constant name=”struts.ognl.allowStaticMethodAccess” value=”true”></constant>
<package name=”struts” extends=”struts-default”></package>
</struts>
运行结果:
后面获取root还有context区域的值就涉及到了值栈的知识了,后面继续,还涉及到了在值栈存值的知识。当然在jsp中获取contex和root存值,也可以在jsp中利用ognl表达式取值,但是用action比较正规一点。先大致看一下,什么都不存时候context区域
<h3>访问context区域</h3> <s:property value="#session"/>
<s:debug/>
运行结果
看到了吧,取到了session,但是session里面什么样子,拿到就有哪些值,所以后面值栈继续。
好了,就讲到这里。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30328.html