该用户从未签到
|
1. OGNL表达式的基本概念
5 G) X/ J C+ h: o5 s" PEL表达式" l; H0 f: q# v9 n; S$ X+ t
用字符串的形式表示对对象(数据)的访问
& u; D' D0 ?) z6 _/ u5 G# |5 S, h// 用代码的方式对数据访问:0 M1 R U$ {+ D0 L0 J6 m
Emp emp = request.getAttribute("emp");. ?( _: G* H, U
String name = emp.getName();
9 J' }* m1 d6 p6 N0 r! ~out.println(name);; q0 A. T6 I5 f) S4 z" D( g
这种方式不太适合写在JSP页面中,不匹配!!!
5 H2 O8 ]; Y1 h! D1 M& C& p% v% N<%for(...) {%>' e8 F) r! d6 N r' w2 a* h
<html...>+ C- b1 C( _ k% Z0 Y. [
<%}%>
9 H* X y( s" g4 N, y5 fEL 字符串——对应数据访问代码0 |% Q$ I6 V- s2 ^1 H$ ]
由JSP引擎实现转换工作
# E6 `6 }: l, @9 T2 F: g4 _% `${emp.name}
3 I5 P; v) i8 G
+ A. C5 b4 A; H5 w7 a2 YOGNL和EL有着类似的实现原理8 ~ |) @3 v- f. S
* R1 d) t7 ^- |7 Q
2. 常见的OGNL表达式
2 F/ p1 u# b; Z1 f4 H `7 W7 k1) "属性名" (例如:name,id)
% i d. K. P Y5 c2) "数组属性[index]", "List属性[index]" (例如:empList[1])- V1 y) ~1 j3 n& B3 `; s: `! ?. |4 U+ {
3) "Map属性['key']" (例如:map['three'])
& d6 |1 X" h3 {* t4) "属性名.属性名...." (例如: emp.name)& W0 r4 Q" ~3 E, Y, f" }& O
5) "List属性.{属性}" (例如:empList.{salary})
/ U* a$ ^$ Q" j6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})8 Y# p! {' k, O1 \/ u ]
7) "{元素1,元素2,元素3}"7 Y4 q3 c) l8 W ]1 {
8) "#{key1:value1,key2:value2,key3:value3}"
8 r0 z( S# c4 e& F9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
- \3 s. t2 H! y% ]& u10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
; M$ _4 @9 Q# @11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")% A* P% C' ]/ F+ B( n" d
# I$ t+ H0 _- D3. OGNL引擎
$ z: f/ R; U0 h4 _8 u, _ OGNL------>ROOT(业务数据)
9 r/ u5 ^) C3 ^: L; L |
" q$ I& U9 C) Z |------->Context(环境数据),Map (#key)# f$ T3 O b; t; Z/ u2 ~! R% i* r
7 b/ A+ |, x/ F4. XWork定制的OGNL引擎
4 e6 g& T% O0 Z+ QValueStack:. k0 u+ d& S& h6 k- i" i
OGNL------>CompundROOT+ V( x: M7 t/ n' B: C6 O$ X
| |____root00 Q- p& D/ P1 @6 e- U( g2 f. c- j: J
| |____root1
0 H- H# K* G; {4 M; J) w- } | |____root23 w' W' e% o9 _: E
| ....6 I+ c# q2 Q! z0 U% h
|
; M0 J8 L1 l6 b |
5 E- _% | H4 P5 V$ `% g; B |
T% L9 V& t' Z" [, J |------->Context(环境数据)6 E% s' c8 t0 L& u/ j
) ?6 E- r( z3 }
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配5 K& h+ {) w; J9 o* c7 [- M
0 t+ d3 f% t. \
3. ValueStack(struts2 的核心组件)
7 _! m9 h% ], c( r1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
. T# C. C* U! E" a& l: W! M2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
6 c# V# F' l- l- M! G 再实例化要访问的Action对象,然后将Action对象置于ValueStack" \2 M, `5 z8 v: n1 m
的CompoundRoot栈的栈顶
3 z! O2 |( [. j( Z Q& X: ~1 R9 P; }) Q( C3 c) i* a
/ k! n4 x+ a/ ]
|
|