博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EL与OGNL以及值栈的理解
阅读量:6939 次
发布时间:2019-06-27

本文共 1372 字,大约阅读时间需要 4 分钟。

这里先添加下在项目遇到的问题:

这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到。

困扰了许久:

总结如下:

(1)每个action对应相应页面的值栈中值的获取,在属于此action的页面上面如果采用OGNL或者EL表达式获取的值都是从此action中获取的。不要将action对应的页面搞乱了

(2)关于EL表达式获取值栈中心的:map和对象栈stack中的值的获取方式:对于两者的获取方式都是${}这种方式,不分#的。

(3)jsp页面的参数获取的形式:

    举个例子:

对于struts标签内的OGNL表达式获取对象的值或者属性,比如user:前后什么都没有,是采用findValue()的查找顺序:它在值栈中的查找顺序是:先找stack(对象栈中一般model放最顶上,然后下面是action),再找map。

#user,这种方式的取值是从map中获取值,只要有#的就从map中取。

那么:struts的标签内部是这样获取的,那么EL表达式为什么也能获取到值栈中的值的呢?

首先我们看下EL表达式的查询顺序:它是按照jsp作用域的由小到大查找的:page--request--session--application这个顺序。

但是在struts2的对象栈中,如果想获取对象的值也是可以的,这是是struts2的功能强大之处:当使用了struts2之后,它对request对象进行重写,也就是说有了struts2,EL表达式的查找顺序也有所变化:

page ---request----添加了findValue这个查找(即从值栈中获取值)----session----application

这就是为什么我们在页面使用EL表达式也能获取值栈中的对象的值。

 

总结添加:EL表达式可以用在普通的HTML标签内部。但是在struts2的标签内部(记住这是标签内部)只能用OGNL表达式或者加了#map中取或者不加#从stack中取。

              如果用EL表达式,一般不用写struts的标签,即标签体和EL表达式分开使用。有Struts2的标签,就在内部使用OGNL表示。

可以直接在html标签的标签体使用EL表达式。

 

   

值栈问题:struts2的值栈分值和栈,即map类型的数据和存放在栈里面的数据。

 

ModelDriven的源码:它会将model放在对象栈的栈顶。

 

从上面,我们看到值栈里面存在着数据中心,里面有些页面传递过来的数据。作用范围:是一个请求,request

那么如何从struts2的数据中心获取数据呢,即jsp页面如何获取这值栈里面的数据呢。

jsp页面获取值栈中心的数据:利用OGNL或者EL表达式获取。

 

OGNL表达式:

 

获取map的数据用“#”

OGNL的格式和语法:

有时候如果是表达式的时候,可以不写%{}

对象栈中有默认的搜索行为:所有有时候直接写对象栈中的属性即可,即从对象栈中获取:

 

若我们从数据库中获取了数据,得向页面传送,这个时候,我们先将数据存放到值栈中,然后jsp页面再从值栈获取

 

 

 EL表达式:

EL表达式用${}

 

改为这个EL表达式的格式:数据也可以从值栈中获取;用的是struts2包装了的request对象

封装的源码:

 

 

查找顺序:

request中找不到,就从值栈中找。

 

 

转载地址:http://dhfnl.baihongyu.com/

你可能感兴趣的文章
检验重复字母代码
查看>>
[训练日志] 7月22-31日
查看>>
Html转义字符列表
查看>>
Hadoop之Storm命令
查看>>
模板的那些事
查看>>
Ajax方式上传文件报错"Uncaught TypeError: Illegal invocation"
查看>>
android touch screen keyboard input移植记录
查看>>
java操作elasticsearch实现query String
查看>>
iOS开发 - OC - block的详解 - 深入篇
查看>>
保利入驻宜昌 外来大咖谁更靠谱
查看>>
11.15日工作总结(补)
查看>>
(转)Spring读书笔记-----Spring的Bean之Bean的基本概念
查看>>
Python_面向对象_类1
查看>>
设计模式-简单工厂模式
查看>>
[TJOI2019]甲苯先生的滚榜——非旋转treap
查看>>
编译器中代码自动对齐快捷键
查看>>
选项卡jQuery(ele).each()
查看>>
【原】Linux find 命令整理
查看>>
Memcache
查看>>
Python 3下Matplotlib画图中文显示乱码的解决方法
查看>>