【文章內(nèi)容簡(jiǎn)介】
ghts Reser ved 169。 AlcatelLucent 2020 14 Variable References: this ?OGNL在表達(dá)式的每個(gè)點(diǎn)號(hào) (.)那里存儲(chǔ)該點(diǎn)號(hào) (.)之前的 EL表達(dá)式的值,該值通過 this來獲取。 比如: ().(this 100? 2*this : 20+this) 第二個(gè)點(diǎn) (.)那里,存儲(chǔ)的值為 (),接著,在括號(hào) (...)內(nèi)部,用this來指向這個(gè)值,也就是 ()。整個(gè)表達(dá)式的結(jié)果: 如果 ()大于 100,那么為 2*(()); 否則,整個(gè) EL表達(dá)式的值為 20+(()) All Rights Reser ved 169。 AlcatelLucent 2020 15 Chained Subexpressions ?如果 OGNL表達(dá)式中,某個(gè)點(diǎn)號(hào) (.)后面跟了個(gè)括號(hào)表達(dá)式 (...),比如: .(ensureLoaded(), name) 那么,這個(gè)點(diǎn)號(hào) (.)之前的所有表達(dá)式 (這里為 )的值被傳入括號(hào)表達(dá)式內(nèi),作為該括號(hào)表達(dá)式的 root object。上例 (ensureLoaded(), name)等價(jià)于: (a) rootObj1= (b) 調(diào)用 ()方法 【 方法調(diào)用,可以用來做一些動(dòng)作!比如賦值,檢測(cè),日志 ...】 (c) 然后把 。 還可以按照這種模式,做很長的鏈接: .(methodOfObj2(), propertyOfObj2)..(methodOfObj3(), propertyOfObj3) 另外一個(gè)例子: obj1.(obj2).(obj3).(obj4).(obj5) 等價(jià)于: All Rights Reser ved 169。 AlcatelLucent 2020 16 ?其余內(nèi)容,自己研究。 All Rights Reser ved 169。 AlcatelLucent 2020 17 All Rights Reser ved 169。 AlcatelLucent 2020 18 3. OGNL與 ANTLR /JavaCC (Java Compiler Compiler ) ?前面 History中,我們提到: Luke然后用 ANTLR重新實(shí)現(xiàn)了該語言,取了個(gè)新名字,這次由 Drew鼓動(dòng)的,這就是現(xiàn)在這種狀態(tài)。后來 Luke又用 JavaCC重新實(shí)現(xiàn)了該語言。 ?JavaCC/ANTLR Java Compiler Compiler [tm] (JavaCC [tm]) is the most popular parser generator for use with Java [tm] applications. A parser generator is a tool that reads a grammar specification and converts it to a Java program that can recognize matches to the grammar. In addition to the parser generator itself, JavaCC provides other standard capabilities related to parser generation such as tree building (via a tool called JJTree included with JavaCC), actions, debugging, etc. JavaCC是一種 grammar parser generator:語法解析器的生成器。也就是用于生成語法解析器。 ANTLR也是類似的工具 很多語言,比如 Java, HTML, C/C++, OGNL, MIB,都遵循一定的格式。那么,就可以用 ANTLR/JAVACC為這些語言生成 parser以解析這些語言。 All Rights Reser ved 169。 AlcatelLucent 2020 19 OGNL源代碼是怎么生成出來的 ?\ognl\src\java\ognl ? ? ? ? … ? ? ?\ognl\ All Rights Reser ved 169。 AlcatelLucent 2020 20 ?用 JAVACC生成 OGNL的 Compiler(OGNL源代碼 )過程: ? java