该用户从未签到
|
1. OGNL表达式的基本概念
: Y8 _" h- u! ]7 FEL表达式$ x5 z% C! U2 U- [( j9 |$ }
用字符串的形式表示对对象(数据)的访问
5 U! T0 q; M' w& ?' n. ~// 用代码的方式对数据访问:- Z1 `3 M- f/ u" z. F5 g6 w$ q* _
Emp emp = request.getAttribute("emp");
7 l* T( z' t) H' l4 d4 ? jString name = emp.getName();/ m% U* U' _- ^% h; `7 Q% j9 }
out.println(name);" S* u, R4 D% E5 g8 K8 w* K; R
这种方式不太适合写在JSP页面中,不匹配!!!/ v3 f! n% Y) [% u% J6 o/ t0 p6 z+ m
<%for(...) {%>/ v1 k& g2 ]/ T( [3 K3 C, G2 T
<html...># b$ D! r% l$ F9 h& s# n
<%}%>) ]5 b. X$ }5 {1 Z
EL 字符串——对应数据访问代码" a, ~' V. b* q2 B: R l0 W+ l
由JSP引擎实现转换工作
4 G/ p' y8 f+ n1 x${emp.name}$ i& W# s/ _! Z0 [# n
M! k9 K$ F O) V! n
OGNL和EL有着类似的实现原理2 D8 p$ Q1 { Q
V: D4 `) B- I! b; I2 V2. 常见的OGNL表达式2 Z w7 a1 h1 z* w: f6 n
1) "属性名" (例如:name,id)
; F6 u" t y" E: A( J% @, ^2) "数组属性[index]", "List属性[index]" (例如:empList[1])' {( q7 L/ k2 a- q5 k
3) "Map属性['key']" (例如:map['three'])
0 i Z5 s' t# A* N. I6 k4) "属性名.属性名...." (例如: emp.name)
( G8 [9 j3 |1 x) _: ^) V" o; o' e5) "List属性.{属性}" (例如:empList.{salary}) h6 r( o0 n D' K
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})8 Q$ _ W( n# _3 O. o) R! v
7) "{元素1,元素2,元素3}"
+ m$ |* a; k0 f% [) C8) "#{key1:value1,key2:value2,key3:value3}"
- ^ V! t8 H) m, D: n5 N. r5 V9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")+ ~" e( p4 K* b1 K+ P
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")% A* d! X' T, c4 z c* f" j% u/ `
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
7 j) ^6 J. v3 e% l- |% w I9 A' H! n, F: S& c' H
3. OGNL引擎) ?8 l: T. C6 J" u. T* w: |; d5 C
OGNL------>ROOT(业务数据)8 T Y" c" r* M& ], U0 a
|' f0 M4 ]5 k# L; \' H7 L
|------->Context(环境数据),Map (#key). g9 q; u! k/ N. T( J3 v" H
: Q" \) I P9 Q# G/ ~4. XWork定制的OGNL引擎, V$ |7 I/ J( J+ e
ValueStack:
! w8 [. p2 A& T OGNL------>CompundROOT1 { L& a2 t( y" ?
| |____root0
8 J4 u4 C5 a7 ? | |____root1, r: [8 ~( x# `* c5 f, n) W0 L
| |____root2
/ e0 s1 e# w3 h, W5 d% H, u+ ? y; Y | ...., B9 K7 V8 E1 U
|3 a* \- d5 K# y! c( g0 q: U; q
|! |. f; X* u- t+ g6 ]* k& W
|3 p$ j6 M# x. N& c S, b1 \( x7 A
|------->Context(环境数据)9 K3 T, U, _" F. [, J
& y# n; M, Q7 n1 E 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
{8 ]0 D% I- k0 |1 K, O+ o- ~5 g3 a" c
3. ValueStack(struts2 的核心组件)* G% d/ c2 B, z
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构 ]% n( B8 {7 z& d- {
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack6 }4 o2 b2 I/ I* A M0 [, G5 k
再实例化要访问的Action对象,然后将Action对象置于ValueStack' G# E3 l% r6 N$ v2 r5 y0 g5 X5 f8 V
的CompoundRoot栈的栈顶( f+ b& H* ^/ B$ D# _& u
# j. p$ T# [4 G& d
( u8 k) c# J& P+ E( F* k9 g! E |
|