Struts2第九篇【OGNL、valueStack详解】

什么是OGNL表达式?

OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。

为什么我们学习OGNL

在学习JSP的时候,我们已经学习过了EL表达式。EL表达式用起来也十分简单…我们在Struts2框架中也是可以使用EL表达式的…那么OGNL表达式好在哪里呢??

  • 支持对象方法调用,如xxx.doSomeSpecial()
  • 支持类静态的方法调用和值访问,表达式的格式【例如:”@@floor(10.9)”就是调用Math.floor()的方法了】
  • 支持赋值操作和表达式串联【这个其实EL表达式也能做】
  • 访问OGNL上下文(OGNL context)和ActionContext
  • 操作集合对象【EL只能遍历集合,OGNL可以创建集合】

OGNL是Struts2的默认表达式语言,OGNL是配搭Strut2的标签使用的..我们学习了OGNL表达式,就可以更好地理解Struts2标签的运行以及Struts2内部的存储结构.

valueStack对象

在讲解OGNL表达式之前,我们先来看看valueStack对象…valueStack是Struts2数据存储的核心…我们首先要知道数据是怎么存的,存到哪里,然后才讲解OGNL表达式是怎么取出数据的。

valueStack也被称作值栈对象..

  • 当用户访问Action,都会创建一个Action对象,ActionContext对象、valueStack对象..
  • Struts2把Action对象放进valueStack对象之中。
  • 将valueStack放进request域中,传入JSP页面(key: struts.valueStack)
  • JSP页面就可以使用OGNL表达式获取值栈中的数据了!

这里写图片描述

获取valueStack对象

  • 在Action中我们可以手动获取值栈对象,有两种方式获取:
    //获取值栈对象的2种方式
    private void getVs() {
        // 获取值栈对象,方式1:
        HttpServletRequest request = ServletActionContext.getRequest();
        ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");

        // 获取值栈对象,方式2: 
        ActionContext ac = ActionContext.getContext();
        ValueStack vs2 = ac.getValueStack();

        System.out.println(vs1 == vs2);//true
    }

valueStack内部存储结构

上面已经说了,用户访问Action时,会创建Action对象,valueStack对象。Struts2内部会将Action对象存到valueStack对象之中…那么valueStack的存储结构是什么样的呢???我们来看看

这里写图片描述

CompoundRoot

Action对象和Action的成员属性等值都是存到CompoundRoot下的.该CompoundRoot继承着ArrayList,因此它是List结构的

    public class CompoundRoot extends ArrayList {}

OgnlContext

OgnlContext对象存储着相关的域对象:request、response、session等数据,实现Map集合,是Map结构..

为了让request、response等域对象可以存储多个值,值也是使用Map结构…

public class OgnlContext implements Map {}

小总结

这里写图片描述

CompoundRoot保存着这样的数据:

  • Action对象以及Action对象的成员属性数据
  • 使用ValueStack对象.push()进去的数据
  • 使用ValueStack对象.set()进去的数据
  • 其他代理对象的数据

OgnlContext保存着这样的数据:

  • 维护了CompoundRoot中所有的数据
  • request、response等域对象所有的数据

OGNL表达式取值

  • Struts2会将valueStack对象封装进request对象域中,传入JSP页面。
  • valueStack存储着OgnlContext对象。
  • OgnlContext对象维护了CompoundRoot对象的数据
  • CompoundRoot存储着Action等数据

也就是说通过OgnlContext对象可以获取大部分我们需要的数据了。

那么OGNL表达式是怎么取出OgnlContext对象中数据的呢??下面我们通过硬编码的方式来讲解:

    /**
     * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号
     * @throws Exception
     */
    @Test
    public void testOgnl() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();
        // 放入数据
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往非根元素放入数据, 取值的时候表达式要用"#"】
        context.put("user", user);

        // 获取数据(map)
        // 先构建一个Ognl表达式, 再解析表达式
        Object ognl = Ognl.parseExpression("#user.name");
        Object value = Ognl.getValue(ognl, context, context.getRoot());

        System.out.println(value);
    }

    /**
     * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号
     * @throws Exception
     */
    @Test
    public void testOgn2() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();
        // 放入数据
        User user = new User();
        user.setId(100);
        user.setName("Jack");
        // 【往根元素放入数据】
        context.setRoot(user);

        // 获取数据(map)
        // 先构建一个Ognl表达式, 再解析表达式
        Object ognl = Ognl.parseExpression("address.province");
        Object value = Ognl.getValue(ognl, context, context.getRoot());

        System.out.println(value);
    }

也就是说,JSP页面中取出数据的时候,它会先构建一个OGNL表达式,再解析表达式

  • 如果是CompoundRoot类的数据,表达式不需要带#号
  • 如果不是CompoundRoot类的数据,表达式需要带#号

这里写图片描述

例子:



    <!-- 页面: 必须要拿到ValueStack -->
     <br/>1. 取根元素的值<br/>
     <s:property value="user.id"/> 
     <s:property value="user.name"/> 
     <s:property value="user.address"/> 
     <s:property value="user.address.city"/> 
     <s:property value="user.address.province"/> 

      <br/>2. 取非根元素的值<br/>
      <s:property value="#request.cn"/>
      <s:property value="#session.Session_data"/>
      <s:property value="#application.Application_data"/>    <br/>

      <!-- 自动找request/session/application,找到后立刻返回 -->
      <s:property value="#request_data"/>
      <s:property value="#attr.Session_data"/>
      <s:property value="#attr.Application_data"/>  <br/>

      <!-- 获取请求的参数数据 -->
      <s:property value="#parameters.userName"/>

     <!-- struts的调试标签:可以观测值栈数据 -->
     <s:debug></s:debug>

OGNL对静态方法的调用


    /**
     * 3.Ognl对 静态方法调用的支持
     * @throws Exception
     */
    @Test
    public void testOgn3() throws Exception {
        // 创建一个Ognl上下文对象
        OgnlContext context = new OgnlContext();

        // Ognl表单式语言,调用类的静态方法
        //Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
        // 由于Math类在开发中比较常用,所以也可以这样写
        Object ognl = Ognl.parseExpression("@@floor(10.9)");
        Object value = Ognl.getValue(ognl, context, context.getRoot());
        System.out.println(value);
    }

OGNL创建集合


    <br/>一、.构建 list集合</br>
    <s:iterator var="str" value="{'a','b'}">
        <s:property value="#str"/>
    </s:iterator>

     <br/>一、.构建 map集合</br>
     <s:iterator var="en" value="#{'cn':'China','usa':'America'}">
        <s:property value="#en.key"/>
        <s:property value="#en.value"/>  <br/>
     </s:iterator>

构建Map集合的时候,需要使用#号


OGNL 几个特殊的符号

#获取非根元素值 、 动态都建map集合
$ 在配置文件取值
% 提供一个ognl表达式运行环境


<body>
     <br/>获取request域数据<br/>
     <!-- property 标签是对象类型的标签,默认支持ognl表达式, 会从根元素去China名称对应的值 -->
     <s:property value="China"/>        <br/>
     <!-- 如果直接赋值,需要用单引号 -->
     <s:property value="'China'"/>      <br/>
     <s:property value="%{#request.cn}"/>       <br/>

     <!-- 值类型的标签,value值默认就是值类型,不支持ognl表达式 -->
     国家:<s:textfield name="txtCountry" value="%{#request.cn}"></s:textfield>
  </body>
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
中兴 STB_ConfigTool_V7.5.8 中兴 STB_ConfigTool_V7.5.8/开启SSH,中兴 STB_ConfigTool_V7.5.8/开启SSH 立即下载

相关推荐

机顶盒现场配置工具v7.5.8

机顶盒现场配置工具v7.5.8 还有教程更新日期 2016.6.3 能破解中兴部分机顶盒 中兴 zxv10 b860av1.1破解成功率不高

中兴B860AV1.1-T2_开ADB免拆刷机详细教程

刷机既有乐趣也有风险,请慎重选择,一切源于刷机造成的后果自负,本人概不负责!6、支持开机自启动、开机密码锁、儿童应用锁、应用隐藏、开机自动进入HDMI等各种花式功能;4、大量精简内置的没用的软件,运行速度提升,多出大量的存储空间;4.在框中粘帖刚刚的注册码,选择下一步;5.输入机顶盒的IP地址,选择连接;按下图,先点下①的按钮,获取注册码,

点我主页,可查看所有固件文章! 3万+

STB_ConfigTool_V7.6.7_Bin_Site资源包下载

STB_ConfigTool_V7.6.7_Bin_Site资源包,用于电视机顶盒连接管理。

中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]

一直以为中兴的这几个盒子只能通过ttl来破解,不过现在再也不用这么麻烦了,有了这个工具,前后破解不超3分钟!理论上支持所有中兴的iptv机顶盒的破解! 亲测中兴B760EV3、B860A、B860AV1.1完美安装应用! 一、首先打开机顶盒,选择遥控器的“设置”,输入1000或6321进入; 二、找到网络设置,输入wifi密码,然后记录一下IP地址; 三、解压附件中的stb 7.5...

d9394952的博客 20万+

中兴机顶盒配置工具

中兴机顶盒配置工具(已破解)

测试通过自用中兴盒子通用ROOT

本来是自己用的,现放出来福利大家,测试已通过多个型号中兴的盒子。用ADB上传使用未发现问题

浅析Struts2中的OGNL和ValueStack

当Struts2接收到一个.action的请求后,会先建立Action类的对象实例,并且将Action类的对象实例压入ValueStack对象中(实际上,ValueStack对象相当于一个栈),而ValueStack类的setValue和findValue方法可以设置和获得Action对象的属性值。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

2301_77783312的博客 648

STB前端页面切图

STB前端页面切图经验分享,用于初学者。

Struts2 OGNL表达式、ValueStack

OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性,不能调用对象的方法。 OGNL可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图。 OGNL是可以单独使用的。OGNL并不属于Struts2,只不过S...

weixin_30895603的博客 188

SiteStbcfg

运行“StbCfgTool_Crack.exe”,按下图,先点下1的按钮,获取注册码,接着将2中的所有字符全部复制,ctrl+c,然后选择Next;在框中粘帖刚刚的注册码,选择下一步

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 423

Struts2_ValueStack,OGNL详解

一、ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用         实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.     2.ValueStack贯穿整个action的生命周期,每一个action实例

欢迎关注免费星球ComfySpace:https://t.zsxq.com/19H0cfM1O 9114

锁定放大器

锁定放大器

qq_46757048的博客 4706

Struts2-Ognl表达式与ValueStack

Struts2-Ognl表达式与ValueStackOgnl概述OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。Ognl表达式与El表达式的对比: * El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用) 即应用范围更广。 * Ognl表达式语言

motionEnabled 769

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1802

第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 对接后端登录接口(上)

这里是Vben Admin V5版本实战体验,上一节我们前端已正常运行,但是没有实现登录。本节的重点是对接后端接口。上一节地址:第一节:Vben Admin 最新 v5.0初体验第二节:Vben Admin 登录逻辑梳理和对接后端准备后端我们采用Python的Flask项目,Flask-SQLAlchemy管理数据库模型,Flask-Migrate进行模型迁移。参考版本如下:Flask3.0.23.1.1到这里,登录接口完成,下一步要实现获取用户信息和权限的接口功能。

cuiwin的专栏 1861

Struts2 OGNL valueStack

总结一: ActionContext是Action的资源环境,每一次Action请求都会创建一个新的ActionContext,并且每一个ActionContext都是不同的(一次Action请求完毕,对应的ActionContext即销毁。但是,如果请求是在两个action之间转发而不是重定向,则任然用的是同一个ActionContext对象)。 ActionContext中包含:reque

jinsong1213的专栏 610

使用geneHapR进行基因单倍型分析(以vcf文件为例)

如下图所示,可以看到,用户需要准备的包括:基因型文件、注释文件和样本信息文件,以及后续会用的表型文件。输出的主要内容有:变异位点的可视化、单倍型网络、地理分布、表型比较和连锁不平衡热图。geneHapR的工作流程。

沉香best的博客 5941

struts2之ognl简介、ValueStack、ActionContext、以及struts中的数据传递

struts2之ognl一、OGNL1.1 什么是OGNL?1.2 OGNL上下文二、ValueStack2.1 什么是值栈?2.2 值栈的存储位置2.3 在Action中值栈对象存取值2.4 为什么要使用ValueStack作为根对象三、ActionContext3.1 ActionContext ac=ActionContext.getContext();3.2 向ValueStack压栈3.2.1 为什么ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高?四、S

qq_47906421的博客 284

moveit——基于octomap的碰撞检测

机械臂对棚顶进行碰撞检测。

如果想成为中心,那么就到中心去吧。 1355

【数据集】全球预报系统GFS概述:数据下载及处理

【数据集】全球预报系统GFS概述:数据下载及处理

WW、forever的博客 5750
上一篇: Intellij idea 断点调试
下一篇: Struts2第十篇【数据校验、代码方式、XML配置方式、错误信息返回样式】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值