该用户从未签到
|
1. OGNL表达式的基本概念" b; k [3 {, K" R n2 Q
EL表达式
; V% U" O/ I7 Y( C! l9 c1 U用字符串的形式表示对对象(数据)的访问
0 h/ B3 O5 o' Y+ h. d// 用代码的方式对数据访问:$ c# f; M6 v. O4 `8 I3 j: L
Emp emp = request.getAttribute("emp");
' Z& d7 o0 R. R+ N6 P( D/ z6 j7 ^String name = emp.getName();
" y9 h L5 {$ `1 ]+ M( R- {out.println(name);
% X* ?3 ^4 Z6 Z/ z这种方式不太适合写在JSP页面中,不匹配!!!
$ e8 n) F) E, I& b8 x# D<%for(...) {%>% }1 M6 {" Y5 ~$ T1 ?
<html...>
8 K- d7 z2 Z, G/ p+ b6 |9 b! O7 x<%}%>* R- @# c( o* P
EL 字符串——对应数据访问代码
9 z& @. e$ Z8 N) ^9 V9 i由JSP引擎实现转换工作
" O! y3 W, W( J9 e' U${emp.name}
* y4 @4 K+ i+ m' L
% l+ f I( K7 B6 ?- _0 l! vOGNL和EL有着类似的实现原理/ X9 O' p7 |1 j* N" a/ p2 a. K
, e5 B/ e% A; H( A
2. 常见的OGNL表达式8 ~, y" @ b! ~+ \' U6 H7 w z
1) "属性名" (例如:name,id)0 L2 {9 ` s* n0 T' y$ w* _. g
2) "数组属性[index]", "List属性[index]" (例如:empList[1])1 H0 v" g* D2 l0 y) `
3) "Map属性['key']" (例如:map['three'])7 b2 r: s0 l7 D% E8 w% ~
4) "属性名.属性名...." (例如: emp.name)/ P& y9 J R: P* i: m( T( ~
5) "List属性.{属性}" (例如:empList.{salary})
1 n' m! P9 ?3 o4 W6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000}). S" R8 G) d" N/ X' r& R
7) "{元素1,元素2,元素3}"3 \8 K% j/ j: K0 v+ q. ]
8) "#{key1:value1,key2:value2,key3:value3}"
* K l, u1 C1 }- h9 B9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
" [+ I, s3 A7 h4 D5 O: T9 P10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")6 a. N8 L1 D0 i8 w1 v
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")% o) A) t* u1 P T; g
9 _9 Q+ N6 Y9 h: O2 I- r2 ?1 C
3. OGNL引擎
! R, w( A9 H) _ OGNL------>ROOT(业务数据)4 A$ G, ?: |; y, _1 t, F
|6 M# n7 ?% m, S5 r8 s4 I% U
|------->Context(环境数据),Map (#key), R2 d1 o2 F/ d6 b/ a* W% H$ w
! T# \; g9 ]# Z' p) n
4. XWork定制的OGNL引擎
1 u( Q" w6 q) @% p: OValueStack:1 D( G$ \7 R' m( w/ o+ P
OGNL------>CompundROOT
6 Y( W8 q! L( l | |____root0, ^. u/ k' m7 r* K+ ^) w: O
| |____root12 S- o5 `( a' D/ z2 v
| |____root2
7 h! K9 u2 m4 t* d* `1 G0 X | ....4 W0 [; R* I) S# |2 L- \, o. e2 Y
|
% i# t8 a$ b; k0 S% R$ g |
Z, v* A4 T# a! }$ F |+ I2 n2 {0 e9 w' {! L
|------->Context(环境数据)
# k Q2 c7 \, _* \' w' G- h( g
) q: t6 j! d- H% o 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配! d3 P9 y |* W
$ u( ]$ m8 X- j7 A: \8 g" p# K: y3. ValueStack(struts2 的核心组件)6 w- \6 ?* b4 o6 J3 l. V
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
P4 j( h$ L& I5 c2 ^2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack: K5 V5 h' ^/ Q8 @4 F# w2 g! f; v
再实例化要访问的Action对象,然后将Action对象置于ValueStack' y7 Q; j: }0 |1 N
的CompoundRoot栈的栈顶( e% J% D$ z" ?$ k; ~
; _$ M5 z7 o7 v! T% {$ I4 `
* B, J! _6 B. b$ \' c; A |
|