|
该用户从未签到
|
1. OGNL表达式的基本概念! |: H& {6 z- P# c f. h
EL表达式. p8 J" {, T4 B L: ]$ Y
用字符串的形式表示对对象(数据)的访问0 j y: N5 B8 I- g( j
// 用代码的方式对数据访问:
% ?8 v- i5 u" V0 Z) |Emp emp = request.getAttribute("emp");; A+ y+ K' \7 i+ H# ]! y3 Y4 ~: }
String name = emp.getName();8 |) D. z4 Y$ e
out.println(name);
, `! b( Q0 u& E这种方式不太适合写在JSP页面中,不匹配!!!
4 @4 ?9 [1 i N r; `<%for(...) {%>4 }( U5 u, V& |" J/ v
<html...>
$ T1 E* i/ j. d+ {+ r" D<%}%>. ^4 S* w; Z6 O
EL 字符串——对应数据访问代码# l$ Z$ r: t0 _! f5 Z: r; H5 M
由JSP引擎实现转换工作% X7 D% T! w0 l/ g) V0 T
${emp.name}3 J, e+ ^: n4 l0 p( @, L
3 E: H1 T" a5 j2 T) f1 d. v Y; S" j4 ROGNL和EL有着类似的实现原理
9 `' O/ e! n8 k0 ~8 R' a$ ]+ E W% f. m+ C. \8 n1 Z+ @
2. 常见的OGNL表达式 N0 B& F: S/ t, r( @
1) "属性名" (例如:name,id)
2 P2 V( Q+ ^. F2) "数组属性[index]", "List属性[index]" (例如:empList[1])/ g+ q! j, _. B! z- p
3) "Map属性['key']" (例如:map['three']). {1 k: r1 s# N: X. M- m
4) "属性名.属性名...." (例如: emp.name)
* X) ~6 R$ z1 d/ H* M5) "List属性.{属性}" (例如:empList.{salary})
5 }" q# v2 z* A# Y. ?6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
! k, y) A) p0 o* r* J* z7) "{元素1,元素2,元素3}"
1 @3 y% t2 `( j( k7 a8) "#{key1:value1,key2:value2,key3:value3}"
/ c- Q: ~5 A. k9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
4 c! Z$ e; j6 Z% s- i10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
/ a% ~0 b3 y$ C4 v11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
+ n5 F$ t$ S4 L& d% D2 D9 \! X4 H
5 C6 p* b& p L( h1 i# ~3. OGNL引擎9 [' ]7 e$ \; `
OGNL------>ROOT(业务数据)
/ x8 n3 F7 Y8 n' W |/ {- R* W4 F {3 q
|------->Context(环境数据),Map (#key)
/ j. r0 r3 u- M# ~- r( q8 ?( {
k F% u9 a" M5 M- Y# [" w- y" O4. XWork定制的OGNL引擎
' D* h; Y. S: D& S/ i. jValueStack:
0 h! D& r" q% L E3 } OGNL------>CompundROOT
* z+ \3 T/ z- v0 f | |____root0
% _4 i/ w9 t5 G8 s% q- C" |! z | |____root1
9 L+ s, t$ P8 |& `; V" U | |____root2
- {# p P8 K ^' I | ....
# {5 u( F9 s9 e( Q0 k' ^/ U |
2 B( j, K6 ?2 }: k5 ^ C( ~" M |/ Y' }% ]: F% [! [# N
|
8 t' Q/ s, g" G: ~8 ^ |------->Context(环境数据)
& P9 r1 H- q1 w' A: ]/ K( H' K, b/ s3 l7 J/ ]
对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
g" }1 l! N8 ]) H4 z. a! L+ J% x/ j. E; d$ o# u6 R" T+ S' Z
3. ValueStack(struts2 的核心组件)
& F4 B1 ]1 r. @. j+ t2 r1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
; I) [- \& p9 V2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack# @0 l( V. k) P9 k
再实例化要访问的Action对象,然后将Action对象置于ValueStack
- ~4 p* l$ @$ J$ x/ r% i0 s 的CompoundRoot栈的栈顶" x. B, A& x# B5 g1 |! V
6 d5 V- o$ ~' _9 Q
3 U, r* e2 E# W& |) t' g" e7 Q1 a |
|