该用户从未签到
|
1. OGNL表达式的基本概念
$ o+ _3 c# R E# M- n8 zEL表达式
& J, b! o7 w+ o! g用字符串的形式表示对对象(数据)的访问
* Q# J5 ]2 D5 U- f// 用代码的方式对数据访问:
' X- \6 K' N' w( \& dEmp emp = request.getAttribute("emp");
- [% T& p# R9 }# [1 j$ M0 wString name = emp.getName();
1 q: [0 b* `) Z' r* q9 G1 v* |out.println(name);
. i: D) G' S, S, l这种方式不太适合写在JSP页面中,不匹配!!!
- L! |" \ P6 X: C( N<%for(...) {%>
$ |( ?; ^( _8 K6 r5 h( l<html...>
" C) m" v4 J: r7 i<%}%>
j& P9 |8 e7 P2 @8 l+ ~3 M: vEL 字符串——对应数据访问代码
" w, l" P6 J8 X- p' Q由JSP引擎实现转换工作1 k0 m. T3 Q" x z( m
${emp.name}6 l- Q; B' R: L5 q, b: J
: H9 C! s# J; o4 h9 F2 ^8 z
OGNL和EL有着类似的实现原理7 @0 G1 C3 M! V2 A& Z; r8 L
- _, U3 Z8 ^7 P8 U6 u0 p
2. 常见的OGNL表达式
) j! `$ T6 a& m: [, F/ A1) "属性名" (例如:name,id)
* f. [7 V5 v0 i$ l2 ^2) "数组属性[index]", "List属性[index]" (例如:empList[1])
; K) L1 \$ T7 ]- K3) "Map属性['key']" (例如:map['three'])
) S* O2 e7 k" H% [4 Y4) "属性名.属性名...." (例如: emp.name). e$ }1 ~. q2 z+ W3 F# `$ }
5) "List属性.{属性}" (例如:empList.{salary})
- \/ {$ l+ z1 V( ]+ I6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})3 |: w4 Z/ n- S) v0 U7 |, I
7) "{元素1,元素2,元素3}": n& |# z5 `. s( S( T
8) "#{key1:value1,key2:value2,key3:value3}"# z1 n1 [, |' C' V- ^$ I
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
# Q$ ^% E7 x3 C5 e, r: S10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")4 J! T; W. d4 u& Q0 W
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
% j5 n! m% F: w Y8 c2 O5 N9 p" K3 n3 Q4 Z! @, d
3. OGNL引擎
7 t* w9 r2 D9 q' ~0 H9 k OGNL------>ROOT(业务数据)
3 R0 o" w4 x' L" \ |
+ R5 @* F4 \- l7 M8 F$ j0 X |------->Context(环境数据),Map (#key) K; O% i" R6 m' ~# x
) k' B! X: B* A- ~7 C& ~) H4. XWork定制的OGNL引擎
( |+ w! B; Q6 t* b& {7 JValueStack: j: p" ]0 f9 a; v3 ?
OGNL------>CompundROOT
) u1 n7 ~8 o9 `7 N | |____root0
, t1 c* P9 n; t2 D | |____root1
% m+ w" Z; h9 N( g* o4 T | |____root2
8 k& S4 r3 ^; }8 g5 k | ....
4 d3 b0 j" W. t' Z! j |
J- F) i+ p9 Z8 p: i/ c |
3 {) d: o; D0 Q2 t3 {; l |
% N4 w [: K% U0 [0 O6 S$ R |------->Context(环境数据) @* |- f% b2 Q5 Z1 y
4 Y' G2 S- }0 e 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
! g1 Q- ]7 i7 u) G* }3 t
7 s; k7 \8 h: \( ?% u3. ValueStack(struts2 的核心组件)
# k5 ~6 |& V7 r( v1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构) z, I- X" R; x5 a
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack% b+ I* O7 Q6 B0 m. z
再实例化要访问的Action对象,然后将Action对象置于ValueStack
1 e- A' u# E1 B1 d8 `6 H8 e 的CompoundRoot栈的栈顶
) J9 p5 }1 z) a: ?2 O$ d6 \' i
( o: C: P7 [1 G3 Q6 {9 w# `; [/ [) L: B- d; [+ e
|
|