该用户从未签到
|
1. OGNL表达式的基本概念* @! n3 V9 ~ @7 }' d6 W' d! V
EL表达式& N- @$ ~ M6 ^8 W9 S U5 G& k- \
用字符串的形式表示对对象(数据)的访问
& s( R1 X$ V. U// 用代码的方式对数据访问:
+ ~' F- r% U# E: s W9 u- }4 yEmp emp = request.getAttribute("emp");
2 Y$ @& O2 {4 l* }0 bString name = emp.getName();
; z% j( X# v7 {% o3 Aout.println(name);; s$ ?4 U/ y) p3 Y
这种方式不太适合写在JSP页面中,不匹配!!!! I8 H5 }, c9 v+ k! o0 |, h" P
<%for(...) {%>! u* G ~) J5 Z; T7 M7 G5 W
<html...>
/ r, _8 P0 M% I( V) L3 s* y! L<%}%>
, O. u! z) S4 m7 u0 V/ TEL 字符串——对应数据访问代码0 s- v" p0 V4 f# S" g& N; x3 M
由JSP引擎实现转换工作
: P$ [, E& K9 _${emp.name}
9 ?$ r0 k5 H5 P
/ N9 ^! s, A+ x$ z O& v0 y8 ?$ T3 JOGNL和EL有着类似的实现原理
3 M t% j$ c/ N5 r
3 S) U( K6 L6 j2. 常见的OGNL表达式# O" J7 Y3 ]# G1 a9 D
1) "属性名" (例如:name,id)
; G. U5 U" t0 i. }) M5 I v2) "数组属性[index]", "List属性[index]" (例如:empList[1])
) F5 h6 t# Y: B# s3) "Map属性['key']" (例如:map['three']); z$ {( x& X# @
4) "属性名.属性名...." (例如: emp.name)
, g( B$ y% _9 J4 O y5) "List属性.{属性}" (例如:empList.{salary})6 _" D& p$ B) p! x
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
9 R4 {5 T N" S: ]7) "{元素1,元素2,元素3}"
) V" G" b/ u; w% I8) "#{key1:value1,key2:value2,key3:value3}"& M7 J, f9 q9 \' _/ ^
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")7 B5 P" t! P8 ^. ?. z
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")9 W. [' T8 g# g+ {8 C( Q$ n
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)"), W# _1 E& b) J& ]0 z
5 O0 k0 R+ b& c6 Z
3. OGNL引擎
b2 q O* D, H! z. T OGNL------>ROOT(业务数据)
$ o9 L4 y5 v( y- F |4 R; n m' x, a. G, t, L
|------->Context(环境数据),Map (#key) R1 ^0 |9 e K9 N& f3 H0 E
3 W6 h6 f, ~5 a
4. XWork定制的OGNL引擎
* }# `. x1 Y% g8 t; [0 d5 C9 LValueStack:
% |: f* Q8 I* O0 i& p" t4 M OGNL------>CompundROOT0 h! W# y: M! B! Y; c, |
| |____root0+ M" {7 }1 S( p: ]
| |____root16 p9 R! ~( ~+ J- N- m6 ]
| |____root2
- Q2 t4 z3 C# Q! f* [ | ..... F( p" U: J' @
|/ g, e5 V, ~9 l1 o' e
|. T+ Q/ W8 p6 ^# p/ j0 x
|
" p3 _( q( H6 |+ L) L; G; w4 J9 Q |------->Context(环境数据)
) Y% w; _& x. V/ v9 ^& H8 y: X- ~& P7 _6 V3 c, R6 E" s6 X, v# l
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配) n5 M5 _, z+ S7 f4 Z1 q2 O
2 I8 w% z9 j+ k2 O3. ValueStack(struts2 的核心组件)2 m8 X) S8 Y* I O
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
% }- W6 f0 `; \3 ]. {) n2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack, Q7 g' s# X; ?3 @' x
再实例化要访问的Action对象,然后将Action对象置于ValueStack
) @/ ]& S/ |$ {4 M6 G& w 的CompoundRoot栈的栈顶8 x6 w, W6 u: a- {% r6 [
+ t. D2 M) q& f2 \/ N% i- A
+ H6 v7 p. m' ^* H
|
|