今天来说说ognl表达式在struts2中的运用。

--WZY

一、什么是Ognl?

通过百度百科查询到的解释,其中详细的说明了OGNL的作用。

下面我们就对OGNL这5个作用进行讲解

1、存取对象的任意属性,简单说就是对javabean进行操作(重要)

2、调用对象方法。

3、调用类的静态方法

4、索引数组元素

5、操作集合(重 要)

二、OGNL的功能实现

操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为

Ognl.getValue(expression,context,root);

//expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解

//context:ognl的上下文,类型为map,

//root:ognl的根,可以为javabean、list、map、.... 等等很多值

2.1、对javabean进行操作

User.java

Address.java

获取javabean中的属性值

获取javabean中的对象的属性值

对javabean中的属性进行赋值操作

2.2、调用对象方法

2.3、调用类的静态方法或属性

2.4、索引数组元素

2.5、操作集合

操作list集合,list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。

操作map集合

创建list集合

创建map集合

2.6、其他用法,使用数学运算符,使用“,”号连接表达式,in与not in运算符,投影、过滤等操作就不讲解了,都非常简单,重点掌握上面的即可。

三、OGNL与struts2的结合

上面说了那么一大堆的OGNL的使用功能,我们也感受到了他的强大,啥都能取出来,表达式啥都能做,但是在struts2中它是如何使用的呢?

OGNL中的上下文即struts2中的actionContext

OGNL中的root即struts2中的valueStack

actionContext和valueStack是什么,他们之间什么关系?

3.1、ActionContext和valueStack(重要)

ActionContext:

充当OGNL的context。是action的上下文,也可以叫做action的数据中心,本质是一个map,在其中,所有的数据都存放在这里,那其中到底存放了哪些东西呢,actionContext中存放数据的方式又是怎样的?

actionContext是一个map,所以其中都是以键值对的形式存储对象,如下图所示,

request、session、application这种我们熟知的作用域,注意是作用域,而不是对象,

paramters:这个是表单提交的参数,全部都会放到这个map中,

attr(attributes):三个作用域所有的属性都会放在该map下,如果有重复的,那么以request域中的为准。

VALUE_STACK:值栈,存放着valueStack对象,也就是说,通过ActionContext能够获取到valueStack。

如果我们使用actionContext.put();  那么会将该键值对直接放入到ActionContext下,

注意:除了request外,其他都可以直接通过getXxx()获得。而想要获取request作用域,必须通过key值的方式来获取。ActionContext.getContext().get("request");   为什么这样呢?因为struts2对request进行了增强。从这里actionContext中是不能直接获取到的,request进行了怎样的增强呢?比如在actionContext中put了一个普通的key和value,该键值对并没有在request域中,但是在jsp中,通过在request域查找key,也能找到该键值对,底层进行了两步:第一步:从request域中查找数据,第二步:如果没有找到,将从值栈中执行findValue()。  这样就解释了为什么通过ActionContext不能直接获取request,并且为什么不在request作用域中的数据,而通过在request域中查找也能够获取到。

  

valueStack:值栈,本质是一个ArrayList,作用,充当ognl的root,给一次请求中共享数据的功能。

内部图

root:源码中的名称为CompoundRoot,它也是一个栈,而每次值栈中入栈和出栈等操作其实就是对CompoundRoot进行对应的操作。

Context:对actionContext的引用,也就是通过valueStack也能够获取到上下文,通过getContext();

在我们访问一个action时,会将action加入到栈顶,也就是action会在CompoundRoot的栈顶,而我们提交的各种表单参数(充当了ognl表达式)会在valueStack从顶向下查找对应的属性进行赋值。这就是值栈的作用。

值栈的操作

这里提一下,知道了值栈的内部结构图,那么就好理解了。

action中手动向valueStack中放数据。

ActionContext.getContext().getValueStack().push(xxx);  //一般是javabean,这样放是放在root中,因为push操作是对栈进行操作,也就是对root进行操作

ActionContext.getContext().getValueStack().set(key,value);  //任意值,以key-value的形式放入到了root中。

jsp获取

push存放,在root下,直接使用属性获取即可

set存放,通过属性也可以直接获得。这里要排除一个误区,就是不要觉得set方式是以键值对的方式存放,就觉得是放入了context中,并没有,还是在root中锝

context操作

ActionContext.getContext().put(key,value);  //存放在actionContext中,也就是OGNL的context中

JSP获取:三种方式进行获取

#key获取。

直接使用key获取,因为值栈中也有context。只不过要从栈顶中的root开始找,然后在从context中查找

#request获取。因为struts2对request进行了增强,如果request域中找不到,则使用findValue(),从值栈中的root开始一路往下找。

3.2、ActionContext和valueStack的关系(重要)

你中有我,我中有你。

也就是说,通过valueStack可以获取到actionContext,通过ActionContext也可以获取到valueStack。

valueStack是对root进行操作,而actionContext是对context进行操作。(root和context是OGNL中的根和上下文)

获取值栈的方式:

ActionContext.getContext.getValueStack();//常用

ActionContext.getContext.get("VALUE_STACK");

request.getAttribute("VALUE_STACK");    //这个为什么可以?因为request进行了增强。详情看上面的解释。

获取actionContext的方式

ActionContext.getContext();  //常用

valueStack.getContext();

3.3、struts2不同的地方使用OGNL表达式获取数据

3.3.4、在jsp页面中

大部分都会在这里使用,因为jsp就是显示数据的地方,在struts2中有很多s标签,通过s标签和OGNL表达式一起配置使用,就能拿到想要的数据了。而OGNL的表达式的编写在最开始就已经讲解过了,context就是actionContext,root就是valueStack,剩下表达式就看我们需要什么了。标签的讲解会在下一章

3.3.5、在struts.xml中

在struts.xml中有时候也需要用到OGNL表达式去拿一些数据。比如,在result中设置stream时,就需要从action中获取流,而action可以看成是javabean,又在栈顶,所以直接使用OGNL表达式就能够获取到,但是注意特殊的,如果在你直接编写ognl表达式时struts2不能够区分出这是ognl表达式还是普通文本,那么就需要使用${}来表明该段文本是ognl表达式

四、总结

struts2我觉得最重要的两点,

一、理解它的架构图,知道大概的流程,

二、该篇文章讲解的值栈,actionContext,ognl的关系,

这两个弄懂了,基本上没什么难得倒我们了,在写三到四篇文章就可以把struts2给结束掉,还差的知识点有,s标签的使用、国际化、还有文件上传和下载的功能详细讲解,最后通过小项目将struts使用起来,就完了。

java actioncontext_struts2(四) ognl表达式、值栈、actionContext之间的关系相关推荐

  1. java struts2值栈ognl_Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  2. (转)OGNL与值栈

    http://blog.csdn.net/yerenyuan_pku/article/details/67709693 OGNL的概述 什么是OGNL 据度娘所说: OGNL是Object-Graph ...

  3. EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...

  4. valuestack,stackContext,ActionContext.之间的关系

    http://blog.csdn.net/findsafety/article/details/8676763 三者之间的关系如下图所示: ActionContext 一次Action调用都会创建一个 ...

  5. Java设计模式、框架、架构、平台之间的关系

     1.设计模式 为什么要先说设计模式?因为设计模式在这些概念中是最基本的,而且也比较简单.那么什么是设计模式呢?说的直白点,设计模式就是告诉你针对特定问题如何组织类.对象和接口之间的关系,是前人总结的 ...

  6. 信息系统项目管理师必背核心考点(四)UML类与类之间的关系

    科科过<每天一小时 俩月拿证>为您带来软考信息系统项目管理师核心重点考点(四):UML类与类之间的关系,内含思维导图+真题.本资料由科科过整理. [信息系统项目管理师核心考点]UML类与类 ...

  7. JAVA类加载器包括几种?它们之间的关系是怎么样的?双亲委派机制是什么意思?有什么好处?

    JAVA类加载器包括几种? 引导类加载器 bootstrap class loader 启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将 /l ...

  8. java repaint闪烁_java中paint,repaint,update之间的关系(闪烁问题的解决)

    最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲.但是他们之间是怎么来调用的呢,咱 ...

  9. Java中for循环continue,break,return三者之间的关系

    理论介绍 1.continue 跳出本次循环,进行下一个循环 2.break 跳出for循环结束: 3.return 直接结束循环 实例 实例1: for(int i =0;i<5;i++){S ...

最新文章

  1. python打开excel的函数-Python读取excel文件中带公式的值的实现
  2. 【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )
  3. pwnable.tw unexploitable 分析
  4. 踩不出足迹(牛客练习赛88 )
  5. java-将xlsx(excel)文件转换成json
  6. Linux抓包命令集锦(tcpdump抓包)
  7. 有监督学习与无监督学习的几大区别
  8. 什么是业务模式、商业模式、经营模式、盈利模式和发展模式?
  9. RuntimeError: Cannot re-initialize CUDA in forked subprocess解决方法之一
  10. Android 手机重启相关内容
  11. 太阳能热水器工作原理
  12. Java练手项目1:基于RFID的图书仓储管理系统(可做毕设)
  13. ESB 企业服务总线基本内容概述
  14. 3GPP TS 23501-g51 中英文对照 | 4.2.10 Architecture Reference Model for ATSSS Support
  15. 游戏充值数据分析报告
  16. 【MMU篇】一文总结ARMv8中的MMU架构
  17. 华硕路由器固件 虚拟服务器,华硕路由器开启设置虚拟服务器
  18. andriod 01
  19. PyQt5教程-04-关闭窗口
  20. php把buffer转化为图片_php base64转换成图片的方法

热门文章

  1. '抱大腿',真的不好?
  2. 游戏设计总结-1.从立项开始
  3. 思乡的味道,从巴黎到中国
  4. (翻译)Quartz官方教程——第十课:配置,资源使用和SchedulerFactory
  5. 红外发送接收电路(转载)
  6. kotlin语言中的out和in
  7. HTML CSS 梦幻仙境 图片显示在视频上方
  8. 从零开始的nrf52832蓝牙开发--串口DFU
  9. 怎么给QCustomPlot 坐标轴添加单位
  10. (四)旋转物体检测数据roLabelImg转DOTA格式