一个,什么是Ognl?
通过百度百科找到的解释详细介绍了OGNL的作用.
现在,我们将解释OGNL的5个功能
1. 访问对象的任何属性,只需在javabean上操作即可(重要)
2,调用对象方法.
3,调用该类的静态方法
4,索引数组元素
5. 操作集(重要)
二,OGNL功能实现
在执行此操作之前,您必须了解如何使用OGNL表达式,并且必须了解OGNL表达式的值范围只能位于其上下文和根目录中. 格式是
Ognl.getValue(expression,context,root);
// expression: 为我们编写的ognl表达式,从最后两个参数获取值,并在以下示例中详细说明获取规则
// context: ognl的上下文,类型为map,
// root: ognl的根,可以是javabean,列表,地图等多个值
2.1. 操作javabean
User.java
Address.java
获取javabean中的属性值
获取javabean中对象的属性值
在javabean中分配属性
2.2,调用对象方法
2.3,调用类的静态方法或属性
2.4,索引数组元素
2.5. 操作集
操作列表集合. list的组合实质上是一个数组,因此从列表中读取数据与对该数组进行操作相同.
可操作的地图收集
创建列表集合
创建地图收藏
2.6. 其他用法,使用数学运算符,使用“,”连接表达式,在运算符中和不在运算符中,将不解释投影,过滤等操作,它们都非常简单,仅着眼于上面.
三,OGNL和struts2的组合
如上所述,OGNL有很. 我们也感受到了它的力量. 您可以将所有内容都拿出来做表情. 但是在struts2中如何使用它?
OGNL中的上下文是struts2中的actionContext
OGNL的根是struts2中的valueStack
什么是actionContext和valueStack,它们之间的关系是什么?
3.1,ActionContext和valueStack(重要)
ActionContext:
用作OGNL的上下文. 它是操作的上下文,也可以称为操作的数据中心. 它本质上是一张地图,所有数据都存储在这里. 到底存储了什么,以及在actionContext中存储数据的方式是什么?
actionContext是一个映射,因此它以键-值对的形式存储对象,如下图所示,
请求,会话和应用程序的知名范围,请注意范围,而不是对象
参数: 这些是表单提交的参数,所有参数都将放置在此地图中,
attr(attributes): 这三个范围的所有属性都将放置在地图下. 如果有重复项,则以请求字段中的重复项为准.
VALUE_STACK: 值堆栈,用于存储valueStack对象,也就是说,可以通过ActionContext获得valueStack.
如果我们使用actionContext.put();那么键值对将直接置于ActionContext下,
注意: 除请求,必须通过键值获取. ActionContext.getContext(). get(“ request”);为什么是这样?因为struts2增强了请求. 从这里,不能直接获取actionContext. 如何增强请求?例如ognl表达式运算,将公共键和值放在actionContext中. 键值对不在请求字段中. 但是,在JSP中,可以通过在请求字段中查找键来找到键值对. 底层分两个步骤: 步骤1: 从请求字段中查找数据. 步骤2: 如果找不到,请从值堆栈中执行findValue(). 这解释了为什么不能直接通过ActionContext获取请求,以及为什么可以通过在请求字段中进行搜索来获取不在请求范围内的数据.
valueStack: 值栈本质上是一个ArrayList,它充当ognl的根ognl表达式运算,并提供在一个请求中共享数据的功能.
内部图片
root: 源代码中的名称为CompoundRoot,它也是一个堆栈,每次将值堆栈推入和拉出堆栈时,它实际上是对CompoundRoot的相应操作.
Context: 对actionContext的引用,即可以通过valueStack,通过getContext()获得该上下文;
当我们访问一个动作时,该动作将被添加到堆栈的顶部,也就是说,该动作将在CompoundRoot堆栈的顶部,并且我们提交的各种表单参数(用作ognl表达式)将从上到下位于valueStack上查找要分配的相应属性. 这就是价值栈的目的.
值堆栈的操作
这里提到,了解了值栈的内部,那么很容易理解.
实际上,将数据手动放入valueStack.
ActionContext.getContext(). getValueStack(). push(xxx); //通常是javabean,因此将其放置在根目录中,因为push操作在堆栈上进行,也就是说,在根目录上进行操作
ActionContext.getContext(). getValueStack(). set(key,value); //任何值都以键值形式放入根.
jsp访问
推送存储,在根目录下,您可以直接使用属性来获取它
集被存储,也可以直接通过属性获得. 这里有一个误解可以消除,即不要认为set方法是以键值对的形式存储的. 有人认为它放在上下文中,也可以不在上下文中,也可以不在根中.
上下文操作
ActionContext.getContext(). put(key,value); //存储在actionContext中,它是OGNL的上下文
JSP获取: 三种获取方式
#key get.
直接使用键获取,因为值堆栈中还包含上下文. 只需从堆栈顶部的根开始,然后从上下文中搜索
#requestGet. 因为struts2增强了请求,所以如果在请求字段中找不到请求,请使用findValue()从值堆栈的根开始一直搜索.
3.2,ActionContext和valueStack之间的关系(重要)
我在你里面,你在我里面.
也就是说,可以通过valueStack获取actionContext,也可以通过ActionContext获取valueStack.
valueStack在根上运行,而actionContext在上下文上运行. (根和上下文是OGNL中的根和上下文)
如何获取值堆栈:
ActionContext.getContext.getValueStack(); //仅使用通用
ActionContext.getContext.get(“ VALUE_STACK”);
request.getAttribute(“ VALUE_STACK”); //为什么会这样?因为请求已得到增强. 有关详细信息,请参见上面的说明.
如何获取actionContext
ActionContext.getContext(); //常用的
valueStack.getContext();
3.3,Struts2使用OGNL表达式在不同位置获取数据
3.3.4,在jsp页面中
大多数将在此处使用,因为jsp是显示数据的位置. struts2中有很多s标签. 您可以通过配置和使用s标签和OGNL表达式来获取所需的数据. OGNL表达式的编写已经在开始时进行了说明,上下文是actionContext,根是valueStack,其余表达式取决于我们的需求. 标签的说明将在下一章中
3.3.5,位于struts.xml
有时需要OGNL表达式才能在struts.xml中获取一些数据. 例如,在结果中设置流时,您需要从操作中获取流,并且该操作可以被视为javabean且位于堆栈的顶部,因此您可以使用OGNL表达式直接获取它,但是要注意特殊的情况,如果您直接编写ognl表达式,struts2无法区分这是ognl表达式还是普通文本,因此您需要使用$ {}来指示文本是ognl表达式<
四个. 摘要
我认为struts2的两个最重要的点,
一个,了解其架构图,了解一般过程,
第二,本文介绍的值堆栈,actionContext和ognl之间的关系,
了解这两点,基本上对我们来说没有什么困难. 撰写三,四篇文章后,Struts2即可结束. 较差的知识点是s标签的使用,国际化以及详细的文件上载和下载功能,最后通过一个小项目使用了struts.
Struts2学习(四)-ognl表达式,值堆栈,actionContext之间的关系
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-285444-1.html