1.1.1    OGNL概述:

Object Graphic Navigation Language(对象图导航语言)的缩写

* EL     :OGNL比EL功能强大很多倍.

它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。

OGNL相对其它表达式语言具有下面几大优势:

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

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

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

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

或@tutorial.MyConstant@APP_NAME;

设置 struts.ognl.allowStaticMethodAccess=true

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

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

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

5、操作集合对象。

1.1.2    访问类的方法:

<s:property value="'helloworld'.length()"/><br/>

1.1.3    访问类的静态方法:

开启一个常量:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

语法:

@类的全路径@方法名

<s:property value="@java.lang.Math@random()"/><br/>

<s:property value="@java.lang.Math@max(12,15)"/><br/>

<s:property value="@java.lang.String@format('%s,你好','小明')"/><br/>

1.1.4    访问OGNL的上下文:(值栈ValueStack )

什么是值栈?

ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个  ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前   Action 对象和其他相关对象.

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

结论:

Action何时创建:每次访问的时候创建.Action多实例的.没次访问都会创建一个Action.每个Action中有一个ValueStack对象的引用.

值栈对象ValueStack在request域中有一份.名字struts.valueStack

值栈:Action--->JSP传递值的.

OGNL:获得值栈的数据.

值栈的内部结构?

在 ValueStack 对象的内部有两个逻辑部分:

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

值栈ValueStack 和 ActionContext关系? --- 值栈的创建

StrutsPrepareAndExecuteFilter:核心过滤器:(预处理和执行)

核心过滤器 init  和 doFilter 两个方法.服务器启动的时候init就执行了 .每次访问doFilter执行.

Action每次访问的时候会创建.每次请求doFilter都会执行.(Action的创建的代码在doFilter)中.

在doFilter的代码中:

* prepare.createActionContext(request, response);--- 创建了ActionContext对象.

* ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack(); --- 创建了一个ValueStack对象

* ctx = new ActionContext(stack.getContext()); --- 将值栈对象的引用保存到ActionContext中.

***** 所以可以从ActionContext对象中获得到值栈对象.

* 将ValueStack存request域中:

request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

如何获得值栈对象?

两种方式:

// 1.ActionContext对象中有值栈的引用.

ValueStack valueStack1 = ActionContext.getContext().getValueStack();

// 2.从request域中获得值栈对象.

ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest()

.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

向值栈保存数据?

push(Object obj);    --- 将对象压入到栈顶.

set(String key,Object); --- 创建一个Map集合,将Map集合压入到(root)栈中

***** Action对象默认是在栈中的!!!那么在Action中定义的属性呢?

* 对属性提供了相应get方法.获得到属性? -- Action的属性也在栈中.

在页面通过struts2标签 获取值栈内容?

获得root区域值:不需要加#

<s:property value=”name”/>

获得context区域的值:需要加#

<s:property value=”#request.username”/>

通过EL表达式可以访问值栈数据?

底层的代码:StrutsRequestWrapper

public class StrutsRequestWrapper extends HttpServletRequestWrapper {

public StrutsRequestWrapper(HttpServletRequest req) {

super(req);

}

public Object getAttribute(String s) {

......

ActionContext ctx = ActionContext.getContext();

  Object attribute = super.getAttribute(s);//先从request范围获取属性值

if (ctx != null) {

if (attribute == null) {

//如果从request范围没有找到属性值,即从ValueStack中查找对象的属性值

......

ValueStack stack = ctx.getValueStack();

               attribute = stack.findValue(s);

......

}

}

return attribute;

}

}

1.1.5    OGNL:获得值栈的数据.

#号的用法:

1.获的值栈context中的值

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

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

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

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

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

2.投影集合:(对集合中的数据进行过滤)

<h3>遍历整个list集合</h3>

<s:iterator  var="p" value="list">

<s:property value="name"/>---<s:property value="price"/><br/>

<s:property value="#p.name"/>---<s:property value="#p.price"/><br/>

</s:iterator>

<h3>过滤要集合的所有的name属性</h3>

<s:iterator value="list.{name}" var="pname">

<s:property value="pname"/>

</s:iterator>

<h3>遍历集合中价格大于1500的商品</h3>

<s:iterator value="list.{?#this.price > 1500}">

<s:property value="name"/>---<s:property value="price"/>

</s:iterator>

<h3>遍历集合中价格大于1500的商品名称</h3>

<s:iterator value="list.{?#this.price>2000}.{name}" var="pname">

<s:property value="pname"/>

</s:iterator>

3.构建一个map集合.

<h3>构建一个List集合</h3>

<!-- 构建一个list集合 -->

<s:iterator value="{'aa','bb','cc','dd'}" var="i" >

<s:property value="i"/>

</s:iterator>

<h3>构建Map集合</h3>

<s:iterator value="#{ 'aa':'name1','bb':'name2','cc':'name3' }">

<s:property value="key"/>---<s:property value="value"/>

</s:iterator>

%号用法:

1.告诉运行环境是一个OGNL表达式:

<% request.setAttribute("name", "张三"); %>

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

2.告诉运行环境不是一个OGNL表达式:

<% request.setAttribute("foo", "foo"); %>

<s:property value="%{'#request.foo'}"/>

$号用法:

1.在国际化文件中使用OGNL表达式

itcast.test=${\#request.name}

页面中:

<s:i18n name="message">

<s:text name="itcast.test"></s:text>

</s:i18n>

2.在配置文件XML中使用OGNL表达式

<param name="contentType">${contentType}</param>

关于Struts2中的值栈与OGNL表达式的更多相关文章

  1. struts2中各种值栈问题

    struts2中OGNL和 ValueStack(一) 收藏 学习的时候,总分不清楚在struts2中页面的传值和取值是怎么来完成的,所以从网上搜了很多资料,现在把这些资料总结写,留着以后参考..看完 ...

  2. Struts2中的值栈

    一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...

  3. Struts2知识点小结(三)--值栈与ognl表达式

    1.问题一 : 什么是值栈 ValueStack        回顾web阶段 数据交互问题?        客户端提交数据  到  服务器端    request接受数据+BeanUtils实体封装 ...

  4. Struts2 中的值栈的理解

    通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...

  5. struts2的总体回想(ACTION、拦截器、值栈、OGNL表达式、ModelDriven方案等)

    ValueStack:struts2的一个存放数据的数据结构(核心) ValueStack大致能够理解为:由Map和对象栈组成 ValueStack作用范围:一个请求,用它来取代request的作用域 ...

  6. Struts2学习记录-Value Stack(值栈)和OGNL表达式

    仅仅是学习记录.把我知道的都说出来 一.值栈的作用 记录处理当前请求的action的数据. 二,小样例 有两个action:Action1和Action2 Action1有两个属性:name和pass ...

  7. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  8. 初学者易上手的SSH-struts2 04值栈与ognl表达式

    什么是值栈?struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值.,特点:先进后出.如果将它当做一个容器的话,而这个容器有两个元素,那么最上面的元素叫做栈顶元素,也就是所说的压 ...

  9. 值栈和OGNL 之 7.1 值栈

    7.1  值栈 7.1.1  值栈是什么 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Resu ...

随机推荐

  1. GCC 编译命令

    今天突然被同事问道一个GCC编译命令为的问题,感觉对相应内容生疏了,赶紧整理下相关内容,梳理下相关知识. GCC命令提供了非常多的命令选项,但并不是所有都要熟悉,初学时掌握几个常用的就可以了,到后面再 ...

  2. POJ 1005 解题报告

    1.题目描述   2.解题思路 好吧,这是个水题,我的目的暂时是把poj第一页刷之,所以水题也写写吧,这个题简单数学常识而已,给定坐标(x,y),易知当圆心为(0,0)时,半圆面积为0.5*PI*(x ...

  3. Web技术导论复习大纲

    1. 什么是URL,其一般形式是什么? 资源类型://网址[:端口号][/[文件路径/文件名]][?参数名=参数值&参数名=参数值...] 2. 什么是B/S模式,与C/S模式相比有哪些优越性 ...

  4. mapreduce学习指导及疑难解惑汇总

    原文链接http://www.aboutyun.com/thread-7091-1-1.html 1.思想起源: 我们在学习mapreduce,首先我们从思想上来认识.其实任何的奇思妙想,抽象的,好的 ...

  5. c语言中格式化输出函数的研究

    <一>; 1.前言 在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库 ...

  6. Treap 模板 poj1442&hdu4557

    原理可以看hihocoder上面的讲解,很清楚,不多说了. 模板抄lrj训练指南上面的. /** Treap 实现 名次树 功能: 1.找到排名为k的元素 2.值为x的元素的名次 初始化:Node* ...

  7. Java HashMap实例源码分析

    引言 HashMap在键值对存储中被经常使用,那么它到底是如何实现键值存储的呢? 一 Entry Entry是Map接口中的一个内部接口,它是实现键值对存储关键.在HashMap中,有Entry的实现 ...

  8. FTP被动模式连接及超时问题解决

    问题: 1.FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态. 2.连接FTP服务器,长时间进行数据操作 ...

  9. A Tour of Go Exercise: Maps

    Implement WordCount. It should return a map of the counts of each “word” in the string s. The wc.Tes ...

  10. 【Away3D代码解读】(五):动画模块及骨骼动画

    动画模块核心存放在away3d.animators包里: Away3D支持下面几种动画格式: VertexAnimator:顶点动画 SkeletonAnimator:骨骼动画 UVAnimator: ...