该用户从未签到
|
1. OGNL表达式的基本概念
: a% m& }. [4 Y9 W- m) U' MEL表达式
1 d2 M- o8 Q+ d& d8 a( K% Z用字符串的形式表示对对象(数据)的访问
# w- K+ S, a6 R! R: t. Y// 用代码的方式对数据访问:
1 w& r4 c$ S% f a$ j% u @Emp emp = request.getAttribute("emp");3 r, U/ C! f3 a q! M- F
String name = emp.getName();
& G5 V* ~3 | `7 Iout.println(name);
7 G3 W4 u# L' W& |) S0 n这种方式不太适合写在JSP页面中,不匹配!!!# u" [4 G& w. j) d2 N# b
<%for(...) {%>* L, X' k, D$ k& g& l
<html...>
7 P: P+ \/ ~/ l k# n<%}%> H6 H5 a0 k; F& q0 N
EL 字符串——对应数据访问代码
0 h9 U9 T/ P/ Q9 k9 q由JSP引擎实现转换工作' k8 p, K! ~% {2 D9 a: o! C/ j
${emp.name}
% w3 X" U$ ?& g- e; {5 T( k1 K, _- F! Y& ^* q. n8 L
OGNL和EL有着类似的实现原理7 d$ `+ |; Y: t8 Z
) H- k) J9 ` h# w/ m+ i) r9 j2. 常见的OGNL表达式
- ]* A' A" F5 P1) "属性名" (例如:name,id)
) T! P4 i3 n; C' c2) "数组属性[index]", "List属性[index]" (例如:empList[1])
+ H+ k/ b: Q) s: Y4 C# s8 _3) "Map属性['key']" (例如:map['three'])
7 G: @/ u* t9 l/ Z# k4) "属性名.属性名...." (例如: emp.name)2 P! X# z1 u* m2 u7 t1 I
5) "List属性.{属性}" (例如:empList.{salary})
D) N& f9 N, X* A! u/ l6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
+ D8 s" e, C" L8 Q7 {/ f7) "{元素1,元素2,元素3}"
k9 R) w3 c2 q! p G J8) "#{key1:value1,key2:value2,key3:value3}"
( N9 J) L& y1 ^: {( J' L9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)"); ^! |8 S) q$ Y% s2 Z- }1 r$ Y
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
. ^9 ?, U. h" C2 B- E% |" z11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
3 j5 ^& Q$ q) F8 G7 E: E5 g0 |' d2 {! i. Z9 L+ c
3. OGNL引擎
; Z; O: T5 c: E2 }( t OGNL------>ROOT(业务数据)
( T( a) h9 _' k9 h$ \ |
) E) t% j8 l, ^' X( P |------->Context(环境数据),Map (#key)2 s$ X4 b1 h( d" T7 r
2 b5 A2 u/ P. m4. XWork定制的OGNL引擎
* E% ]+ S: _9 e7 Q, O" o. bValueStack:
/ k7 W. s! C- o" e& L OGNL------>CompundROOT
. q) z( D7 N: |8 W) E) G0 f/ r | |____root0
h4 A$ r) q/ j H. V2 H | |____root1
' [( G( z, F- e! k6 A4 J9 [: z | |____root2
: g2 P% f) g. p. v4 \6 m | ....
6 e7 b$ V# ]8 N1 b3 e" s& N |
) P0 ^6 {6 u7 d# \ |/ l. }' \. ~6 }8 |; W
|
. Z0 p* J {$ a+ W |# ^( v. T6 D |------->Context(环境数据)
7 I |2 a: v# c ^
9 B: t- F. x1 W( G- ^ 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
4 f+ I$ x; F T$ d2 i+ T- I9 G+ l! ]* T3 @$ D
3. ValueStack(struts2 的核心组件)2 h& H. N2 V! [* H7 q
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
3 n7 T5 W+ b( G* p- y: o2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack; }+ _8 M" N, ~* g
再实例化要访问的Action对象,然后将Action对象置于ValueStack
( X" g# z4 n9 k0 O5 J; z. ^ 的CompoundRoot栈的栈顶
. }# U. [0 P% b O a
6 c1 Q( _; S( c' Q' w1 A7 O) `1 i5 u! Q
|
|