|
该用户从未签到
|
1. OGNL表达式的基本概念
2 E9 V3 W6 ? X2 z) PEL表达式
# b3 d) S, Y% _1 ^用字符串的形式表示对对象(数据)的访问
9 C* d5 u" v4 i7 ^" a4 I; A// 用代码的方式对数据访问:. B3 V. k1 z6 f+ q& I
Emp emp = request.getAttribute("emp");) U# O# W0 Z) V7 }: E, P
String name = emp.getName();
2 S5 O/ P+ w5 c0 Bout.println(name);' P4 p K e8 U: r4 X
这种方式不太适合写在JSP页面中,不匹配!!!$ Q. o; v" B# O
<%for(...) {%>0 m, E" N. e1 E/ Y
<html...>; C6 N3 c! ]" ^
<%}%>
6 B) q/ u* G# B' ^7 e' t' @EL 字符串——对应数据访问代码" p. N6 y* i2 |" j+ j
由JSP引擎实现转换工作
& R9 {" M2 A8 A3 S( F7 o${emp.name}
% S( N& P( m1 c$ Q7 }
5 b2 q: ]+ k; f; b/ W5 y, ^OGNL和EL有着类似的实现原理. H4 x! e7 @9 {! U) E$ z
) j/ w- ? w* o; x6 ?$ r0 e
2. 常见的OGNL表达式
" w. s5 y4 d" \; q/ ~) `$ G6 [) G1) "属性名" (例如:name,id)
+ }" P) i/ f$ {! S @4 A" M- y2) "数组属性[index]", "List属性[index]" (例如:empList[1]) _ D) O8 E D
3) "Map属性['key']" (例如:map['three'])
# C$ r W! @- F% M1 {. s+ ]4) "属性名.属性名...." (例如: emp.name)
& z. h7 u0 p7 T5) "List属性.{属性}" (例如:empList.{salary})5 m0 |$ E% X# E' w7 l; l
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})# `/ x6 n$ f) h. l& T
7) "{元素1,元素2,元素3}"; u9 @$ _( _ ~/ q6 y& w0 J2 k
8) "#{key1:value1,key2:value2,key3:value3}"
8 `- y$ s3 Y% S$ J' `$ z% x9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
( T J W- R0 e/ |" A10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")5 d5 x% [) U- ^
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")( ?1 v4 l& X$ `1 n& X) K
: B& m9 S3 L* A$ O3. OGNL引擎; o9 C C2 S, {. V
OGNL------>ROOT(业务数据)! u% x" t5 o6 ?% i2 f
|
% p3 v% I+ b) N* F: X9 O! {2 ^& i% I |------->Context(环境数据),Map (#key)
$ P0 @4 H9 r K8 O' A5 h: s' O" o4 m& d4 o, r8 a
4. XWork定制的OGNL引擎
+ T7 n9 y8 V8 }# N! ?& K) SValueStack:
) E6 s) q: x6 R0 t. S OGNL------>CompundROOT
/ y" b5 _5 ?& C8 D+ y. B! I | |____root0
" F% S! F7 t- ~# |. T | |____root1
r# z1 h: N# W9 O. f- O& i" Z | |____root2$ W7 S# K2 p6 r; Y$ A: r6 N
| ....
' o" J; ]2 ^3 L$ g' U |
" N4 ^+ s; @) w9 \ |; }8 `7 u3 K; }! d& x3 _: n
|
4 `0 @& i) R9 S7 n3 x6 T$ [3 y8 b0 s |------->Context(环境数据)
6 a; a' L& u) S# U& z
% K4 ?( n! z! H0 g, i$ Y, K 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配8 A" i! \# \/ [. o; s9 ]7 j
5 F% E' w- b7 B" k6 k! H3. ValueStack(struts2 的核心组件)
2 a; }( C R W- m4 v1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
- A2 D- S5 y, A* G# L1 }2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
( ^8 C, m5 R+ j 再实例化要访问的Action对象,然后将Action对象置于ValueStack: R6 u/ s* K5 t; W; y
的CompoundRoot栈的栈顶
& Q V3 k* O2 d8 T& ]. c6 z+ H: l2 h& w4 N) b2 h X" _
! p) z+ p( H. Q. y
|
|