Struts2【OGNL、valueStack】就是这么简单

Struts2快速基础入门实战指南 本文还有配套的精品资源,点击获取 简介:Struts2是一个基于MVC架构的Java Web应用程序框架,它简化了开发过程并提供了对控制流的更好控制。本文是一个初学者友好型的快速入门指南,将引导读者了解Struts2的核心概念,包括Action类、配置文件、MVC模式、拦截器、ValueStack、OGNL表达式语言以及结果类型。教程将一步步带领读者构建一个简单的Strut... 阅读详情

什么是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>

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

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

相关推荐

中兴 STB_ConfigTool_V7.5.8

中兴 STB_ConfigTool_V7.5.8/开启SSH,中兴 STB_ConfigTool_V7.5.8/开启SSH

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

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

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

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

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

Struts2第九篇【OGNL、valueStack详解】

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

3y 406

STB_ConfigTool_V7.6.7_Bin_Site资源包下载

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

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

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

DRV8818与STM32L031步进电机驱动方案:硬件设计、SPI配置与调机实战

步进电机作为开环位置控制的核心执行机构,在工业自动化与机器人系统中广泛应用。要让电机平稳、精准地运行,驱动器的电流整定与PWM斩波控制至关重要。本文从双极步进电机的基本驱动原理出发,解析DRV8818PWPR双H桥驱动芯片的电流采样机制、衰减模式选择、SPI寄存器配置等关键技术点,并结合STM32L031C6的低功耗特性,给出从CubeMX初始化到加减速查表实现的完整工程路径。针对实际调机中常见的电机不转、抖动、失步等故障,提供系统的排查方法与硬件布局避坑指南,帮助开发者快速搭建可靠、可量产的双极步进电机驱

weixin_34203832的博客 347

中兴机顶盒配置工具

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

Struts2OGNL简单使用、contextMap数据操作、ValueStack存数据、s:property取数据、valueStack的其它方法、struts对EL取值顺序的改变-day05下

目录第一节 struts 的OGNL1.1 OGNL简介1.2 OGNL的简单使用 第一节 struts 的OGNL 1.1 OGNL简介 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。 OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须要使用Struts2的标签库 OGNL相当于EL表示式,从作用域取数据 1.2 OGNL

ShuYY的博客 331

STB_ConfigTool_V7.5.8.zip

zte 开启ABD有效

SiteStbcfg

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

OGNL和ValueStack

OGNL简介 OGNL的全称是Object Graph Navigation Language,即对象导航图语言。它是一个开源项目,工作在视图层,其通过简单一致的表达式语言来读取合适者Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型的转换。 OGNL简介 OGNL的计算都是围绕着OGNL上下文来进行的,OGNL上下文实际就是一个Map集合,由ognl.O...

weixin_30906701的博客 76

【已解决】如何在服务器中下载huggingface模型,解决huggingface无法连接

在服务器上使用huggingface模型时,如果直接指定模型名称,用AutoTokenizer.from_pretrained(“model_name”),可能会由于网络原因会报错 Failed to connect to huggingface.co port 443 after 75018 ms: Operation time out因此我们需要下载模型到服务器上,得到模型本地的路径model_dir,再通过AutoTokenizer.from_pretrained(model_dir)方式来使用。

a61022706的博客 4万+

struts2-学习笔记(三)

Struts2学习笔记(三) 1.ognl概述: OGNL是ObjectGraphicNavigationLanguage(对象图导航语言)的缩写,它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 OGNL相对其它表达式语言具有下面几大优势: 1、支持对象方法调用 如xxx.doSomeSpecial(); ...

weixin_30328063的博客 159

信息安全与技术——(十一)恶意代码检测与防范技术

恶意代码(Malicious Code )或恶意软件(Malware )主要是指以危害信息的安全等不良意图为目的的程序,它们一般潜伏在受害计算机系统中实施破坏或窃取信息。

m0_63853448的博客 5991

别再只调电位器了!用单片机PWM控制LM317输出电压,精度和玩法都多了

本文探讨了如何利用单片机PWM控制LM317输出电压,替代传统的电位器调节方案。通过PWM信号的有源滤波和运放处理,实现了更高精度(±5mV)、更好温度稳定性(0.01%/°C)的数控稳压电源设计,支持远程控制和可编程曲线输出,为经典电路注入数字化智能。

weixin_29164497的博客 356

第三十二天 框架的启蒙之路 —Struts2的思考

因为有了Struts1,俺们了解了开源框架;因为有了Struts2,俺们又知道了两个开源框架还可以合为一体。

醉捞明月的专栏 1255

三菱FX5U通信之CCLINK操作步骤

11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆)

ZXL622722的博客 6926
上一篇: Struts2【拦截器】就是这么简单
下一篇: Mybatis入门看这一篇就够了
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值