|
该用户从未签到
|
1. OGNL表达式的基本概念
8 _1 ?0 R. P {EL表达式
1 N/ s* r3 B9 Y) z1 `/ Q4 E5 y用字符串的形式表示对对象(数据)的访问& K( |- P' C3 s0 W8 A
// 用代码的方式对数据访问:
- g! X( s. U& p/ f; ?Emp emp = request.getAttribute("emp"); k9 t3 m5 c1 a# W* I! W: k0 h
String name = emp.getName();
8 J3 g4 M' y6 u lout.println(name);9 L: h2 y* ^* H
这种方式不太适合写在JSP页面中,不匹配!!!, x @& ]/ z" y1 I" G6 B* T
<%for(...) {%>
3 l7 Y# C. @( m% r* E<html...>
5 b+ A8 m* X$ o! v( l2 K* _<%}%> z5 M& r4 x: A$ X$ Q/ Q
EL 字符串——对应数据访问代码, B9 P b) D" u5 z- M5 a
由JSP引擎实现转换工作 g" \. O. E$ r1 t) G7 a
${emp.name}
# I( [( @9 t) x* a0 c6 @" I- j* Q$ B. I4 h; e, t
OGNL和EL有着类似的实现原理 T G% Q! a- L
6 S" u# Q' p# T1 i( `. r" _
2. 常见的OGNL表达式
' p9 j: d# j) |1 h! n1) "属性名" (例如:name,id)
% @; L9 I1 ^3 w# K2) "数组属性[index]", "List属性[index]" (例如:empList[1])
: E# k( M3 P0 P3 G4 c- s9 H- S; r6 R3) "Map属性['key']" (例如:map['three'])7 O; V- {% U: N
4) "属性名.属性名...." (例如: emp.name)
1 R3 o- D/ [% h7 j/ X1 g3 w' o3 T) S3 T5) "List属性.{属性}" (例如:empList.{salary})2 J P+ }. ~8 t! m/ H0 M* v
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000}): W4 C7 K/ l. w4 _9 s
7) "{元素1,元素2,元素3}"# |3 F3 U4 R, }
8) "#{key1:value1,key2:value2,key3:value3}"( Y& j* H6 |0 n1 w- D
9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")& Y7 H/ {# e% D4 J8 G; ^
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2"), ~2 e/ A9 W2 E, I0 r0 e
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
) n3 f" b5 X2 |
1 K% Q7 O1 K: X* L: b& J6 f2 I3. OGNL引擎1 K# l0 l! ?. C5 s# u& m* t8 ?$ R0 ^
OGNL------>ROOT(业务数据)+ _9 ?: H+ h) A% n$ [3 u* j3 m2 O
|
8 q7 V" o( Y( o; I' X! D |------->Context(环境数据),Map (#key)
* n* `, A( G& c0 T! Q+ }: f
* u1 ]1 n2 b% j0 V; H I4. XWork定制的OGNL引擎) w3 Z- i" g. V, @4 S
ValueStack:
/ V# C* B% ]$ O+ f- r OGNL------>CompundROOT
+ n3 Y# ~# J! x* F6 Z8 T- T/ l | |____root0
4 F: b& L- y! h' A' C, X | |____root1: F) V' B" d4 x X, w
| |____root25 I! s: C S* a: [: e- g
| ....5 u6 M9 K/ Y+ W/ Q+ P- e
|
I4 R; R& x" g2 | |4 D0 X/ H! P: x4 c9 s% B
|5 ~' }* D5 e1 Y; F6 e1 W
|------->Context(环境数据)' _' @% y& t9 ?- A4 x, @
1 \ c! Z: d- C" @; K5 @ 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
+ c4 Q, L& t, g g, k* K5 g$ y: I3 a
3. ValueStack(struts2 的核心组件)
7 Z ^ r6 I: _! K/ o6 C, ?4 d* e1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
. u% ^! m' a& i4 l5 x2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
" i+ J: f4 w5 [& P. q1 x/ a' D 再实例化要访问的Action对象,然后将Action对象置于ValueStack
3 A8 W* B! s& P& }6 ? 的CompoundRoot栈的栈顶
" u/ u4 `/ Z/ K$ j. f( U) u: N: v8 t9 a2 S( F A% m
9 L+ F5 \, ^( h8 k' N
|
|