该用户从未签到
|
1. OGNL表达式的基本概念
0 H V3 Z8 X# O. WEL表达式
# G% D6 |) _" |用字符串的形式表示对对象(数据)的访问
$ y, B2 x& O" P! H- e// 用代码的方式对数据访问:
% J3 m$ W- f0 i8 b; \2 s- `2 u* LEmp emp = request.getAttribute("emp");& T5 I& H! u9 b8 |+ C L! V
String name = emp.getName();
% I% @+ c" F+ q4 R' vout.println(name);0 v2 G$ ]+ R2 q, z! f
这种方式不太适合写在JSP页面中,不匹配!!!/ x6 d& C7 `. `. q8 X% t
<%for(...) {%>
+ i) u( Z" ^) T+ r<html...>4 u2 c. E$ E$ j u% s" |; m
<%}%>
! W. U9 {, V: L5 MEL 字符串——对应数据访问代码
`6 |' N/ j1 k, a6 f$ D& b. S; p% l由JSP引擎实现转换工作* ?0 @5 {0 l. B6 W% ?& q& s
${emp.name} [ R+ p" F+ U6 O1 y# J9 W. j
* k- m2 v6 Z* j3 f* S$ \
OGNL和EL有着类似的实现原理( c; \! Z6 g# m( H/ g
: [3 |5 a- {, a$ O; [
2. 常见的OGNL表达式
1 _5 l! z, M' j1) "属性名" (例如:name,id). l+ h/ \. u0 ?8 J) S( @4 ]
2) "数组属性[index]", "List属性[index]" (例如:empList[1])6 y% L4 ]9 M0 k( U& y8 }) p
3) "Map属性['key']" (例如:map['three'])/ l' v2 z0 Q" p" y- K% Y9 m9 m1 w
4) "属性名.属性名...." (例如: emp.name)& V7 O0 |% }) I( P
5) "List属性.{属性}" (例如:empList.{salary})) x; S H9 L/ X- V; G: c" A0 d" h
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
+ K0 @' R4 z R* J5 V% p F7) "{元素1,元素2,元素3}"
" s: }$ o% ]& U9 h8) "#{key1:value1,key2:value2,key3:value3}"+ s/ [5 {0 b+ Y$ h, G
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")6 w4 `* m) {7 l! U6 m( e1 W/ o
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
9 S- F; e1 y: g0 a- }" ]11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")" {, h V, t$ |6 p
% x" V' E# B6 w q* o1 Y' }3 E- a
3. OGNL引擎 v( I4 K d0 ]# I! q$ A
OGNL------>ROOT(业务数据)
$ H* I9 K2 Q$ f7 {4 ~5 D* L& [ |+ d( l0 Q1 w! N" O' z
|------->Context(环境数据),Map (#key)2 S: `7 l. E, u4 D$ [
2 u- x) H$ S7 n8 Q
4. XWork定制的OGNL引擎- H' C* v* S3 S8 C5 F$ d
ValueStack:
+ q' Z* d3 ^) T- `+ Q! @- | OGNL------>CompundROOT
* E0 |. ]* ~9 ?7 R7 A' J | |____root0
) ^4 a' z; g% J$ ?! U Q | |____root1
B0 q% B V! a | |____root2* o. Z- y9 t M2 S
| ....
6 d! K; m/ K( h8 O. ^' w: C |
1 J; ~) c l; k6 S# |2 B |8 S9 @1 U' \) R( j- L& s Y) l
|# c* R4 p, X- N% x0 @1 z) t
|------->Context(环境数据)
4 ^8 d8 K" u6 R) m5 Y) y! a8 x/ m/ w: |5 p: u- E9 Q- D
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配" ]0 ^3 l7 m& m+ Q
- n; A" b' z9 B) \2 T- _( v
3. ValueStack(struts2 的核心组件)
4 W8 X& q4 R' t4 j& c1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
5 r8 \2 m- s+ Q- T3 i2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack# ~ A* I( L X0 [7 i2 l6 a
再实例化要访问的Action对象,然后将Action对象置于ValueStack+ Q B* P N6 y8 @" g8 @2 l1 L6 A/ `
的CompoundRoot栈的栈顶
. x) Z) ~& L. F2 E9 Z3 m/ B, `$ n* {3 K" y
: W Y8 E+ s) s* r% P
|
|