该用户从未签到
|
1. OGNL表达式的基本概念9 F6 U% k8 c" a
EL表达式
# M g& j. c2 P; E* V用字符串的形式表示对对象(数据)的访问
; o/ W% \( A/ U2 [1 Q! Y7 U, l( ~// 用代码的方式对数据访问:: q, _3 c0 ^: X
Emp emp = request.getAttribute("emp");
$ _7 q+ i8 H' q; e- ?3 c9 o4 AString name = emp.getName();/ R$ M% K7 X6 Y' W3 f
out.println(name);
7 \2 }, t3 J/ a( o/ n这种方式不太适合写在JSP页面中,不匹配!!!2 n) P- n. J0 T, i9 l
<%for(...) {%>
4 }3 Y6 l5 ~) _; R<html...>3 p* A% T( L% t( f
<%}%>, a, w, a8 {7 C
EL 字符串——对应数据访问代码! P/ [0 |0 D: K
由JSP引擎实现转换工作! g& a8 x/ E9 H6 s. Q
${emp.name}" R8 r; C: T4 d* B9 G) \$ S
& K7 f& i% b$ s; E' T& c$ G- sOGNL和EL有着类似的实现原理: g+ A% G A/ g% }! ]
7 Y' Y, T( ~2 l& d6 r3 B4 X
2. 常见的OGNL表达式
% T7 F% e* T7 F3 _4 M1) "属性名" (例如:name,id)
& g) V" W) p3 n3 _/ X2) "数组属性[index]", "List属性[index]" (例如:empList[1])
1 n* W- \/ k z& \/ Z q l- p) j9 S3) "Map属性['key']" (例如:map['three'])# h* x3 b4 w' |& n+ h7 e4 t4 O
4) "属性名.属性名...." (例如: emp.name)
7 g3 k. o. d5 l. d3 V5) "List属性.{属性}" (例如:empList.{salary})
0 Y8 K3 _9 c8 C) W6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
* U' ], h; M5 S2 Y9 \& G" p. B/ T7) "{元素1,元素2,元素3}"( |, Y+ ~6 Y, b% E* W, C
8) "#{key1:value1,key2:value2,key3:value3}", }9 N( m6 S9 j/ ~$ h
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
1 F6 ]: u% J% T10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")- t8 l; x% `: P9 P* `6 [. p
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
. K4 _, V I P9 |
8 g- m4 e6 Q% V+ f+ H3. OGNL引擎
$ m8 `; M- Y' [( v; ?0 d+ G5 T OGNL------>ROOT(业务数据)
0 a; O$ A/ w7 {+ d1 K0 p |
% \- Q, p# ?5 p) v- W2 M' V/ |9 D |------->Context(环境数据),Map (#key)% T$ g$ }/ Z6 y C. b- r2 t
6 y5 T) A, u5 Y0 ?: C ] F
4. XWork定制的OGNL引擎
1 q! J2 s# E$ kValueStack:
7 C; K T9 G8 y" j+ c0 L OGNL------>CompundROOT: r3 M$ c: ~6 b( ^5 u1 }
| |____root0
8 P: D! i8 r4 `6 e, J | |____root1# _5 q/ F2 J' \* ~
| |____root2) c1 a! K O2 w2 c
| ....
5 Q9 c$ u7 j! V+ T0 @ |
' a7 A( a% y! m, B5 P |
( l- P+ P2 ?# [: C1 J |
2 V4 P# a/ W2 D" C |------->Context(环境数据)
4 {' Q/ r; ?6 T, E8 F5 {& t' {4 K- e; q6 M; i! i+ G6 L7 a7 i1 @; g2 a
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
# |0 \8 ~2 _4 V) w1 R" g
6 q# T l4 |; @, h; |+ V U3. ValueStack(struts2 的核心组件)- Z! I/ J9 o* K3 c3 ] i' u; b
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
, J& \; v4 h2 M1 W; ]6 ]6 @2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack* ]& K7 p0 ?+ o& y' x( d
再实例化要访问的Action对象,然后将Action对象置于ValueStack
5 h4 V3 I/ S# ?, d2 R+ A 的CompoundRoot栈的栈顶) b+ o% ~4 ^7 [( a
$ k& m. b9 l* T1 c0 f
2 \; U4 Y& O$ A; P |
|