该用户从未签到
|
1. OGNL表达式的基本概念
8 g( b/ C" ?# R1 P; Y* R$ IEL表达式
: S5 |5 U( g$ Q% v' t% J5 _用字符串的形式表示对对象(数据)的访问
$ q% E V1 }. a) B/ w, Y! W$ b// 用代码的方式对数据访问:
* x, v. W( G, y/ b" x! n) EEmp emp = request.getAttribute("emp");
2 T; J3 r& \+ x' Z( ]String name = emp.getName();& Q( x3 {( Y4 r+ N) ?3 q
out.println(name);" s; w! G* V- M: O! K
这种方式不太适合写在JSP页面中,不匹配!!!( J4 M. u' j- ]# C& n' n
<%for(...) {%>
7 n y: X( K4 v" e<html...>, Q! |& B$ i# Q, |0 v4 F% e6 L* h7 v4 l# B
<%}%>
) f' V; \" r, @- ~' V# }" N" IEL 字符串——对应数据访问代码
# s5 x {7 K" E# W) _由JSP引擎实现转换工作
* w* L$ M' J! h# I2 D- J${emp.name}
, B2 y1 c) s( I: X1 {# u/ T
: w1 ?# g% T4 t5 P# UOGNL和EL有着类似的实现原理, V1 M- v8 C5 d. r+ O1 I
2 O3 C( `! i! F! `. a2. 常见的OGNL表达式
$ g+ A! c) `( K* c# X, S1) "属性名" (例如:name,id)
( s. c' `8 v; b4 O) C- F* l2) "数组属性[index]", "List属性[index]" (例如:empList[1])' K" E! V# Y( h# U7 Y; l
3) "Map属性['key']" (例如:map['three'])" |% A5 A" ^" r. S" S6 L' h
4) "属性名.属性名...." (例如: emp.name)8 Q1 b N% A. T }/ _/ l
5) "List属性.{属性}" (例如:empList.{salary})! f* M$ E1 I- ^8 t, R2 f
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000}), a# Q* y2 ~( b$ w% x% ~ \
7) "{元素1,元素2,元素3}"' q7 e2 ]2 f& z( S- }: Z k2 t1 \/ P
8) "#{key1:value1,key2:value2,key3:value3}"
* [% |* o( l' @* r( B9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")' g( U0 \6 e6 l1 n5 \3 x
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
: b( Q& u& {. W9 u$ Q* U11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")+ V; z" t* h0 Z
( C: K& u7 |% i4 e& ~
3. OGNL引擎, k7 c9 `2 `9 z X H" d" ]
OGNL------>ROOT(业务数据)
* L9 t% {2 o% f |
1 F: }7 Y" }* P5 J |------->Context(环境数据),Map (#key)
0 l' R+ r5 i) f7 v5 [9 m# i+ I+ w# S
, X6 k0 d/ g* \, Z8 M3 W/ @( n" l4. XWork定制的OGNL引擎
9 e9 H A! A% H- O* YValueStack:
/ O; Y9 \9 O1 P3 I- ? OGNL------>CompundROOT
" c& j; z8 z8 L6 Z, M" f$ M1 N | |____root0
) L% B( x! u. d( U$ U; w# b8 w | |____root10 G' k$ F' p6 l! z% |2 N" H
| |____root2
: ?# y) W0 {4 n% W, Q | ....
( {! a1 b# V1 N2 U k |6 v( B( G B5 J
|' H* a4 f" U, W% h4 {! V8 _1 k
|* i& t; N( }9 y& D1 t
|------->Context(环境数据)
9 u) \, M6 X: J% H! @. T, r$ G
! S1 R% X& p& u* [ 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
% J0 i% ~6 }& [! `# q; g* X& F7 b; H
3. ValueStack(struts2 的核心组件), M: {) m/ v$ ?# g u- `
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构2 J' \$ {6 E* e: f1 u
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack! a% @- g% N5 Q- q" x- X0 ^0 a# i
再实例化要访问的Action对象,然后将Action对象置于ValueStack
& Y8 [! t- {6 m& c- M, W! i% L 的CompoundRoot栈的栈顶
! H" X' F) V/ U! g- w& h* C3 c; B
( w$ a; J- \& ]' I' T
|
|