该用户从未签到
|
1. OGNL表达式的基本概念& Y- |6 v! g! ~, _
EL表达式
' V7 t }* z( W3 K, z" K用字符串的形式表示对对象(数据)的访问
0 ^) M! M8 y1 K# l6 U// 用代码的方式对数据访问:
* m7 y' j( U3 n1 {( FEmp emp = request.getAttribute("emp");0 t/ W. s5 X. ?3 ?0 E
String name = emp.getName();
6 a8 ~& V: u* Uout.println(name);
! [7 m3 U* C6 M7 @' S9 _& ^这种方式不太适合写在JSP页面中,不匹配!!!
1 A6 X7 m& g# U: X$ e<%for(...) {%>6 w" t2 l; M9 ?/ v5 S Y
<html...>
5 L. B* P3 c6 d6 K3 l/ G<%}%>$ w& k0 q9 z. Y' V" O& Q
EL 字符串——对应数据访问代码" w5 C5 n+ T% _* V/ u" Q8 ?$ Z- [
由JSP引擎实现转换工作
* t9 G( Q8 Z9 k${emp.name}% {2 O, q4 H7 e
/ x- f7 t# S0 ~# UOGNL和EL有着类似的实现原理
) K3 J( M' y6 Y" a3 [; D+ s4 q9 O# J6 r& P4 W, k
2. 常见的OGNL表达式; D! \8 x1 w4 T4 w7 Z- H) S
1) "属性名" (例如:name,id)
. p+ X0 e% r) G+ [2) "数组属性[index]", "List属性[index]" (例如:empList[1])
0 d$ y7 @+ j- T) I a8 P) v3) "Map属性['key']" (例如:map['three'])! E3 `) V0 H. `- m
4) "属性名.属性名...." (例如: emp.name)
3 }2 B! C* [' e5) "List属性.{属性}" (例如:empList.{salary})
$ l. ]/ q! {: y6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})3 q) C; m& G2 J
7) "{元素1,元素2,元素3}"
$ D# G3 c3 ^: o5 ]8) "#{key1:value1,key2:value2,key3:value3}"5 O B4 a; @& C7 g- h
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
# Q- A; V' c# H/ [7 f) q- O10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")% \ r3 ?$ S: z6 b
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")6 a1 F2 v- P0 w* q' H. h
; M. x; y% z# Y5 h% B) m3. OGNL引擎9 j6 w X9 O" A( r( q- P
OGNL------>ROOT(业务数据)
" K, Q' {8 K, S1 Z- o |5 Y) q' c: u# `, u
|------->Context(环境数据),Map (#key)4 f* [( }( [8 Q) M: I* p! W
* m L- ?, K. s! P; Y5 H* s# u0 p" f4. XWork定制的OGNL引擎
' s* s5 s3 Y& Q, v, _8 ]ValueStack:) v4 P: g$ b9 m! ~+ N: e# ?
OGNL------>CompundROOT7 U7 Z' O% s( v/ i* R# x/ a
| |____root0
# O. J* h& Z+ X* X+ n( S | |____root1+ y Y9 I# R; O$ K
| |____root2
* M: M5 U% q# b. Y6 U$ F- V | .... C3 Z' d0 k8 Q9 b/ q2 f
|4 g5 S% ]/ u! T# q! E) |/ B+ k/ f6 x
|
% t4 W: U- F. Y |* ?+ q5 j; S+ o& O8 Q3 P3 M
|------->Context(环境数据); d; z0 \) L1 W6 c
y T$ m+ Q9 b9 z
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
$ |- r; [5 d2 L. f d1 P- W" S! I* s% w+ F
3. ValueStack(struts2 的核心组件)
5 h- k- J- I/ q( W6 ~1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
2 r% i( t9 Q9 \2 Z, ]3 m, _, `2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
+ ~5 K+ L0 I& n, t) y 再实例化要访问的Action对象,然后将Action对象置于ValueStack
6 h( X7 Q! U5 l7 B. A; c q 的CompoundRoot栈的栈顶& ~ S. ~) U* j7 |/ G j
q2 n$ g1 c# r& f9 v; @
% y9 E0 d" @1 i( N0 f l |
|