该用户从未签到
|
1. OGNL表达式的基本概念5 @ K' v2 r1 ?0 }& K9 p4 d3 X: J
EL表达式
% s1 U) u- X+ v6 {3 E. m; E用字符串的形式表示对对象(数据)的访问5 s O) B+ B- _0 z
// 用代码的方式对数据访问:
/ u9 b. X, F/ X1 ]Emp emp = request.getAttribute("emp");
! L) Y. r( X" e" |3 pString name = emp.getName();, E) d6 x" o" P) A
out.println(name);7 o$ W W+ w O0 s0 Z( ?
这种方式不太适合写在JSP页面中,不匹配!!!, [" v4 V4 ? ]. _! y {, d
<%for(...) {%>. [+ X- ~- e. D9 w1 ?1 n8 V2 o
<html...>
% P9 ~9 W1 X2 i; e) D; E<%}%>0 t7 p5 N" R7 r5 T, ^- h2 l
EL 字符串——对应数据访问代码5 Z2 n) }- P$ b4 J: k' r0 H& Q
由JSP引擎实现转换工作
, q% h5 C% y1 _& |$ i${emp.name}
/ f- M# M5 a. u5 a9 s" a: c( s x0 C/ Z- y, [
OGNL和EL有着类似的实现原理
% Z) U: N6 U. X% H0 n- N( T. M2 p) J. l) n, b6 U
2. 常见的OGNL表达式' N+ [4 c8 c f/ f
1) "属性名" (例如:name,id)- M3 g, D. m$ E% r# ?% [
2) "数组属性[index]", "List属性[index]" (例如:empList[1])/ W: I/ R- I# ] ]
3) "Map属性['key']" (例如:map['three'])
: u9 z7 R' u8 L& M4) "属性名.属性名...." (例如: emp.name)
9 ~% u) v* w" r( \0 l" v4 P5) "List属性.{属性}" (例如:empList.{salary}) B- f) N( ]* U
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})/ |+ @* y# c; D" {* U0 w" ~% q
7) "{元素1,元素2,元素3}"
5 Z8 x* k7 M/ {9 {# \8) "#{key1:value1,key2:value2,key3:value3}"
3 |4 Y# P8 G' X9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")( g3 Q+ p& u' l R
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")$ B$ {1 |" X6 P& Q3 Y8 f4 x
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
+ @) A/ s) \# Q- N! H: J9 V& j% d0 B
3. OGNL引擎* K2 k4 i5 L- x$ m* P+ A
OGNL------>ROOT(业务数据)
7 _' g1 o* N1 m |+ K* s5 R; z' d' F4 A
|------->Context(环境数据),Map (#key) z0 p8 D8 A" ^, i( V. }5 _, r
8 W1 G6 A1 D7 G' _& t
4. XWork定制的OGNL引擎
2 u/ r% z6 c# @( H+ |; H+ v- ~, ~/ yValueStack:
& s: ]& G' H1 \5 s+ X OGNL------>CompundROOT3 O7 S; Q5 x. l: B
| |____root0
" c" r7 y4 p0 m- S | |____root10 I! K" h8 {, `3 E
| |____root2
& O: L e' @: ? T4 {' P) d | ....* V$ l/ O) L- i/ Q z ~2 Y( ]0 T
|
; {! o q4 a( r0 x" g, | |
0 ?3 t: J! G+ I) { |
& ]9 f5 o) v: y% y- t6 J) j |------->Context(环境数据)
% Z! L- N- D' j1 r3 E1 k/ t; m/ \8 S0 M
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
( ?/ v$ f" Z/ ?1 {1 C) n) B: b8 C" [: x. [9 Y
3. ValueStack(struts2 的核心组件)
1 t9 [2 o5 h. ?7 m# \1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
1 M+ _' `+ n/ B2 D6 g8 t s, ^2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
, B" W$ v4 n( A6 x3 O 再实例化要访问的Action对象,然后将Action对象置于ValueStack
, m6 t$ e4 L3 o9 Q# W0 a$ X: D5 { 的CompoundRoot栈的栈顶% k% x& w; m+ }3 m, ]1 I$ i
: W0 i" g% L1 W H. \' T* C% Y& u% R9 z2 h+ L6 P
|
|