该用户从未签到
|
1. OGNL表达式的基本概念
# o$ K! P7 v- A1 ], ^; R6 C! kEL表达式% @* e' ~; l4 w- O* }! }' b
用字符串的形式表示对对象(数据)的访问
( I% k) I1 z) q1 e9 `5 I: j' y: B// 用代码的方式对数据访问:
& z6 e9 J* s* U, ~$ N! F w% KEmp emp = request.getAttribute("emp");
, ?, N' z0 b6 j& }String name = emp.getName();
L! L7 k; T( h+ i5 z( |out.println(name);
" R$ B: ~8 Y. t- N' Y# [8 h& o这种方式不太适合写在JSP页面中,不匹配!!!3 W: y3 A# j, Q
<%for(...) {%>
7 r# m+ e2 e' D9 E5 Y1 v% {- e+ [<html...>
" I7 A, w- @1 h" N1 v% ^$ G<%}%>
' q6 w! h4 X+ G& MEL 字符串——对应数据访问代码
3 T0 }1 y; M& Y# \ n5 S由JSP引擎实现转换工作
6 G8 ]' i" h g: j( b( C- J4 Y${emp.name}
, ]1 ]: E$ |: T/ h) w; B7 c
. X# H% }1 {1 S/ G1 w* d. _OGNL和EL有着类似的实现原理6 j$ T+ z! {; R1 [3 G
% l) c; |: n, {' [/ ^$ U2 B q) [. D* o2. 常见的OGNL表达式8 X8 \) h8 m% F& a, [' K6 e
1) "属性名" (例如:name,id)
6 V8 b A* @# h# {9 r2) "数组属性[index]", "List属性[index]" (例如:empList[1])
+ F; k* \# e+ D# Y) G3 T2 \' r3) "Map属性['key']" (例如:map['three'])
' H& ^4 N8 T9 d# C! ?6 s4) "属性名.属性名...." (例如: emp.name)0 J0 E# N3 l+ E
5) "List属性.{属性}" (例如:empList.{salary})
: g" N1 _5 R" d6 J" e/ z9 N6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})8 Q0 W9 i" p% Z* [5 o
7) "{元素1,元素2,元素3}"
- T$ t" g& ?+ l" @! z) j4 y& E& G2 z& m/ P8) "#{key1:value1,key2:value2,key3:value3}"
6 @, W& z6 @, f( k7 V- G9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")6 R9 ?6 V; }) ]5 |2 B6 q4 Q
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
+ @* ] `& D. X% r+ B4 r; y. i11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")9 |* ^8 d( b; k/ q* U1 J J6 ^
I; _% ]3 n7 M% w1 ]( M3. OGNL引擎+ a4 o4 i* g5 P
OGNL------>ROOT(业务数据)
0 y3 F5 W6 h6 t/ A- b4 r4 q |2 s2 L$ \$ @) H' ~- a
|------->Context(环境数据),Map (#key)
: f5 O: q1 |9 U4 K! k) s) N( w& l- J, m! O M; S7 E
4. XWork定制的OGNL引擎
# W& w, z* e: Q! V! j/ l9 L" H3 `ValueStack:5 k3 u/ A0 b; w) g0 ]/ E( H
OGNL------>CompundROOT
[+ o9 h1 _9 `4 V0 ]3 |' Y | |____root0
/ U" s7 R @' {+ a6 _ | |____root1
* u7 @9 d: P9 f4 L0 l | |____root2' g3 _$ r4 X$ R# `# a$ \8 }" K, Y
| ....$ f/ f$ r9 z" L D' ~) r1 r0 W/ T+ d ?
|4 Q, ^8 d g9 a2 U' [0 {
|& v3 ?9 D/ }. k+ s4 S
|
; a3 \$ W: b) Y }' E# m |------->Context(环境数据)
6 `$ }1 v: s; D# _3 [7 t1 k6 E: V: V% D+ [0 ?7 I& B
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配' y# D7 e" W" r9 W4 l1 Y
0 ~- ?. V) u1 N+ R$ `9 S9 c3. ValueStack(struts2 的核心组件)8 {! q: }! v; d+ {" }: O# z
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
% j( m9 A7 m% q2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
. x9 `8 }. y% ] 再实例化要访问的Action对象,然后将Action对象置于ValueStack! Q+ T& K" ?6 e, ~- z6 S
的CompoundRoot栈的栈顶
7 }7 v% @! p- E& i; p/ e9 A/ k
" |0 r) D* ~* q2 d+ ?' x4 A$ q) I5 G; G, Z0 G: h/ N# {
|
|