该用户从未签到
|
1. OGNL表达式的基本概念
5 F8 E; R$ w; dEL表达式
5 Z9 x, J6 Q6 V% I用字符串的形式表示对对象(数据)的访问: o$ r5 N# G l1 d
// 用代码的方式对数据访问:; L; [$ e) \+ f) ~0 R$ u' A
Emp emp = request.getAttribute("emp");
/ u5 i- o9 b$ }' z* t0 L7 PString name = emp.getName();8 k, h# J8 b6 g6 D, T" t
out.println(name);1 d3 M( Z/ {6 z& u
这种方式不太适合写在JSP页面中,不匹配!!!
3 x2 D2 l8 h1 n! _; H: ^<%for(...) {%>
t$ ^) M: E, t<html...>& \ M: u7 q, H
<%}%>1 C" H; C9 P1 h% `
EL 字符串——对应数据访问代码
# d7 w4 j% b- C由JSP引擎实现转换工作# Z' h# S2 j1 Z( g1 Y& o3 T
${emp.name}
3 I$ G+ t0 s9 k( o
6 b5 r( C, J+ z" p, r# G G0 p9 xOGNL和EL有着类似的实现原理
+ ]4 a5 p. A+ y" |0 q
4 B, P- f! E; P m2. 常见的OGNL表达式
# S y6 ]) _/ g$ H( d2 r1) "属性名" (例如:name,id)
5 o% W% z# V S" _6 |( f2) "数组属性[index]", "List属性[index]" (例如:empList[1])
3 H7 q5 C% ^: o5 }3) "Map属性['key']" (例如:map['three'])
4 L! u/ f0 Y( G3 h- c4) "属性名.属性名...." (例如: emp.name)2 I% z& t: T+ z1 `" T' s4 U
5) "List属性.{属性}" (例如:empList.{salary})! S, \+ i9 b$ b8 b
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})5 Z( [, G/ c0 S
7) "{元素1,元素2,元素3}"# u& G% U: _$ Y; O
8) "#{key1:value1,key2:value2,key3:value3}"0 Z) l) W3 i# r4 j0 s+ \, D
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")2 m+ a- m5 ^' c' H. X. t" C
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2") Q" j% k4 @- J! I! { _
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")$ j; M; a- O& X' K' e H6 ~
" I5 e/ }9 r4 i% S3. OGNL引擎
, {2 S, q; f- g OGNL------>ROOT(业务数据)2 o$ D: J) T9 ~7 L7 b" P
|' ]* ~! W2 K' X; b
|------->Context(环境数据),Map (#key)
) F7 A9 ^% q0 k9 q
, c( G6 k8 o" e0 q" F+ t% R4. XWork定制的OGNL引擎3 R$ [- g1 Z6 R/ A$ y
ValueStack:' d; \7 @, V) p( U1 j$ N5 m. ^
OGNL------>CompundROOT9 T! g! k( ?5 x+ H
| |____root0. a2 G" N" o3 G
| |____root1$ }+ ~" `+ {3 B7 N0 ^
| |____root2/ N5 D* A3 ?3 k7 J# @& ^
| ....
- D; W4 M( S& L* ~7 Z4 A |
! j. o3 {( `2 C @ | x. |$ }/ J/ _: u: C# I
|
0 C7 T5 y, x6 T# u, Q- D5 Q |------->Context(环境数据)
# @# N& H( B$ V8 k, b" t
5 X% e% Z- I/ m/ w; l1 ]2 g 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配% ]6 G' t- H# T7 y
7 ~5 q# Y/ K1 Y3 g8 n3. ValueStack(struts2 的核心组件)* o/ ], m. W6 D. r* k! p
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
+ L5 D; D% P2 j, r2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack5 k& q1 E' ?1 H7 u6 G
再实例化要访问的Action对象,然后将Action对象置于ValueStack
% S* j( J$ z4 V" D 的CompoundRoot栈的栈顶, i6 V% |4 H8 A% ?
/ s, M$ U. C( m8 Z# W7 }) v& h- i! A4 V( F+ ~, X
|
|