java ognl 性能_OGNL详解
a.什么是ognl?
全稱叫objectgraphic navigation language(對(duì)象圖導(dǎo)航語(yǔ)言),它是struts2框架里面的第三方語(yǔ)言(即可以再別的地方用,struts2只是拿過(guò)來(lái)了而已),它可以調(diào)用對(duì)象中的方法,獲取struts2里值棧的數(shù)據(jù),具體優(yōu)點(diǎn)https://baike.baidu.com/item/ognl/10365326?fr=aladdin
b.ognl的三要素
表達(dá)式:ognl表達(dá)式是功能強(qiáng)大的表達(dá)式語(yǔ)言,何解?在ognl中想要執(zhí)行取值,賦值,調(diào)用方法等等操作,你都需要用表達(dá)式表示。通過(guò)表達(dá)式,底層會(huì)解析出來(lái)你的想要操作。它支持鏈?zhǔn)浇Y(jié)構(gòu)
根對(duì)象:即root對(duì)象,可以理解為ognl的操作對(duì)象,表達(dá)式規(guī)定做什么,而該對(duì)象就指定對(duì)誰(shuí)操作。ognl叫做對(duì)象圖導(dǎo)航語(yǔ)言,對(duì)象圖就是以任意一個(gè)對(duì)象作為根,通過(guò)ognl可以訪問(wèn)到與這個(gè)對(duì)象相關(guān)的其他對(duì)象。底層使用list集合做的。
context對(duì)象:其實(shí)就是ognl的上下文環(huán)境。root對(duì)象也在ognl的上下文環(huán)境里,底層是一個(gè)map集合。該上下文環(huán)境規(guī)定了ognl操作在“哪里進(jìn)行”,注意訪問(wèn)context對(duì)象時(shí)候需要在表達(dá)式中加上#。
c.ognl在java環(huán)境的運(yùn)用。
---導(dǎo)入ognl jar包
---用法:
1.ognl調(diào)用對(duì)象的方法
@test
public void demo1() {
try {
// 創(chuàng)建context對(duì)象
ognlcontext context = new ognlcontext();
// 利用context來(lái)獲取root對(duì)象
object root = context.getroot();
// ognl中的靜態(tài)方法getvalue(expression, context, root, resulttype)可以用來(lái)獲取數(shù)據(jù)
object value = ognl.getvalue("'helloworld'.length()", context, root); //expression就是方法表達(dá)式
system.out.println(value.tostring());
} catch (ognlexception e) {
e.printstacktrace();
}
}
運(yùn)行結(jié)果
2.利用ognl訪問(wèn)類中的靜態(tài)方法
@test
public void demo2() {
try {
// 創(chuàng)建context對(duì)象
ognlcontext context = new ognlcontext();
// 利用context來(lái)獲取root對(duì)象
object root = context.getroot();
// ognl中的靜態(tài)方法getvalue(expression, context, root, resulttype)可以用來(lái)獲取數(shù)據(jù)
object value = ognl.getvalue("@java.lang.math@random()", context, root); //這里注意獲取靜態(tài)方法表達(dá)式是固定表達(dá): @類名@方法名
system.out.println(value.tostring());
} catch (ognlexception e) {
e.printstacktrace();
}
}
運(yùn)行結(jié)果
3.獲取root區(qū)中的數(shù)據(jù)
創(chuàng)建context對(duì)象
ognlcontext context = new ognlcontext();
//注意,這里不能在getvalue方法外面初始化獲取root對(duì)象,不然導(dǎo)致該root為null,傳進(jìn)方法里面,由于root在外面已經(jīng)被定義,方法底層就不會(huì)幫助創(chuàng)建賦值,直接報(bào)異常,name值根本不會(huì)再存
object root = context.getroot();
system.out.println(root);
// 向root區(qū)域存值,setroot(object obj),root就是通過(guò)一個(gè)對(duì)象找到與它關(guān)聯(lián)的對(duì)象,所以只能用來(lái)存對(duì)象類型
user user = new user();
user.setname("張三");
context.setroot(user);
// root的取值不需要加上#,它是ognl內(nèi)部的,所以不需要加#來(lái)特意告訴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();
}
運(yùn)行結(jié)果
4.獲取context區(qū)域的值
@test
public void demo4() {
// 創(chuàng)建context對(duì)象
ognlcontext context = new ognlcontext();
// 利用context來(lái)獲取root對(duì)象
object root = context.getroot();
// 向context區(qū)域存值,set一般向里面存對(duì)象,而context區(qū)域用put是存值
context.put("name","張薩姆");
string value;
try {
// root的取值不需要加上#,它是ognl內(nèi)部的,所以不需要加#來(lái)特意告訴ognl,而context區(qū)域上該ognl的所處的上下文環(huán)境,外部,要加上#說(shuō)明
value = (string) ognl.getvalue("#name", context, root);
system.out.println(value);
} catch (ognlexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
運(yùn)行結(jié)果
d.ognl在struts2環(huán)境的介紹
如果是jsp頁(yè)面,需要先引入ognl標(biāo)簽庫(kù)才能用
1.訪問(wèn)對(duì)象中的方法
訪問(wèn)對(duì)象中的方法
//剪切字符串
運(yùn)行結(jié)果
2.訪問(wèn)靜態(tài)方法
注意:struts2中默認(rèn)靜態(tài)訪問(wèn)方法是關(guān)閉的,怎么查看了,打開(kāi)library---->/org/apache/struts2---->default.properties.所以我們需要手動(dòng)在struts.xml文件里面開(kāi)啟它,才能實(shí)現(xiàn)靜態(tài)訪問(wèn)
運(yùn)行結(jié)果:
后面獲取root還有context區(qū)域的值就涉及到了值棧的知識(shí)了,后面繼續(xù),還涉及到了在值棧存值的知識(shí)。當(dāng)然在jsp中獲取contex和root存值,也可以在jsp中利用ognl表達(dá)式取值,但是用action比較正規(guī)一點(diǎn)。先大致看一下,什么都不存時(shí)候context區(qū)域
訪問(wèn)context區(qū)域
運(yùn)行結(jié)果
看到了吧,取到了session,但是session里面什么樣子,拿到就有哪些值,所以后面值棧繼續(xù)。
好了,就講到這里。
希望與廣大網(wǎng)友互動(dòng)??
點(diǎn)此進(jìn)行留言吧!
總結(jié)
以上是生活随笔為你收集整理的java ognl 性能_OGNL详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络机顶盒多少钱啊?
- 下一篇: java unit包_Java接入UNI