• ognl表达式和值栈


    ognl概述

    对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。

    ognl可以调用对象的方法,获取struts2的值栈的数据,类型转换、操作集合对象等功能。ognl是第三方的表达式语言,即就是在不使用struts2这个框架也可以使用ognl这个语言,只不过是这个语言比较强大,struts2将这个ognl表达式引入到了这个框架里面来。所以我们主要学习的是struts2这个框架里的ognl语言

    为什么学习ognl,也就是ognl的功能

    OGNL(Object-Graph Navigation Language),可以方便地·操作对象属性的开源表达式语言,使页面更简洁;
    支持运算符(如±/),比普通的标志具有更高的自由度和更强的功能;
    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势
    支持对象方法调用,如xxx.doSomeSpecial();
    支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
    支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price
    discount),这个表达式会返回80;
    访问OGNL上下文(OGNL context)和ActionContext; 主要学习的重点
    操作集合对象。
    可以直接new一个对象

    ognl的使用要素

    表达式:从什么地方获取数据,获取会什么样的数据
    跟对象:你要操作那个对象
    context对象:在哪操作

    ognl入门案例

    引入ognl包
    请添加图片描述

    请添加图片描述

    访问对象的方法

    请添加图片描述

    访问对象的静态方法和静态属性,也是这样写的

    这里的方法是静态方法是random,且这个值是0-1之间的
    请添加图片描述

    获取root中的数据

    通常情况下会给root里面存放实体对象

    创建user类

    package com.biyi.pojo;
    
    public class User {
    
       
    
        private String username;
        private String password;
    
    
        public User(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
    
        public User() {
            super();
        }
    
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    请添加图片描述

    获取ognlcontext中的数据

    请添加图片描述

    第三节

    ognl在struts2里面的使用,ognl在struts2的入门案例

    引用的包和上一次的包一样
    但是这次需要配置过滤器等配置文件,通常情况下ognl是获取页面的数据

    访问对象的方法

    访问对象的静态的方法

    请添加图片描述

    值栈概述

    什么是值栈ValueStack

    Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
    ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。

    ValueStack是struts2的一个接口,ognlValueStack是一个实现类,客户端发起一个请求,struts2框架会创建一个action实例对象,同时,还创建了一个ognlValueStack的一个实例,ognlValueStack会贯穿整个生命周期,struts会将请求action参数封装为对象存储到值栈中,并通过ognl表达式读取值栈中对象的属性的值;

    值栈的内部结构

    ValueStack氛围两个区域:
    root区域:其实就是一些arraylist,通常放置的就是对象,获取root数据是不需要添加#
    context区域:其实就是一些map,通常放置的是;web开发中的对象的引用(request,session,application,attr,parameter)获取context数据是需要添加#

    通常所说的操作值栈,通常指的是操作ValueStack的root区域

    值栈与actioncontext的关系

    actioncontext:就是action上下文,就是之前的事和之后的是都知道,创建对象,以及执行某个方法;

    通过源码,当请求过来的时候执行dofilter方法,在这个方法中创建actioncontext,在创建actioncontext过程中,
    创建ValueStack对象,将ValueStack对象传递给actioncontext对象,所以可以通过actioncontext获取值栈对象
    actioncontext对象之所以能够访问servlet的API(访问的是域对象的数据)因为在其内部是值栈的引用

    获得值栈对象

    通过actioncontext对象获取值栈
    在struts2的内部,将值栈存入到request中一份

    通过actioncontext对象获取值栈

    请添加图片描述

    在struts2的内部,将值栈存入到request中一份
    这两个的方式创建的对象是同一个,因为ValueStack贯穿了action的生命周期,有一个action实例就只会有一个值栈实例
    请添加图片描述

    操作值栈—向值栈中存入数据

    有两种方法

    1.在action中提供属性的get方法

    请添加图片描述

    请添加图片描述

    2.使用ValueStack的本身的方法

    请添加图片描述

    请添加图片描述

    请添加图片描述

    获取值栈数据

    请添加图片描述

    请添加图片描述

    请添加图片描述

    ognl的特殊字符

    1,作用是获取context的数据

    请添加图片描述

    2,使用#构建map集合

    请添加图片描述

    请添加图片描述

    %

    请添加图片描述

    $

    在配置文件中使用ognl

    1,属性文件
    1.1国际化的地方(比如某个国家等这种情况)
    message_zh_CN.properties
    user.key=登陆
    user.welcome=欢迎,KaTeX parse error: Expected '}', got '#' at position 2: {#̲session.name} …{#session.name}

    上面这种情况是假如是中国登陆则出现登陆字样,假如是英国登陆则出现login

    还有一种是变量的时候使用,就比如欢迎谁或者welcome谁,这个人是动态的

    2,xml文件

    请添加图片描述

    综合案例:优化查询

    代码实现

    将查询到的数据存入到值栈中

    在页面中使用ognl表达式

    请添加图片描述

  • 相关阅读:
    智慧灯杆网关管理平台:城市建设的智慧化之道
    Linux基础Linux建议收藏
    Linux之查看so/bin依赖(三十一)
    XTU OJ 1464 黑子的鸡脚(说人话)
    JVM_逃逸分析
    基于php湘西旅游网站管理系统获取(php毕业设计)
    无监督模型预训练论文、代码汇总
    【数据结构】二叉树的前中后序遍历
    Revit建模如何一键“生成场地和基础垫层”
    spring的Task定时任务与事务
  • 原文地址:https://blog.csdn.net/weixin_58276266/article/details/126778939