zoukankan      html  css  js  c++  java
  • 4、OGNL与值栈

    一、OGNL

    1、什么是OGNL

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

    2、OGNL的作用

      支持对象方法调用

      支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名]

      支持赋值操作和表达式串联

      访问OGNL上下文和ActionContext

      操作集合对象

    3、OGNL的要素

      表达式:是整个OGNL的核心,OGNL会根据表达死去对象中取值。所有OGNL操作都是针对表达式解析后进行的。他表明了此次OGNL操作要做什么

      根对象(Root):可以理解为OGNL的操作对象,表达式规定了做什么,而root对象则规定了对谁操作。

      Context对象:上下文环境规定了OGNL的操作在哪里进行,上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用#号加上对象名称

    二、普通Java项目使用OGNL

    package com.turtle.demo2;
    
    import ognl.Ognl;
    import ognl.OgnlContext;
    import ognl.OgnlException;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class OgnlDemo {
        public static void main(String[] args) throws OgnlException {
            OgnlContext ognlContext = new OgnlContext();
    
            String lengthStr = Ognl.getValue("'Hello Ognl'.length()", ognlContext, ognlContext.getRoot()).toString();
            System.out.println("字符串的长度为"+lengthStr);
    
            // 静态方法的调用方式
            String value = Ognl.getValue("@java.lang.Math@random()*100", ognlContext, ognlContext.getRoot()).toString();
            System.out.println("取到的随机值为"+value);
    
            // 从Root对象中取数据
            Map<String,String> map = new HashMap<>();
            map.put("name","Turtle");
            ognlContext.setRoot(map);
            String name = Ognl.getValue("name",ognlContext,ognlContext.getRoot()).toString();
            System.out.println(name);
    
        }
    }

    三、值栈

    1、ValueStack是Struts的一个接口

    OgnlValueStack是ValueStack的实现类,客户端发起一个请求Struts2架构会创建一个Action实例,同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action的生命周期,Struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。

                                                                                    

    2、Context:即OgnlContext上下文

    它是一个map结构,上下文中存储了一些引用,parameters、request、session、application等,上下文的Root为CompoundRoot

    OgnlContext中的一些引用:

      parameters:包含当前请求参数

      request:包含当前request对象中的所有属性

      session:包含当前session对象中的所有属性

      application:包含当前application对象中的所有属性

      attr:该Map按如下顺序来检索某个属性:request、session、application。

    3、CompoundRoot:存储了action实例,它作为OgnlContext的Root对象

      OgnlContext的Root继承ArrayList实现压栈和出栈的功能,拥有栈的特点,先进先出,后进后出,最后压进栈的数据在栈顶,称为对象栈。

      Struts2对原Ognl做出改进,Root使用CompoundRoot(自定义栈),使用OgnlValueStack的findValue方法可以在CompoundRoot中从栈顶向栈底查找的对象的属性值。

      CompoundRoot作为OgnlContext的Root对象,并且在CompoundRoot中action实例位于栈顶,当读取action的属性时候先从栈顶对象中找对应的属性,如果找不到

      则继续找栈中的其他对象,如果找到则停止查找。

    4、ActinContext和ValueStack的关系:

                                                                                   

    在创建ActionContext的时候,创建ValueStack的对象,将ValueStack对象给ActionContextActionContext中有一个ValueStack的引用,ValueStack中也有一个ActionContext的引用ActionContext获取ServletAPI的时候,依赖值栈

    5、获取值栈对象

      通过ActionContext对象获取

      通过request域获取值栈

            ValueStack valueStack1 = ActionContext.getContext().getValueStack();
    
            ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

    6、操作值栈

      对action类中的属性提供get方法的方式

        因为Action本身在值栈中,Action中的属性也就默认在值栈中了,所以我们可以通过Action的属性提供get方法的方式来操作值栈

      手动操作值栈

        调用值栈的push和set方法对值栈进行操作

    7、访问值栈的数据

    #号的使用:

      获取context的数据:

    <s:property value="#request.name"/>

    在使用struts的UI标签的时候,用于构建一个Map集合

     <s:iterator value="#{'a':'1','b':'2','c':'3'}" var="entry">
             <%--使用key-value来取值--%>
             <s:property value="key"/>======<s:property value="value"/><br/>
             <%--使用var变量中的key -- value 来取值--%>
             <s:property value="#entry.key"/>=====<s:property value="#entry.value"/>
     </s:iterator>

     %号的使用:

      %强制解析OGNl表达式:

    <s:textfield name="name" value="%{#request.name}"/>

      %强制不解析OGNl表达式:

    <s:property value="%{'#request,name'}"/>

     $号的使用:

      在配置文件中使用Ognl表达式:在struts的配置文件中使用 .xml文件或者是属性文件

  • 相关阅读:
    文件管理
    权限管理
    用户和用户组
    BZOJ2957: 楼房重建(线段树&LIS)
    BZOJ2938: [Poi2000]病毒(AC自动机)
    BZOJ2935: [Poi1999]原始生物(欧拉回路)
    BZOJ4033: [HAOI2015]树上染色(树形DP)
    LightOJ
    LightOJ
    BZOJ4917: [Lydsy1706月赛]Hash Killer IV(模拟)
  • 原文地址:https://www.cnblogs.com/zhh19981104/p/11750995.html
Copyright © 2011-2022 走看看