|
该用户从未签到
|
1. OGNL表达式的基本概念, S9 v' @# r; i! |
EL表达式9 @$ Z. y- [3 m! Z
用字符串的形式表示对对象(数据)的访问9 U8 J* |! k. ?/ e( `
// 用代码的方式对数据访问:! _3 g$ A2 D0 o4 L6 T
Emp emp = request.getAttribute("emp");# @- S5 X6 w3 Z" a0 |+ L& O+ ^8 E
String name = emp.getName();
1 H G$ f3 L1 T" p8 dout.println(name);
# P2 |% P# y3 R* _- s& X这种方式不太适合写在JSP页面中,不匹配!!!0 w, j$ v$ N2 ^0 G# z- | j
<%for(...) {%>
8 V5 f8 e* a1 E<html...>
5 }% `! _1 S* k- O<%}%>. f+ [6 f8 t0 i7 t' e
EL 字符串——对应数据访问代码# Z) ^3 a& g+ t$ }; ?
由JSP引擎实现转换工作
% K1 b1 t9 ]5 D0 A" J${emp.name} X5 K$ G) x7 B. y
5 r7 i$ h+ X# j! |% T) E( U7 z ]
OGNL和EL有着类似的实现原理& M! |; |& x1 h5 A' G8 Y
, ? Y9 G: w) E, i5 N3 a$ y4 d# j( [2. 常见的OGNL表达式
1 z# G0 `/ R/ R1) "属性名" (例如:name,id)
6 E& D+ \, M9 z, S5 {& v9 Y2) "数组属性[index]", "List属性[index]" (例如:empList[1])/ M% {4 d, `. v6 V6 E
3) "Map属性['key']" (例如:map['three'])* |, ~( Y8 }" s1 V2 S& Y& W/ o
4) "属性名.属性名...." (例如: emp.name)* R" p' r4 U/ ^" W! F" i; R; f
5) "List属性.{属性}" (例如:empList.{salary})7 r( U" \2 A; M$ B
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})8 S$ d6 o& ^# m4 _* R
7) "{元素1,元素2,元素3}"
1 \2 ~. l, ~+ }6 [3 O5 h5 F( u8) "#{key1:value1,key2:value2,key3:value3}"
& B. ?5 n& I& Q7 k% m) c9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")
" W e1 O1 L: A, @% K& N' t10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")
2 D f/ _3 A' P& v11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")/ i1 i$ B1 A9 E; I9 ]
! J/ `* \( Q$ _" Y3. OGNL引擎5 U9 }" {# M( j9 F
OGNL------>ROOT(业务数据)
# U( k, X* }1 N& ? |. M0 }6 [! m3 f- n' r( z9 Q
|------->Context(环境数据),Map (#key)
# O+ c3 J3 _: F+ U' I5 c8 v+ L3 G; W+ J
4. XWork定制的OGNL引擎
/ d9 o5 T% R$ ^5 ]ValueStack:
8 x( O9 C5 J; s+ Z1 f OGNL------>CompundROOT6 n& D. ~6 W( n0 T7 @
| |____root03 {/ _2 y" T9 L1 k# b1 V+ V
| |____root1
# V/ Y! `3 _" z: {0 S4 B+ A | |____root2
, T# X! r& r' g+ ~+ ?' Z. }8 _ | ....! Z) m z$ H9 g( {
|
$ e( r, W/ T3 a' e5 f |7 x v8 e4 y4 O( E. K" A7 U
|
7 F! y* P( I% h6 z) h& r |------->Context(环境数据)
% g6 ^. P- L# y# W
8 G2 b2 ~# n4 ]0 H9 @% V, I. V 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配
' I' c6 K' N3 t# i% t d$ K- E- K% I" w* a2 r
3. ValueStack(struts2 的核心组件)5 E# ?: _& L" j9 e) `- A7 {
1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构% m4 o) {) N* C5 l V
2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack
: J1 @$ f- l7 C0 N+ {2 V" k 再实例化要访问的Action对象,然后将Action对象置于ValueStack
' ^& M. b2 S4 @$ S 的CompoundRoot栈的栈顶* C- m% Q* c/ j
% D0 z8 P! A; o! R7 {' \ J0 Y
|
|