该用户从未签到
|
1. OGNL表达式的基本概念
- d# N3 m# h. x% q( ~" |. ^ |EL表达式2 u5 A5 U* R1 a
用字符串的形式表示对对象(数据)的访问' `. ` ?5 ^' e1 s
// 用代码的方式对数据访问:
+ P. M2 Y7 c) w1 `; N: pEmp emp = request.getAttribute("emp");
' \6 L; K* g& h2 X. bString name = emp.getName();
' F3 j; x5 ]! Yout.println(name);: x4 Z# [* C& C4 f& k) U$ l
这种方式不太适合写在JSP页面中,不匹配!!!* S" O* E: Y1 S. r1 R0 Q# e
<%for(...) {%>
1 B' ?1 l: @0 W9 o8 Z: Q7 F, Z<html...>' p! \' r/ ~ g2 j* f. S* g
<%}%>
6 V) n2 @5 M1 z% F: `8 _EL 字符串——对应数据访问代码, w9 [7 a& s' V# O1 q8 \
由JSP引擎实现转换工作
: K1 x& x S( s5 r$ |! U9 C" a${emp.name}
5 b# E( ~; j" h [6 E* D) ?0 u% f& A3 T- U
OGNL和EL有着类似的实现原理2 _1 q r. y o, J
3 m6 v- ]! r( f
2. 常见的OGNL表达式; A ]) o) g8 J4 _0 Z7 u& Z$ a
1) "属性名" (例如:name,id)
3 Y5 j7 G; }; u+ W& R2) "数组属性[index]", "List属性[index]" (例如:empList[1])& I" G( H# }$ k. Z3 z+ b
3) "Map属性['key']" (例如:map['three'])
( U9 a- }* B9 R8 l4) "属性名.属性名...." (例如: emp.name)6 M5 _) f ?/ x, c! S
5) "List属性.{属性}" (例如:empList.{salary})
8 }3 n4 ]- c0 g7 m( u6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000}): C1 @3 Y: l7 V* p o3 n
7) "{元素1,元素2,元素3}") `0 h1 L+ _0 P9 O0 }7 l. w
8) "#{key1:value1,key2:value2,key3:value3}"* f3 q5 j2 X! Q6 y0 F- q+ r0 Q9 _
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)") P+ l7 f$ t) u" I& t; g; _# ^
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
8 t X1 G& V0 R! d0 l- L# f11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")0 s+ v6 C" j; ^
$ A. ^0 _; y3 P5 r$ r
3. OGNL引擎( y9 B$ T" u4 p
OGNL------>ROOT(业务数据)6 j/ q* t4 U1 y* W( _# ~% Q" E
|4 m- E4 z( @$ q+ t: G
|------->Context(环境数据),Map (#key)7 X6 U8 w5 j6 c6 ]7 h5 b4 r& @ Y' L
# F+ t- u; @1 y0 [4 q: o
4. XWork定制的OGNL引擎
H) x3 i/ m& }2 iValueStack:: |1 K1 n% N* J" M/ f$ U0 f
OGNL------>CompundROOT
6 |! K0 u4 `9 i: B2 c | |____root0) \7 u, q$ j: n5 _$ a0 Q
| |____root1
: `( [9 M( y: `" ^, v | |____root2
! N7 d( o6 v0 A0 s0 r$ h | ....
% g' _7 k* ^/ m2 K f |
& K* E) N6 l; n |) C- C# d) o8 i, M7 F
|5 ]6 V- M! v2 N* `
|------->Context(环境数据)* M1 Y; D* R' ?, Z, B J
% W6 L* @! w0 C2 g+ a# P 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配; ?. _$ Z4 S+ Z+ ^/ T+ h
% D4 t( U7 j$ r/ v9 S3. ValueStack(struts2 的核心组件)) N% L& ]8 g7 s2 p+ Z
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
+ t% u. D/ M% {1 w$ z, ^2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
" t5 b: e6 N9 k- F, S 再实例化要访问的Action对象,然后将Action对象置于ValueStack& _0 c+ }0 p. P; \& c f
的CompoundRoot栈的栈顶
, x4 u& ?' y* H ]6 ~
# i3 }1 ~4 @9 G! x. Z+ h/ S" Q. M4 y2 h; _2 Y
|
|