我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > OGNL和EL有着类似的实现原理
总共48087条微博

动态微博

查看: 1764|回复: 0

OGNL和EL有着类似的实现原理

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2014-05-19 21:19:59 |只看该作者 |倒序浏览
1. OGNL表达式的基本概念5 p: M* p5 M7 g3 k# x* F
EL表达式- S& D9 M5 P( Z
用字符串的形式表示对对象(数据)的访问8 l- T3 f5 j( _3 X4 t* G
// 用代码的方式对数据访问:
6 h! e9 b6 z# YEmp emp = request.getAttribute("emp");4 |; k2 F. \& t, b% c
String name = emp.getName();% x* h6 S$ ?& m
out.println(name);8 I2 F) ~- `) ?
这种方式不太适合写在JSP页面中,不匹配!!!% }9 v5 z1 [9 Z+ J( ^* E# M3 i
<%for(...) {%>
- O; Y/ \+ k& t. `<html...>8 C$ j' X8 p/ W+ T0 A& k. u
<%}%>4 n/ ]9 l8 T+ b. J7 Y6 N# z2 `
EL 字符串——对应数据访问代码
+ n3 S& |) p6 Z& i由JSP引擎实现转换工作. Q" S, G; x  y4 U* ~% Q* w- f
${emp.name}" v2 Q8 _) @, f# d

: Y7 F/ q; F8 P) A# U1 NOGNL和EL有着类似的实现原理9 H) J, y5 J4 j# v7 F; Z- }  H

! w+ f' E8 b% S. g) b2. 常见的OGNL表达式
, ^( D- ^3 n$ W% J! w1 t  G1) "属性名" (例如:name,id)/ F  P  n1 B+ j$ p9 G' H
2) "数组属性[index]",  "List属性[index]" (例如:empList[1])) B8 t4 F% k) X& ^' r, O: [
3) "Map属性['key']" (例如:map['three'])
6 Z: C9 t4 @0 `" C1 n4) "属性名.属性名...." (例如: emp.name)- ^9 U5 S. n9 M% Q7 P" m
5) "List属性.{属性}" (例如:empList.{salary})4 ]; V0 K8 @5 I& T% V0 M& j! f
6) "List属性.{?#this.属性条件...} (例如:empList.{?#this.salary>12000})
3 E8 T! D# C- \* |/ t/ P! ~7) "{元素1,元素2,元素3}"
: k8 ]! U# a  `6 R* [$ N* D# |8) "#{key1:value1,key2:value2,key3:value3}"
3 P; i$ X5 L* p) n) E5 l9) 方法调用 (例如:"name.toUpperCase()", "list[2].indexOf(name)")5 h6 a5 {4 Q+ M4 ?: w" X  H
10) 基本运算 (例如:"age > 18", "salary + 1000", "number % 2")5 H' _8 m, g$ _7 s/ S3 i% q
11) 静态方法调用 (例如:"@java.lang.Math@round(salary)")
6 l, V! [5 R9 A1 k* p& c, S0 y5 e4 U, V* T# q7 I1 u
3. OGNL引擎
! T! S+ |" n! q' Z5 y OGNL------>ROOT(业务数据)
4 F( m- [5 d5 W( Z! v% ~     |
1 {0 J# X# R/ p. s' y  w( O     |------->Context(环境数据),Map (#key)
: H0 @. c: P, K3 T9 o, {% h8 d! R: `8 G" ?. ]! b  d* z* W
4. XWork定制的OGNL引擎) Z+ Q7 G- U: x" ~1 c& P/ ?$ F/ p
ValueStack:' g9 {" K/ \  f9 |$ G: t6 R% }# P5 q
OGNL------>CompundROOT& F0 a: K; p  Y6 h6 w4 ^
     |                  |____root0
5 v# R! a" I# L! [& Z     |                  |____root1
/ J8 n1 i! z# c: J. _/ B     |                  |____root2
- w: Q2 C' X; s+ s/ g: V( f2 j     |                   ..... j  V3 D7 @* y9 |2 j
     |6 k. ?8 J& J  w% C" ~* i
     |! y. J7 T2 ]9 W6 X" h" q0 r; b! w
     |
/ _1 j4 ?& i1 {( T/ W9 O5 P) o  [: X     |------->Context(环境数据)0 A, ]' [" `- T$ M

3 H1 M7 n# N6 x- Q8 F( ] 对于访问Root的OGNL表达式,会CompundROOT栈顶开始依次匹配5 k! N* f9 L/ P/ Z9 M

; n+ G9 Z0 D# l. `9 A+ @7 @3. ValueStack(struts2 的核心组件)
1 E; A3 _+ S0 F; g1) ValueStack是Struts2的核心组件,为其他组件提供共享的数据结构
5 e" m& p8 d) o( }3 `; F2) Struts2的FC每收到一个请求时,会先初始化一个ValueStack1 [$ ^) L" y0 r/ h1 _) W
   再实例化要访问的Action对象,然后将Action对象置于ValueStack
# V+ n7 }7 C, ]; ?, x   的CompoundRoot栈的栈顶+ q! z/ ?; |  {( @: P6 T6 g+ @
2 t  K& @# ~" ~3 h

, a  B) p7 c! s, N5 j# [

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表