该用户从未签到
|
1. OGNL表达式的基本概念
2 U4 _( j- ^: M1 B' ]- MEL表达式
6 `, d# g; @8 }& k用字符串的形式表示对对象(数据)的访问1 m6 D) O# ]% y2 [1 W) x" I# j1 p! ^9 G
// 用代码的方式对数据访问:
; c4 q! A' o, v% {" mEmp emp = request.getAttribute("emp");
* |# F8 c, P8 c* hString name = emp.getName();: {8 l' s J4 n8 |: ^+ x8 D% J& U
out.println(name);
5 l& v8 P$ I' J* L& V* T这种方式不太适合写在JSP页面中,不匹配!!!# b# g1 w' \0 H4 m( O! g7 N
<%for(...) {%>: ]0 m3 X6 Y) J0 n
<html...>8 F I6 h' |9 ^, p8 C2 ]1 Z
<%}%>
1 z$ y/ |9 X" g1 R1 l3 PEL 字符串——对应数据访问代码
4 Z3 }1 Y) ?- r) Q/ p1 t( T3 j由JSP引擎实现转换工作- W+ k% t8 z0 J$ H" O5 u3 F5 N
${emp.name}9 \: E7 v. u, e, v: h. Y: D
5 W/ g" Y9 {) Z( K0 h
OGNL和EL有着类似的实现原理( Z5 T$ P. i; m. e$ \ I
* d; r J+ F. w# w& f/ C2. 常见的OGNL表达式
% O. N" k& E* @! q" X' v9 J# O3 z1) "属性名" (例如:name,id)
8 }& l, V% |7 k$ J4 l- t5 v" `2) "数组属性[index]", "List属性[index]" (例如:empList[1])
3 l6 r+ K l( F9 r9 f3) "Map属性['key']" (例如:map['three'])
6 x) ?0 c( n9 `- v2 Y5 Y4) "属性名.属性名...." (例如: emp.name)
" a( V4 {' W9 [* Q1 O* n5) "List属性.{属性}" (例如:empList.{salary})
( M6 L, }" j6 q. g6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
. h; q" G8 p a1 `7) "{元素1,元素2,元素3}": Y5 [6 n' s, {, _
8) "#{key1:value1,key2:value2,key3:value3}"
+ W( v3 T0 k B8 x/ g/ j9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
+ C, @& D- D4 E. W# K$ m5 _10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")9 n& Z$ L3 K9 f* u% P0 @" ]' I* \
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)") W4 n6 M4 j4 O+ E$ t" L4 o+ b
4 ^* n* J! y6 z! J$ Q" \+ `0 {3. OGNL引擎# u3 u0 d- e0 w' c6 j
OGNL------>ROOT(业务数据)
( Y3 [+ R: q: U) r" _% `- q# ` |3 u- U- \7 r& p9 ]& t
|------->Context(环境数据),Map (#key)
- ^+ ?% Z: [4 H) P. [- n' A
n$ L4 d4 i+ y" C! c! ?- k9 {4. XWork定制的OGNL引擎
! }$ l6 I! N! T' n u2 ]ValueStack:
' |+ D" [7 @6 t3 Z1 t+ T OGNL------>CompundROOT
, o3 c- \" ~4 _0 e | |____root0 M# } N% W5 u) w/ d
| |____root1
# E) V5 F! r1 O+ q3 M$ Q, w* M | |____root2: W5 O1 k: m$ Y$ F2 I
| ....7 N' X7 o0 q* O( V% x
|$ K, C' [# F- l1 E
|, x4 q% H& Z0 E( z( l
|
7 G! V! C2 X6 t# [' ] |------->Context(环境数据)
; w- ?6 q( m2 M0 [; ]3 N7 s
: {5 t; Q* Q! @+ @; v) x 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配8 o- n) A3 S8 o6 x' ?, x
2 z* K/ K7 Y& J4 R/ D7 J
3. ValueStack(struts2 的核心组件)
! N' T& o3 S6 I% K1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构- k% {! t/ q7 c) q
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack$ ]) l2 x. y8 x) T2 _
再实例化要访问的Action对象,然后将Action对象置于ValueStack$ t, X! G4 ^- v4 v4 r' J
的CompoundRoot栈的栈顶
! S; {7 m3 R o5 I7 U0 L# Z, V9 k9 ]; P! W
7 C B; _' J5 I. O. a- p0 p |
|