该用户从未签到
|
1. OGNL表达式的基本概念5 p: M* p5 M7 g3 k# x* F
EL表达式- S& D9 M5 P( Z
用字符串的形式表示对对象(数据)的访问8 l- T3 f5 j( _3 X4 t* G
// 用代码的方式对数据访问:
6 h! e9 b6 z# YEmp emp = request.getAttribute("emp");4 |; k2 F. \& t, b% c
String name = emp.getName();% x* h6 S$ ?& m
out.println(name);8 I2 F) ~- `) ?
这种方式不太适合写在JSP页面中,不匹配!!!% }9 v5 z1 [9 Z+ J( ^* E# M3 i
<%for(...) {%>
- O; Y/ \+ k& t. `<html...>8 C$ j' X8 p/ W+ T0 A& k. u
<%}%>4 n/ ]9 l8 T+ b. J7 Y6 N# z2 `
EL 字符串——对应数据访问代码
+ n3 S& |) p6 Z& i由JSP引擎实现转换工作. Q" S, G; x y4 U* ~% Q* w- f
${emp.name}" v2 Q8 _) @, f# d
: Y7 F/ q; F8 P) A# U1 NOGNL和EL有着类似的实现原理9 H) J, y5 J4 j# v7 F; Z- } H
! w+ f' E8 b% S. g) b2. 常见的OGNL表达式
, ^( D- ^3 n$ W% J! w1 t G1) "属性名" (例如:name,id)/ F P n1 B+ j$ p9 G' H
2) "数组属性[index]", "List属性[index]" (例如:empList[1])) B8 t4 F% k) X& ^' r, O: [
3) "Map属性['key']" (例如:map['three'])
6 Z: C9 t4 @0 `" C1 n4) "属性名.属性名...." (例如: emp.name)- ^9 U5 S. n9 M% Q7 P" m
5) "List属性.{属性}" (例如:empList.{salary})4 ]; V0 K8 @5 I& T% V0 M& j! f
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
3 E8 T! D# C- \* |/ t/ P! ~7) "{元素1,元素2,元素3}"
: k8 ]! U# a `6 R* [$ N* D# |8) "#{key1:value1,key2:value2,key3:value3}"
3 P; i$ X5 L* p) n) E5 l9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")5 h6 a5 {4 Q+ M4 ?: w" X H
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")5 H' _8 m, g$ _7 s/ S3 i% q
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
6 l, V! [5 R9 A1 k* p& c, S0 y5 e4 U, V* T# q7 I1 u
3. OGNL引擎
! T! S+ |" n! q' Z5 y OGNL------>ROOT(业务数据)
4 F( m- [5 d5 W( Z! v% ~ |
1 {0 J# X# R/ p. s' y w( O |------->Context(环境数据),Map (#key)
: H0 @. c: P, K3 T9 o, {% h8 d! R: `8 G" ?. ]! b d* z* W
4. XWork定制的OGNL引擎) Z+ Q7 G- U: x" ~1 c& P/ ?$ F/ p
ValueStack:' g9 {" K/ \ f9 |$ G: t6 R% }# P5 q
OGNL------>CompundROOT& F0 a: K; p Y6 h6 w4 ^
| |____root0
5 v# R! a" I# L! [& Z | |____root1
/ J8 n1 i! z# c: J. _/ B | |____root2
- w: Q2 C' X; s+ s/ g: V( f2 j | ..... j V3 D7 @* y9 |2 j
|6 k. ?8 J& J w% C" ~* i
|! y. J7 T2 ]9 W6 X" h" q0 r; b! w
|
/ _1 j4 ?& i1 {( T/ W9 O5 P) o [: X |------->Context(环境数据)0 A, ]' [" `- T$ M
3 H1 M7 n# N6 x- Q8 F( ] 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配5 k! N* f9 L/ P/ Z9 M
; n+ G9 Z0 D# l. `9 A+ @7 @3. ValueStack(struts2 的核心组件)
1 E; A3 _+ S0 F; g1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
5 e" m& p8 d) o( }3 `; F2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack1 [$ ^) L" y0 r/ h1 _) W
再实例化要访问的Action对象,然后将Action对象置于ValueStack
# V+ n7 }7 C, ]; ?, x 的CompoundRoot栈的栈顶+ q! z/ ?; | {( @: P6 T6 g+ @
2 t K& @# ~" ~3 h
, a B) p7 c! s, N5 j# [ |
|