该用户从未签到
|
1. OGNL表达式的基本概念% a Q( R! S: m7 d- H. ^7 I
EL表达式. l! a4 \1 z0 q6 E* }+ k4 J( A
用字符串的形式表示对对象(数据)的访问
6 s' ^& V6 Z% o4 G// 用代码的方式对数据访问:
9 \6 e5 a+ K4 @3 s9 l8 FEmp emp = request.getAttribute("emp"); [# \- n! F( J( x8 `
String name = emp.getName();
& z( G6 f: Z! B' z- I2 @& S9 ^out.println(name);: j0 C9 e+ h& l/ Z
这种方式不太适合写在JSP页面中,不匹配!!!
3 `/ e5 d9 B# n5 T! ]<%for(...) {%> J3 [* g6 v$ E
<html...>
6 [7 l) d2 A. x8 g+ X<%}%>( M6 b6 a; e+ V' a7 z$ ?
EL 字符串——对应数据访问代码+ u& I/ b F- {/ `7 W: }
由JSP引擎实现转换工作
0 k, o3 U7 q& V6 C${emp.name}
( y' x6 q, T. A1 B9 Y+ j3 ]5 S, z y- \9 V) q6 S, Z5 ^0 _) o1 x
OGNL和EL有着类似的实现原理9 d' g1 s9 I s! O) P; _0 T
) e' z$ o6 B$ M! n9 u# P3 Y' _# S5 Q2. 常见的OGNL表达式7 _. M; L1 \5 O" l) U
1) "属性名" (例如:name,id). g% s. C) @/ w) j
2) "数组属性[index]", "List属性[index]" (例如:empList[1])
9 u" e8 c5 C; [! j) ]2 N2 v3) "Map属性['key']" (例如:map['three'])* R7 {; b8 e1 x8 N$ H: a
4) "属性名.属性名...." (例如: emp.name)0 ~8 |6 Y' s+ P' p3 c4 Y
5) "List属性.{属性}" (例如:empList.{salary}): r5 l# p( b3 J; M" W( n
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})* o5 B' \- V1 L7 \; N
7) "{元素1,元素2,元素3}"
% \ z3 r- Q# ~1 V9 Y- u" v8) "#{key1:value1,key2:value2,key3:value3}"; t% p9 _+ l! }, i9 o! f Z$ D
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
3 w8 Y9 U$ D0 o2 y; A. w+ l3 n10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")6 c8 P' w, C0 I9 |& _: h! [1 E
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")/ `7 P2 c9 {' A m; H( D/ L; T: w
" P. {. R; C2 f- ^; {% g X: V3. OGNL引擎, A7 ^2 T4 W: b+ O( z @
OGNL------>ROOT(业务数据)
+ C) y1 H5 V0 M/ ?" ^* @1 M |
, W0 ~8 [0 M$ i" K/ y' z |------->Context(环境数据),Map (#key)* t4 I3 o" Y3 a" n
& ]( n3 j; O( J
4. XWork定制的OGNL引擎: S3 b6 a3 [% h" ^
ValueStack:
; `; X2 g5 F5 ^( U% U- ^$ z h OGNL------>CompundROOT) M$ I0 f9 L6 e
| |____root00 W# ]- |: B' F5 G4 s, F* t1 b
| |____root1
' l. Z$ h, g" @. S! @ | |____root2+ T& f5 @* y) Z, b
| ....
( l9 g9 [) v9 j9 W$ j# j7 m |
. C, U" C, X6 p) Z0 I |
! d7 v) u+ |6 s |$ C" F+ h4 [* K. l9 T$ t
|------->Context(环境数据)% w+ K4 Z& w) k" e6 Y% a0 t
/ K: S3 v% e/ j& N
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
4 r% N) Y! U v. L! [, r' V$ w
( c! [9 W7 h6 Z* N3 ]: f0 n3. ValueStack(struts2 的核心组件)1 ?6 o# J) S$ `( c. Z! {! e
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
# P" F2 M5 W8 Y/ h: ?. Y2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
# G% ], ~) [' m' c/ C 再实例化要访问的Action对象,然后将Action对象置于ValueStack) t) T! \# F9 A
的CompoundRoot栈的栈顶. l' @+ c' M5 B& m+ U( d, S H
7 m/ h" X1 Z5 R4 h5 Q( I3 A: l
D, t/ O4 V1 m9 R: `
|
|