Ognl表达式语言

Ognl表达式语言

概述

OGNL表达式

      OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。

OGNL优势

     1、支持对象方法调用,如xxx.doSomeSpecial();

      2、支持类静态的方法调用和值访问,表达式的格式:

            @[类全名(包括包路径)]@[方法名 |  值名],例如:

            @java.lang.String@format('foo %s', 'bar')

            或@tutorial.MyConstant@APP_NAME;

      3、支持赋值操作和表达式串联,如price=100, discount=0.8,

            calculatePrice(),这个表达式会返回80;

      4、访问OGNL上下文(OGNL context)和ActionContext;

      5、操作集合对象   可以创建list map 集合 但EL却不行

总结

        OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了  java.utils.Map 的接口。 OgnlContext对象

 

 

分析:

ü  Struts框架默认就支持Ognl表达式语言。

(struts必须引用的包:ognl.jar)

ü  作用

页面取值用。

 

El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用) 使用EL取值为null 那么会显示空字符串""

         (应用范围更广。page指令有一项为 isELIgnored="true | false")

Ognl表达式语言, struts标签默认支持的表达式语言。

                                     必须配置struts标签用,不能离开struts标签直接用。

 

OgnlContext对象(了解)

OgnlContext对象是ognl表达式语言的核心。

源码类:

public class OgnlContext extends Objectimplements Map{..}

 

硬编码方式,了解OgnlContext对象:

 

 

// OgnlContext用法

publicclass OgnlDemo1 {

 

    /**

     * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#

     * @throws Exception

     */

    @Test

    publicvoid testOgnl()throws Exception {

        //创建一个Ognl上下文对象

        OgnlContext context =newOgnlContext();

        //放入数据

        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

    publicvoid testOgn2()throws Exception {

        //创建一个Ognl上下文对象

        OgnlContext context =newOgnlContext();

        //放入数据

        User user = new User();

        user.setId(100);

        user.setName("Jack");

        //【往根元素放入数据】

        context.setRoot(user);

       

        //获取数据(map)

        //先构建一个Ognl表达式,再解析表达式

        Object ognl = Ognl.parseExpression("id");//这时可直接取属性 因为是根

        Object value = Ognl.getValue(ognl, context, context.getRoot());


        Object ognl = Ognl.parseExpression("address.province");

        Object value = Ognl.getValue(ognl, context, context.getRoot());

       

        System.out.println(value);

    }

   

    /**

     * 3.Ognl静态方法调用的支持

     * @throws Exception

     */

    @Test

    publicvoid testOgn3()throws Exception {

        //创建一个Ognl上下文对象

        OgnlContext context =newOgnlContext();

       

        //Ognl表达式语言,调用类的静态方法      类           方法

        //Objectognl = 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的API类和方法
OgnlContext类【本质是一个Map】
OgnlContext context = new OgnlContext();
context.put("user", user);
context.put("address", address);
context.setRoot(address)
Ognl类
Object obj1 = Ognl.parseExpression(“country”); 解析ognl表达式
Ognl.getValue(obj1, context, context.getRoot()); 获取ognl的表达式值
Object obj2 = Ognl.parseExpression(“language.toUpperCase()”); 方法调用
Object obj3 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)");
Object obj4 = Ognl.parseExpression(“@@min(10,4)”); Math类的方法直接调用

ValueStack对象

ValueStack, 即值栈对象。

值栈对象:

         是整个struts数据存储的核心,或者叫中转站。

         用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象;  然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。

(key: struts.valueStack);     开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)

 

lValueStack

      ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。

lValueStack特点

        ValueStack贯穿整个 Action 的生命周期(每个 Action类的对象实例都拥有一个

         ValueStack 对象). 相当于一个数据的中转站.在其中保存当前Action 对象和其他相关对象.

         Struts2框架把 ValueStack 对象保存在名为“struts.valueStack” 的request请求属性中。

lValueStack存储对象

        ObjectStack: Struts  把动作和相关对象压入 ObjectStack 中--List

   ContextMap:Struts把各种各样的映射关系(一些 Map类型的对象) 压入ContextMap

   Struts会把下面这些映射压入ContextMap

    parameters:该 Map中包含当前请求的请求参数

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

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

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

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

 


Ognl表达式语言_第1张图片

问题:    

    OgnlContext与ValueStack对象的关系?

Ognl表达式语言_第2张图片

Struts标签

Struts标签取值,就使用了Ognl表达式语言。

你可能感兴趣的:(java,java,Web,struts,Ognl,ee)