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表达式。

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

OGNL - Struts 2中的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(),这个表达式会返回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对象)

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

XWork对OGNL的扩展:

1 OGNL引擎。

2 context对象

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

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

初窥struts2(二)OGNL表达式的更多相关文章

  1. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  2. struts2(四) ognl表达式、值栈、actionContext之间的关系

    今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...

  3. Struts2之 OGNL表达式和值栈

    技术分析之OGNL表达式概述(了解)        1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写        * 所谓对象图,即以任意 ...

  4. struts2:OGNL表达式之#、%、$符号运用

    1. OGNL表达达符号"#" 1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 注意:当系统创建了Action实 ...

  5. Struts2中OGNL表达式的用法

    今天分享的是Struts2框架中的一种ognl表达式语言,主要分两个目标去学习    1.理解struts2传值的优先级    2.ognl与el的区别 一:ognl表达式语言简介 OGNL的全称是O ...

  6. struts2 与 OGNL 表达式,jsp中 利用ognl 在valuestack中取值

    在Struts2中,一个请求在终于到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是 ...

  7. Struts2之OGNL表达式

    OGNL(Object-Graph Navigation Language的简称),对象图导航语言,它是一门表达式语言,除了用来设置和获取Java对象的属性之外,另外提供诸如集合的投影和过滤以及lam ...

  8. struts2:OGNL表达式,遍历List、Map集合;投影的使用

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存 ...

  9. java之struts2之OGNL表达式

    struts2推荐使用ognl表达式 ognl: object graph navigation language 对象导航图语言 如:school.teacher.address="北京& ...

随机推荐

  1. javascrip实现无缝滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. FreeRTOS学习笔记——任务间使用队列同步数据

    1.前言 在嵌入式操作系统中队列是任务间数据交换的常用手段,队列是生产者消费者模型的重要组成部分.FreeRTOS的队列简单易用,下面结合一个具体例子说明FreeRTOS中的队列如何使用. 2.参考代 ...

  3. [Javascript] Intro to the Web Audio API

    An introduction to the Web Audio API. In this lesson, we cover creating an audio context and an osci ...

  4. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  5. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  6. python-增删改查

    ###增删改查 names = ["zhangding","wangxu","wudong","cheng"] #增 n ...

  7. win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法

    TeeChart控件就不多介绍了,很多朋友不知道开始怎么注册使用,尤其是在64位系统下如何注册的问题,具体如下: win7.win8  64位系统问题所在: 64位的系统一般都是可以安装32位程序的 ...

  8. @ManyToMany 两个表多对多关联

    两个表属于多对多关系 如 Teacher <=> Student 表teacher 主键 id 表student 主键id 中间关联表 teacher_student 两个字段 t_id ...

  9. CSS控制表单

    一个简单的网站注册页面制作. 创建CSS文件如下: @charset "utf-8"; /* CSS Document */ * { margin: 0px; padding: 0 ...

  10. javaee后台适合用的编辑器插件

    http://pan.baidu.com/s/1bn7D9sr 这个适合用在后台