Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack

3、Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack


上接Struts2矿街与页面的数据交互(1)--数据封装:http://www.noobyard.com/article/p-udijzudf-pw.html

目录

3、Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack

3.1 什么是OGNL

3.2 OGNL的作用

3.3 如何使用OGNL

3.4 什么是ValueStack

3.5 ValueStack内部结构

3.6 ValueStack和ActionContext的关系

3.6.1 获取ValueStack

3.6.2 向ValueStack中存入数据

3.6.3 页面中获得值栈数据

3.6.4 EL为何能访问值栈数据?

3.7 OGNL中的特殊符号的作用

3.7.1 #号的作用

3.7.2 %号的作用

3.7.3 $号的作用


3.1 什么是OGNL

         OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的表达式语言,通过它简单一致的表达式语法可以存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果表达式看作是一个带语义的字符串,那么OGNL无疑成为了语义字符串与Java对象之间沟通的桥梁。


3.2 OGNL的作用

Struts2默认的表达式语言就是OGNL,它具有以下特点:

  1. 支持对象方法调用
  2. 支持类静态方法调用和值访问
  3. 支持赋值操作和表达式串联
  4. 访问ONGL上下文(OGNLContext)和ActionContext
  5. 操作集合对象

ONGL的操作实际上就是围绕着OGNL结构的三要素而进行的:表达式(Expression)、跟对象(Root)、上下文环境(Context),下面分别讲解这三要素。

         1、表达式(Expression)

         表达式是整个OGNL的核心,OGNL会根据表达式取对象中的值,所有ONGL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要“做什么”。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种“链式”对象访问路径,还支持在表达式中进行简单的计算。

         2、根对象(Root

         Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象规定了“对谁操作”。ONGL称为对象如导航语言,即以任意一个对象为根,通过OGNL可以访问与这个关联的其他对象。

          3、上下文环境(Context

         实际上OGNL的取值还需要一个上下文环境,设置Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境是OGNL的上下文环境。上下文环境规定了OGNL的操作“在哪里进行”。上下文环境是一个Map类型的对象,在表达式中访问Context中的杜希昂,需要使用#号加上对象名称,即“#对象名称”的形式。


3.3 如何使用OGNL

OGNL如何访问对象的方法:

OGNL如何访问对象的静态方法:


3.4 什么是ValueStack

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


3.5 ValueStack内部结构

ValueStack中有两个主要的区域:

1、root区域:就是一个ArrayList,里面一般放置对象,获取root的数据不需要加#

2、Context区域:就是一个Map,里面放置web开发的常用的杜希昂数据的引用,获取数据需要加#

  1.    request
  2.   session
  3.   application
  4.   parameter
  5.    attr   :最近查找,先从request再session依次查找数据

通常说的操作值栈,一般指的操作ValueStackroot区域

 


3.6 ValueStack和ActionContext的关系

ServletContext:servlet上下文

ActionContext:Action的上下文

       当请求发送后,首先执行核心过滤器中doFilter方法,在方法内创建ActionContext,在创建ActionContext的方法内又创建了ValueStack对象,将ValueStack对象传递给ActionContext对象(值栈的引用);所以可以通过ActionContext获得ValueStack。

 

3.6.1 获取ValueStack

 

3.6.2 向ValueStack中存入数据

第一种:在Action中提供属性的get方法

         默认情况下,会将Action对象压入到值栈中,Action的属性也会在值栈中。但是值栈中压入的对象都是在栈顶,如果在压入后又有其他操作压栈就无法读取到想要的值栈了(默认情况下读取栈顶对象)

 

第二种:使用ValueStack中本身的方法(重点)

 

3.6.3 页面中获得值栈数据

获取Root中数据(不用加#

 

获取Context中数据(要加#

 

3.6.4 EL为何能访问值栈数据?

在Struts2框架中对request.getAttribute(String name);进行了加强,使其可以支持EL访问。


3.7 OGNL中的特殊符号的作用

3.7.1 #号的作用

获取context中的数据

 

使用#号构建map集合(使用var就将对象放入context中了,所以要用#

 

3.7.2 %号的作用

强制解析OGNL

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

强制不解析OGNL(使用较少)

<s:property value=”%{‘#request.name’}”/>

 

3.7.3 $号的作用

在属性文件中使用$

 

在配置文件中使用$


下接Struts2框架:

                                                                                            -----谢谢阅读!              -------知飞翀