• 初窥struts2(二)OGNL表达式


        Struts2总结

     

       Struts2完整的处理流程:

       1  客户端发送请求,交给struts2控制器(StrutsPrepareAndExecuteFilter)

       2  Filter控制器进行请求过滤,如果是/actionName.action,/actionName(默认)两种格式请求,执行后给Action处理。

       3 Filter控制器创建一个ValueStack对象,Action对象压入栈顶,request,session,application等对象装入Context区域。

       4  Filter控制器执行拦截器的前期处理(默认调用defaultStack拦截器栈)

       5  Filter控制执行Action对象的业务处理方法(默认执行execute方法)

       6  Filter控制器执行Result对象的处理方法execute,调用视图组件生成响应信息。

       7  如果是JSP视图,JSP中的标签和EL元素解析成原始HTML响应信息。

       8  Filter控制器执行拦截器的后续处理。

       9  将响应的信息输出客户端浏览器。

     

    以上是struts2的处理流程,在整个处理过程中ValueStack(值栈)里面存储着一次Action请求响应的所有数据,ValueStack贯穿着着整个处理流程。所以理解StackValue整个数据结构非常重要,要理解ValueStack这个数据结构就要先理解OGNL表达式。

       OGNLObject-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
      OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境的根对象为user1,则表达式person.address[0].province可以访问到user1person属性的第一个addressprovince属性。
      这种功能是模板语言的一个重要补充,象jsp2.0,velocity,jelly等等,都有类似的功能,但是ognl比它们完善得多,而且以一个独立的lib出现,方便我们构建自己的框架。
      webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。
      和struts1.xformbean相比,这样做的好处非常明显:在webwork中不需要为每个页面专门写formbean,可以直接利用对象层的对象。例如在对象设计中,我们的UserPerson是分开的,而一个注册用户界面需要填写两者的内容,在webwork中,就可以保持后台的对象结构,把属于用户属性的界面元素用user.person.xxx绑定,把属于账号属性的界面元素用user.xxx绑定。

    OGNL - Struts 2中的OGNL

    OGNLObject-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(),这个表达式会返回80
    访问OGNL上下文(OGNL context)和ActionContext
    操作集合对象。

    OGNL表达式的常用用法

    输出基本类型的属性(包括String)的属性如id,name

    输出数组的元素array[0]

    输出List集合的元素:List[0]

    输出Map集合的元素:map.key 或者map[‘key’]

     

    创建List集合:{1,2,3}

    创建Map集合 #{1:’one’,2:’two’}

    调用方法  list.size()

    调用静态方法 @java.util.Arrays@toString(list)

    投影操作:list.{name}返回的是集合类型

    过滤操作:list.{?#this.id>5}

     

    下面通过几个实例代码来演示:事例较多打包在ognltest

    在学OGNL表达式时 根对象 上下文对象 之间的关系 身边有些同学搞不明白之间的关系,我现在一个简单的例子来说明 根对象与上下文对象之间的关系:

         上下文是用来描述根对象的相关联信息的,也可以说context对象是为root对象服务的。根对象可以不需要上下文对象单独存在,但有些时候离开了上下文对象根对象就有点不完整。

         我们把根对象比作一个人,他的年龄,身高,肤色等这些是他的属性,而他的收入,背景,学历,等这些都是上下文对象。一个人可以不需要背景,学历,但没有这些他在这个社会就有点不完整。

      理解OGNL引擎的基本结构

    OGNL涉及几个基本概念:

        1 OGNL引擎—负责计算OGNL表达式得到的相应的结果。

    2 root对象—OGNL引擎所操作的对象。

    3 context对象—将OGNL相关联的数据封装在Context对象,context对象实际是一个Map集合。

    使用或读取root对象中的属性:

         Ognl.getValue(“ognl表达式”,root对象);

         Ognl.getValue(“ognl表达式”,context对象,root对象);

     使用或读取context对象的数据

         Ognl.getValue(“#名称”,context对象,root对象)

    使用 #名称 获取上下文对象中的值

    XWorkOGNL的扩展:

     1 OGNL引擎。

     2 context对象

     3compoundRoot对象,OGNL引擎所操作的对象;复合根对象,可以包含多个root对象,多个root对象存储在复合根的堆栈结构中,OGNL引擎获取属性从栈的顶部开始寻找对应的属性。

    后续介绍结合struts2源代码介绍Action请求

  • 相关阅读:
    阅读计划
    个人介绍
    构建之法阅读笔记04
    结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
    结对开发——返回一个整数数组中最大子数组的和
    学习进度条(三)
    构建之法阅读笔记03
    结对开发——四则运算(三)
    四则运算——单元测试(测试方法:Right-BICEP )
    学习进度条(二)
  • 原文地址:https://www.cnblogs.com/ArtsCrafts/p/struts2_ognl.html
Copyright © 2020-2023  润新知