该用户从未签到
|
1. OGNL表达式的基本概念
# D2 S3 j% w1 YEL表达式
& ~* X9 r. K3 m3 a用字符串的形式表示对对象(数据)的访问
0 u7 }* x* D' @; a1 K8 n) D. x// 用代码的方式对数据访问:
+ |8 N7 R4 J0 s! c) S7 S/ {Emp emp = request.getAttribute("emp");
4 i+ G5 B8 j: ]4 B, yString name = emp.getName();
6 @5 \ C1 O# G/ y2 Q) kout.println(name);
7 h! @# p& p+ F& h& @' N, c这种方式不太适合写在JSP页面中,不匹配!!!
& \; b4 X. Z; R8 j<%for(...) {%>
0 v7 L9 U$ {1 w0 M<html...>- i) a- {7 t! I
<%}%>
7 T' z" R3 C. |8 d+ k* _EL 字符串——对应数据访问代码
3 C" d t0 }& }: `& @由JSP引擎实现转换工作
: o' N" A. R: z${emp.name}* [& N- q9 n% I) R% g5 R
5 W; i3 O0 d1 h: b
OGNL和EL有着类似的实现原理
+ X. g2 r$ F) n/ r1 p4 @ J, } D/ x
2. 常见的OGNL表达式. s1 T+ a. t; N" m' ]( |
1) "属性名" (例如:name,id)
5 Y0 t9 F9 z& A$ O2) "数组属性[index]", "List属性[index]" (例如:empList[1])" Q9 I6 B5 F Z1 Y( e! K- e2 h
3) "Map属性['key']" (例如:map['three'])
! M+ v/ ]2 M: U7 S4) "属性名.属性名...." (例如: emp.name) u1 [: v- K1 \/ S8 O ?' |6 M% e
5) "List属性.{属性}" (例如:empList.{salary})
' }. w6 X9 j+ R6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
* T2 r: Z! N' T3 _7) "{元素1,元素2,元素3}") e* j7 [' h1 A% o- U2 v; M" Z8 D
8) "#{key1:value1,key2:value2,key3:value3}"$ y" a: }3 C( R/ V8 a
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
/ P, Z# [7 s$ o8 b. S* ~* b1 _10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")+ M5 k+ ~4 H: @& t1 g* z
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
& L3 x' }: m" |: j: N9 q8 r5 q7 E. y# [% Q
3. OGNL引擎
0 `4 {# J- T* J) ~7 F/ w8 | OGNL------>ROOT(业务数据)
) p$ j7 Y+ e/ h8 Z6 G: e3 V. _5 I0 P |
4 J7 n: c2 u# W% x$ H |------->Context(环境数据),Map (#key)
4 O- I% E$ e, ] t. l+ ~
, e. o7 p% `% C& P/ t4 Q' ^4. XWork定制的OGNL引擎3 A4 `1 }; e, X: `$ G! `" }& Q: |& y
ValueStack:2 o M+ ~4 P; z3 A3 F
OGNL------>CompundROOT
q. L' a; u3 r; A6 L/ C% a | |____root0
8 Q8 x# n9 b5 ]: A | |____root1. X! u9 A2 `9 f5 M3 \
| |____root2/ P: U1 p N" J- l: i( w
| ....% z, [: X% X) y* ~% ], M
|" l8 Y- w3 z" Q) ]0 z$ y/ y% y5 W
|
, r% Y4 t- R; ~* a |+ D' p+ o0 n2 u2 e( F
|------->Context(环境数据)
d/ r8 L5 A; B4 P- p3 m D9 S) O! J; [* P: `: L6 K
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配& B% s# Y: L5 P4 S$ \" Q+ g5 a
; b9 S1 j' ~9 }; L+ U& J
3. ValueStack(struts2 的核心组件)3 i' u" o5 p, r0 m) a( v
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构9 ?1 b3 f$ o( o/ J3 K! G
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
+ N- Y8 d7 o6 \- L. K" T 再实例化要访问的Action对象,然后将Action对象置于ValueStack
2 ?) _1 X* h- m" P/ s, h0 }; t3 \ 的CompoundRoot栈的栈顶, B {. [: D ?$ S
, C: Z& S! ]( r! p1 M' p$ T
- u' g4 ?- G2 x1 n& F |
|