该用户从未签到
|
1. OGNL表达式的基本概念3 M) R0 g5 X" C) i' f$ s
EL表达式
) x' O: d: L) K& K' `用字符串的形式表示对对象(数据)的访问
0 r; R3 ?3 ]4 U$ a4 l' d// 用代码的方式对数据访问:/ p4 A& n) S( W2 b; }: Z
Emp emp = request.getAttribute("emp");
, P% Q4 @* k2 a4 t1 u, {. nString name = emp.getName();
( y3 u2 L8 C- m$ X( xout.println(name);
& i9 G3 y' d; H2 U3 B' T5 I+ T" [+ N这种方式不太适合写在JSP页面中,不匹配!!!
% p, J) s) L; u* P<%for(...) {%>/ a1 a5 O" P9 a
<html...>1 E* ^ c+ r3 [2 X! F3 W
<%}%>
/ A: Z V2 t1 r( s8 y+ R* rEL 字符串——对应数据访问代码& Z" P) q( W% V K& k
由JSP引擎实现转换工作
7 v$ W' F5 l" `${emp.name}6 Y v: O3 {+ P, a2 K) D- M" W7 C
$ n& D7 y8 K/ E& j+ f+ U$ |% d, d
OGNL和EL有着类似的实现原理
8 S( F8 A8 O8 k: I+ _7 @
1 _8 X/ g7 m6 X; L2 f: C2. 常见的OGNL表达式' C! o& S* S4 g) `
1) "属性名" (例如:name,id)1 x# N% j" z3 G) a1 P2 M' `. G' F
2) "数组属性[index]", "List属性[index]" (例如:empList[1]); g8 z- b$ R) x) v s" V
3) "Map属性['key']" (例如:map['three'])
6 J6 s/ W& W) C1 b- S4) "属性名.属性名...." (例如: emp.name)2 ?' [- j/ Z, C; z3 U
5) "List属性.{属性}" (例如:empList.{salary}) {# Y2 g) z) m: c8 y8 u
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000}) f; Y$ v' b6 E5 ?8 d1 W
7) "{元素1,元素2,元素3}"
: d% \! b4 A `8) "#{key1:value1,key2:value2,key3:value3}"
8 X5 i! T7 _, z$ U. ~5 J* r' ~- |9 o9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)"). O5 U9 {1 y. i ^
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
$ N, y3 [% C; ^1 V7 {11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")9 S5 l9 u) ]! I7 h
1 [3 z J' I. @) P
3. OGNL引擎' n0 ] E7 d+ `, P# U
OGNL------>ROOT(业务数据)
7 l7 u/ Y; Z) N8 h( v& c! M7 Q5 F |
6 b% u& S2 X/ A |------->Context(环境数据),Map (#key)
9 s0 C: n/ X5 p7 u: h$ S
! f3 a$ l$ T4 \. s+ ]9 [4. XWork定制的OGNL引擎
) \( R" |7 k3 Y5 Q5 YValueStack:" A' q( a C5 [' g7 A
OGNL------>CompundROOT
0 c3 Y4 q, ]" [4 ]& r u# I" ? | |____root0
& \- Y% { y; @% v0 D3 ?; { | |____root1
" L6 g7 K0 O# x8 n$ N, c | |____root2
5 k) T1 j- Y8 n" h5 f | ....
! p$ w6 X' H/ t4 _0 M |
" z* g. | S+ I* A7 u: N |
. ?6 y1 l2 m0 ^- \" h2 P$ E$ E- e |
7 r# s9 i* m6 F9 O# a |------->Context(环境数据)
7 e* V) G7 ^& G8 b; Z, V5 k3 r9 x$ {* }$ E
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
* Z7 m# B2 \/ T( J; u6 C/ g* z5 `$ t, p
$ O6 M7 [3 ?) m( I3. ValueStack(struts2 的核心组件)
5 V# }( u$ r$ r% u# V) d1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
$ P! h% f& L N4 U& B; g* B3 p0 C8 T2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack5 `6 `. e6 v& N( c/ T! `4 L: J
再实例化要访问的Action对象,然后将Action对象置于ValueStack
- e( z T* [3 x) X* J 的CompoundRoot栈的栈顶6 ^. m9 N) R) [% Q
+ h$ A+ ^6 U; O5 \3 }9 p- Y! ~. f7 W* O
|
|