Struts2【OGNL、ValueStack】

ZTE-STB7.5.8 ZTE-STB7.5.8中兴机顶盒配置程序,需要的朋友可以下来用 立即下载

什么是OGNL表达式?

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

为什么我们学习OGNL

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

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

valueStack对象

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

valueStack也被称作值栈对象..


获取valueStack对象

    //获取值栈对象的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    }
   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的存储结构是什么样的呢???我们来看看

640?wx_fmt=png
这里写图片描述

CompoundRoot

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

    public class CompoundRoot extends ArrayList {}class CompoundRoot extends ArrayList {}

OgnlContext

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

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

public class OgnlContext implements Map {}class OgnlContext implements Map {}

小总结

640?wx_fmt=png
这里写图片描述

CompoundRoot保存着这样的数据:

OgnlContext保存着这样的数据:


OGNL表达式取值

也就是说通过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);    }
   @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表达式,再解析表达式

640?wx_fmt=png
这里写图片描述

例子:

      <!-- 页面: 必须要拿到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>
    <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);    }
   @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></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>
      <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>

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y


中兴 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资源包,用于电视机顶盒连接管理。

Struts2第九篇【OGNL、valueStack详解】

什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。 为什么我们学习OGNL 在学习JSP的时候,我们已经学习过了EL表达式。EL表达式用起来也十分简单…我们在Struts2框架中也是可以使用EL表达式的…那么OGNL表达式好在哪里呢?? 支持对象方...

3y 406

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

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

中兴机顶盒配置工具

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

浅析Struts2中的OGNL和ValueStack

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

2301_77783312的博客 648

StbCfgTool.zip

StbCfgTool能通过IPV4/IPV6地址连接机顶盒,设置网络地址及LAN地址服务器信息,StbCfgTool机顶盒现场配置工具可用于对机顶盒进行现场配置。是配置机顶盒的一个辅助小工具。

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

STB_ConfigTool_V7.5.8.zip

zte 开启ABD有效

simulink求解器选择的小tip

给出了simulink选择求解器的一种tip,与积分初值有关。

高能阿博特的博客 2054

Struts2 OGNL表达式、ValueStack

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

weixin_30895603的博客 188

AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧)

本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。

efc1234567的博客 759

struts2 ognl valuestack

http://struts2.group.iteye.com/group/wiki/1356-how-to-use-ognl-in-struts2 struts2 ognl valuestack OGNL是XWork引入的一个非常有效的数据处理的工具。我们已经了解了OGNL的基本操作和OGNL的内部结构,接下来,我们来看看XWork对OGNL做了什么样的加强,以及OGNL的体系在Strut...

caoguojian9999 214

基于强化学习的工业SCR脱硝系统控制算法设计与实现

本文提出了一种基于强化学习的工业SCR脱硝系统智能控制方法。针对SCR系统存在的非线性、大滞后和多变量耦合等控制难点,研究采用混合建模方法构建了精度在5%以内的系统模型,并设计了专门的强化学习环境。该方法通过定义合理的动作空间和状态空间,结合物理约束设计损失函数,利用深度强化学习算法优化氨喷射控制策略。相比传统PID控制,该智能控制器能更好地适应烟气参数波动,实现NOx排放的稳定控制,为工业环保设施提供了更优的自动化解决方案。

huanghm88的专栏 1456

comsol 多物理场仿真流程-以开关柜为例

1、主要方法 在SolidWorks中对于开关柜的内部与外部结构进行建模,生成能够导入软件计算的3D模型。将SolidWorks中的模型导入comsol软件中,设置参数进行多物理场耦合仿真。 1、具体步骤 删除高压开关柜中对其内部电磁环境无较大影响的结构,如低压测量柜、断路器内部结构等。 导入模型:将厂家提供的3D模型转化为solidworks结构模型。 修复模型:修复已转化模型中转化错误的部分、修复已转化模型中非实体部分、修复已转化模型中重叠实体部分 化简模型:去除过于...

健忘16的博客 7020

[struts2] ognl, valueStack, stackContext 的学习

转载的。。。。 原文地址http://jwx0925.iteye.com/blog/630335 谢谢作者啊。。 Struts2中OGNL,valueStack,stackContext的学习 博客分类:  Struts freemarkerServlet框架WebworkJSP [/color]学习Struts2,一直不明白表单中的值是怎么传给A

wendellup的专栏 745

APM32取代STM32的经验分享

我仔细检查了代码中与硬件相关的部分,例如外设寄存器的访问和中断处理程序的设置,并进行了相应的修改。在本文中,我将分享我将APM32引入项目中取代STM32的经验,并提供相应的源代码。我查看了APM32的官方网站、开发者论坛和相关社交媒体,了解了开发者社区的活跃度和可用的资源。总结起来,将APM32替换STM32的过程需要经过几个关键步骤:了解APM32的规格和功能、评估软件生态系统、迁移代码和调试,以及性能和功耗优化。在开始替换之前,我对APM32进行了详细的研究和评估,以确保它能够满足项目的需求。

UplKubernetes的博客 2004

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

30天入门 SAP BTP 开发系列之十四: 将 SAP Business Application Studio 里开发好的 Node.js 应用部署到 Cloud Foundry 环境中

本教程详细介绍了如何将SAP Business Application Studio中的Node.js应用部署到Cloud Foundry环境。在完成本地开发和测试后,通过cf login命令连接Cloud Foundry环境,配置manifest.yml文件指定应用参数和路由信息。使用cf push命令完成应用的上传和部署,最终使应用运行在SAP BTP的云端环境中。教程包含从路由创建到部署验证的完整流程,确保开发者能够成功将Node.js应用发布到生产环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1078

机器学习实战——疫情数据分析与预测

机器学习如何做到疫情可视化——疫情数据分析与预测实战 本文将带领大家爬取11个国家以及中国31个省(自治区、直辖市)在2022.0101-2022.06.19的新冠疫情数据。并且采用机器学习模型对2022.6.20-2022.6.30每一天的全国确诊人数、死亡人数、治愈人数进行预测,**做出疫情可视化图形并且求出最终的相关系数R2!...

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 10万+
上一篇: Struts2【配置】
下一篇: Struts2【整合Spring】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值