|
该用户从未签到
|
1. OGNL表达式的基本概念
" U" q6 n3 F& ~8 kEL表达式
" F( q$ e' Q5 B% H% @ J用字符串的形式表示对对象(数据)的访问
& z- q( R& c# e/ l8 g9 \// 用代码的方式对数据访问:
* O$ x' `2 O1 I x% p3 p4 IEmp emp = request.getAttribute("emp");! k! B5 E; Q+ U5 M! G
String name = emp.getName();
0 y* c1 Q8 t# j( y4 M; `- x! Jout.println(name);
6 G6 Z$ y: t6 ~( |8 ]) ~. g4 L8 \这种方式不太适合写在JSP页面中,不匹配!!!) l$ `+ E4 Q, J& p' ]2 A- y0 ~& f
<%for(...) {%>1 O' }! v8 e7 B: @9 r* q3 }2 \1 d
<html...>. d K& S: Y |8 ^2 B
<%}%>
" F0 m4 }! `4 s4 s2 F5 _+ v% zEL 字符串——对应数据访问代码2 g6 H3 G5 b$ M5 {+ \6 D
由JSP引擎实现转换工作
3 g; _5 H% J3 T* H& S; g${emp.name}
* h/ c w3 z& s. o0 e6 E; a' q3 x* d
OGNL和EL有着类似的实现原理
4 e" b# c# f# _1 E* i* ~/ l w" M( S; W: B) G$ H: ]
2. 常见的OGNL表达式2 Y' L* {* D3 V# W N
1) "属性名" (例如:name,id)) x; _4 B T1 z% B. n! w9 z
2) "数组属性[index]", "List属性[index]" (例如:empList[1])
1 Z7 H8 F0 u" v7 O3) "Map属性['key']" (例如:map['three'])
8 E; a- _! j: G9 P5 \2 Q% Q3 }4) "属性名.属性名...." (例如: emp.name). K' z$ s# N3 W8 r1 f! r, y
5) "List属性.{属性}" (例如:empList.{salary})
8 q/ A f# x8 ~8 M( C3 f6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
( g; }+ F% |2 G8 Q7) "{元素1,元素2,元素3}"
$ X% F: b8 `" N' T: O$ N) \8) "#{key1:value1,key2:value2,key3:value3}"
/ L; R6 T7 t0 U+ ?9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")* s% p# c* F; b; q
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
: M$ L1 u8 o6 W& N* |( Z11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
% X# y' ~1 S2 g6 E' o7 m6 a `! o8 x5 y2 d9 }. O
3. OGNL引擎% ~4 q; m6 S& X- A8 t- j- Z2 G T0 S; P
OGNL------>ROOT(业务数据)
, S4 B; p* ^2 A; [. @( s* L6 _ |3 g8 a8 R& B6 D5 i* X* z
|------->Context(环境数据),Map (#key)
' J2 [& O$ R! C6 w7 `9 n
- t: ~5 J) P( i n) w4. XWork定制的OGNL引擎" k* a% g, P$ b) A1 h
ValueStack:
( s! W+ u/ _, o OGNL------>CompundROOT8 X9 _7 Z9 F- i1 S T0 ^ L( q
| |____root0- [, o/ W$ U8 Y, \/ f7 q8 {/ [
| |____root15 G, _" D% K& j; |
| |____root2
! E5 ~5 {+ Y' }+ Q | ....
. o; @5 [0 x9 |; W; W, z+ L |* @9 r2 _7 v! E5 d
|
( z- H( u# }9 \$ w; a |
6 c# F* C% J- R5 E5 q" y |------->Context(环境数据)( |# z7 x% l1 `5 _4 H( @9 E
- f2 d/ m; b' [7 @ `3 z 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配7 H5 j- ?% t5 B8 }' Q4 |1 `7 t
4 U5 T {* w+ k" f* S3. ValueStack(struts2 的核心组件)
' r' k2 m$ |' J/ I1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构4 D. z( U3 p( G9 o% i$ t
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack8 U( X, P" H# ?: }6 [) n
再实例化要访问的Action对象,然后将Action对象置于ValueStack
9 F" J8 n0 i5 s* Q: z7 i 的CompoundRoot栈的栈顶/ j8 c, f7 R6 P, E0 l
& j+ Q: X' M$ z, h5 o$ N3 G" L1 G, Q
|
|