|
该用户从未签到
|
1. OGNL表达式的基本概念
9 t- |. h( b$ ^5 mEL表达式
* B' v) Z% ?# Q2 R: V& R9 t' A, f用字符串的形式表示对对象(数据)的访问$ [% l+ e' g) m0 v! h9 |2 c2 z- g
// 用代码的方式对数据访问:
4 Z& h# n, \3 W) pEmp emp = request.getAttribute("emp");9 z3 R# n" ~( O0 y7 u" w/ I0 [# I
String name = emp.getName();
: J7 `# l0 Z$ F# i' yout.println(name);6 p: P: m* l/ J; G+ \
这种方式不太适合写在JSP页面中,不匹配!!!0 U& A" u, B. F7 [/ s# z( \5 v& E N
<%for(...) {%>4 `4 `# E* s; {) S
<html...>9 U$ U' G- O* Z) r
<%}%>
/ i' h, }, r1 @4 [( p! [; uEL 字符串——对应数据访问代码1 w: Q& d7 ]) Y- j# O$ p% X
由JSP引擎实现转换工作$ [# c( E2 i8 { o/ {: _8 P# O
${emp.name}& ]8 H# K% O3 ^% `- {) E
9 D9 }3 u# Q$ x! P+ mOGNL和EL有着类似的实现原理
: ?' d. ]0 }: L5 t+ u- ?7 q. Z
( H0 ]" i/ o& Z& I' f- \: L- v2. 常见的OGNL表达式
0 ^" V: y+ c* m. W1) "属性名" (例如:name,id)
& B# M4 q' N% P% s; w! {2) "数组属性[index]", "List属性[index]" (例如:empList[1])( M$ Q7 _) \8 z- y2 h- s/ [. X
3) "Map属性['key']" (例如:map['three'])( i4 h- q1 V; d* j) S% L
4) "属性名.属性名...." (例如: emp.name)
( X. H- l. i, \0 w% O9 ?5) "List属性.{属性}" (例如:empList.{salary})
2 F6 z! j* a5 s6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})& i/ B- c+ R% g& w/ o) E* O
7) "{元素1,元素2,元素3}"
6 W' R x8 h+ o$ N8) "#{key1:value1,key2:value2,key3:value3}"+ @/ h7 {4 W% U" \% v. q
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")) m2 ~# A# y* p6 i( v) d# q
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")8 b/ L! L; \" C5 t4 a4 \/ `3 H
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
. F; o. j7 I0 M7 X3 ^1 b0 t6 a" L4 i/ v5 K& D
3. OGNL引擎; Z" k4 x+ z4 t, s; Z
OGNL------>ROOT(业务数据)
5 C1 Y% q n: d2 P |. u) `/ c G* P5 M' E' J
|------->Context(环境数据),Map (#key)) S0 _ B, w: i: g" c5 B$ T
" b/ b$ K7 n, K2 @3 }4. XWork定制的OGNL引擎
- i% Z* z$ c% ?& \; X* zValueStack:. U9 n" h) _* |: A4 s; ], l
OGNL------>CompundROOT
6 B7 `. R: ~+ V) | | |____root0 J" ~5 g, g+ b, @+ p0 _' P2 p5 D; @1 D
| |____root1
( L1 {7 P! C8 Z3 m- y | |____root2$ }$ m% y/ {7 t$ M* t( O
| ....
# Y7 u: g% F0 d l8 Z3 S |
4 X1 L m% \1 g- O' ^ |
2 H: j& k8 j/ E o& m) F |
; y. ?% A& p7 r0 h b5 x+ l6 x2 ^! t |------->Context(环境数据)3 x" [$ x$ I* X( r T: C& s0 s" V
: k4 _$ H! t: B$ {+ I" \1 Q( e, n3 b
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配4 E# y8 l# a3 b5 m7 Q5 k7 r
5 M* D$ d/ x& P4 E l# N6 ]
3. ValueStack(struts2 的核心组件)- Y: }( w3 ~. R0 v* M! e3 c, l; r8 Q
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构$ Z/ {- e, I& U& ]& J4 f
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack u% @7 @- u1 ^3 A1 R1 ?, I) \5 w: A
再实例化要访问的Action对象,然后将Action对象置于ValueStack" ^" X% J, o2 H0 A2 o0 }
的CompoundRoot栈的栈顶0 c0 ]8 p2 P; U+ q9 J
* Q7 o* x3 B* ^. b1 R3 D
7 S. u7 q9 C" _: k1 r8 n, Z |
|