|
该用户从未签到
|
1. OGNL表达式的基本概念
# _; E5 I4 v: R% d S& `EL表达式9 c O# O' _; \, Y, f1 g+ O/ m! W
用字符串的形式表示对对象(数据)的访问
* V& _+ Z) s, F( A, X. [1 @9 l9 v// 用代码的方式对数据访问:
J( t* |7 @& j% QEmp emp = request.getAttribute("emp");! `& O2 z7 p; L0 P& j( g- ]' u
String name = emp.getName();
; Y* K- Z: q( l4 g+ W8 s/ ^out.println(name);+ L+ W% K, Y+ l' }* `. S2 k
这种方式不太适合写在JSP页面中,不匹配!!!; ?" y. Q: z! ~
<%for(...) {%>
0 n; J( b2 v. {0 w# s3 S1 E" R<html...>8 v0 Q) c/ V6 \/ a2 L) A! E
<%}%>
: n5 S* X1 ]3 W) x2 jEL 字符串——对应数据访问代码
! X0 Y2 q2 D# O1 J0 i( b1 I由JSP引擎实现转换工作3 @" L: A9 f) F7 u6 X- S1 i
${emp.name}
0 N A" r! @- c: h( d* l( o6 n4 `- N
OGNL和EL有着类似的实现原理 Y4 j& d9 e! m: y
) E% a$ e; }6 {% O1 _
2. 常见的OGNL表达式
8 Z+ Y+ J3 ]% ]6 F0 q# I* R+ U1) "属性名" (例如:name,id)
* |/ z% q8 B8 ? Y n/ q' z w2) "数组属性[index]", "List属性[index]" (例如:empList[1])6 a3 }$ o) ^7 x6 a* `* b$ g/ s5 |
3) "Map属性['key']" (例如:map['three'])
8 T/ d s7 Z) y8 b) u0 N9 I4) "属性名.属性名...." (例如: emp.name): w, x! l& w$ Q! }
5) "List属性.{属性}" (例如:empList.{salary})9 R: H5 U( W8 N% Z, @& j, x# ^, ?* }
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
/ [( G2 f- P6 n+ g+ M7) "{元素1,元素2,元素3}"
4 V$ d, N' x# S5 X6 A/ b8) "#{key1:value1,key2:value2,key3:value3}"
& X Q, j& R* L" i9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")5 Q/ H4 h0 Y1 `4 v% @. k
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
" K/ v7 j8 @, x9 X$ }, k- r11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
9 z0 J0 A- B) A* ?3 A
" O) j4 D+ `" P. p6 n3. OGNL引擎! p+ h2 S s' @$ ]
OGNL------>ROOT(业务数据)
5 p: z: k. y5 p |" m9 ?8 \; o' T2 E5 F) n
|------->Context(环境数据),Map (#key)
# r# x7 \! _$ O6 q- }9 p: W% g/ I: z/ f4 E+ h! b1 D
4. XWork定制的OGNL引擎1 s7 T7 S9 K! K5 q9 }+ W
ValueStack:% w" Q. u# Z8 T |+ Y% e. Z& z
OGNL------>CompundROOT9 E' z- d7 C7 o, E
| |____root0
5 y! N4 I6 I7 E& K$ B" Z# k | |____root1
6 F: `5 ?1 f1 b2 o8 } | |____root2
+ G( l9 _- G2 q+ w | ....
3 P! ?, Z) o, h2 x* l( S | y4 ]" n2 T7 s; v6 s* q
|
2 D1 T o9 e/ } |7 a/ `4 M/ @/ ^/ e( ^
|------->Context(环境数据)/ D V: @" r* b$ x
% e9 O& e/ w+ z8 l5 Z0 ]9 {
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
, ]. J$ f% g( }8 \; O0 |
; D# [/ f% g8 O R5 ^% U3. ValueStack(struts2 的核心组件)# [+ {( e6 f! L; p) t _
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
4 Q$ G" l: J; s1 P! C2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
0 L6 M6 d1 Q7 ? W' E: { 再实例化要访问的Action对象,然后将Action对象置于ValueStack5 Z' q8 x. t3 D6 O: I
的CompoundRoot栈的栈顶1 c9 T9 W# W. ?; n
# a, P/ h2 f7 \$ v2 \1 ]
0 l8 B% Z6 C, o( M' C
|
|