该用户从未签到
|
1. OGNL表达式的基本概念% e- f( a1 F* s, ~3 r
EL表达式7 K: {: z! h9 c( w
用字符串的形式表示对对象(数据)的访问
* a) ^# x1 w0 \5 u0 q// 用代码的方式对数据访问:
; M( g- ^6 J" Z7 c9 U6 _5 fEmp emp = request.getAttribute("emp");. H! b3 {9 Y7 d0 P+ b5 }
String name = emp.getName();
8 ^5 Q' l7 ]8 q( Rout.println(name);
2 j3 F' i! l( L8 k P; t. `这种方式不太适合写在JSP页面中,不匹配!!!
4 x1 n) S& i+ }# w3 Y<%for(...) {%>( B6 Z: w* |+ b$ D" C8 y1 \
<html...>
4 M$ P! A& [! }8 K8 \<%}%>1 N' K( q2 b* F; @4 Y% ^( l& Z
EL 字符串——对应数据访问代码
' R7 h3 Q1 ]" K6 J: ^+ E' M. D' Q7 e. f由JSP引擎实现转换工作) V, M f$ C* Y8 i- d/ h% G3 |
${emp.name}! ]9 \6 }& p: i' {' q* ^% z
; {; |, g; ~# S% T- f$ H& SOGNL和EL有着类似的实现原理
& [& \- `9 r( {/ [4 a- b- a q
4 C1 P# q' o1 T2 S b! J4 w2. 常见的OGNL表达式
1 }* B. W# F5 r# _; H; e1) "属性名" (例如:name,id)
9 j0 v$ C* c. n5 t5 D7 p2) "数组属性[index]", "List属性[index]" (例如:empList[1])9 ]) d) ~- F- D. f
3) "Map属性['key']" (例如:map['three'])
7 U k% S2 Q+ s9 B2 |7 W9 N& z4) "属性名.属性名...." (例如: emp.name)7 E2 D2 e7 c& {. e+ J0 g: ^: u! S
5) "List属性.{属性}" (例如:empList.{salary})
+ ~% s4 \! @5 `2 c6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})0 c9 X4 c$ e' E9 x: M! H
7) "{元素1,元素2,元素3}"
9 h ?4 p& @1 E$ ]0 B; F2 z3 v8) "#{key1:value1,key2:value2,key3:value3}"
Z+ {3 S/ C3 k3 z8 X5 P9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)"); `) t1 ?$ d* k6 x3 X2 d; z
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2"), b9 m+ E1 k6 C5 _; v2 N' U% M
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
" `; `& U# v& m( X
" W9 X2 C# p4 y) K' ^" T3. OGNL引擎
: h: O3 o# c6 @8 c) ~ OGNL------>ROOT(业务数据)
5 R6 O: [) T# _ |6 H4 n8 L5 R) ^' Z' p
|------->Context(环境数据),Map (#key)
R' a8 ^: X$ P" w# [" f0 {# }0 q7 f5 I3 `3 D8 t4 M- q, v/ K) ]& \' ^
4. XWork定制的OGNL引擎0 L+ h; T% [8 h5 \8 i$ N
ValueStack:
A9 a f& }. O4 T2 M OGNL------>CompundROOT1 v8 g _) y8 g
| |____root05 U/ E. B/ h- L& m# t5 Z
| |____root1
- \6 `9 R5 ]' ~& y H1 j | |____root2( ~% ?2 X% k6 n
| ....2 m) T8 h2 M Q. X1 i. E' R0 t
|
$ [" E# O- {& @( Z4 n6 j |
3 N6 J; w; l! } O. f8 C$ d |$ {. Q) U0 e7 `; a# T) o$ W
|------->Context(环境数据)
7 a- ?+ O. f* M6 k& U9 ^' `! n- Z9 y
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配. {7 y' L ?/ L) K- y- l8 H4 Q" K
9 W6 W- [1 |8 q$ J& d$ l3 T
3. ValueStack(struts2 的核心组件)
" j$ ?9 q/ n( P" N1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构/ W$ {/ d- E% Z# W6 |
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack9 F+ ~8 Q5 \# t; C+ x9 c( A
再实例化要访问的Action对象,然后将Action对象置于ValueStack: D3 f( o3 `6 M0 m) O
的CompoundRoot栈的栈顶9 p- q2 a2 o4 g7 C8 e+ J! M$ m0 b
: w5 k% B& _4 J d. S4 g- g0 ]" X# T, M( }& p5 b
|
|