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. as3+java+mysql(mybatis) 数据自动工具(五)

    现在介绍常量的配置,主要用于客户端(as3)与服务端(java)之间的常量同步,比如错误码.请求标识等 配置格式: <macros name="Macros" groupSt ...

  2. HDU 1024 DP Max Sum Plus Plus

    题意:本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题. kuangbin专题. dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + ...

  3. HDU2015校赛 The Country List

    今天手感真差..各种读错题意.水题... 就是说,给你几个串.如果长度一样并且相同位置字符相同(不分大小写)的个数大于两个就是不同串. #include<iostream> #includ ...

  4. uva11426 GCD Extreme(II)

    题意:求sum(gcd(i,j),1<=i<j<=n)1<n<4000001 思路: 1.建立递推关系,s(n)=s(n-1)+gcd(1,n)+gcd(2,n)+……+ ...

  5. HIbernate学习笔记(九) hibernate事务并发处理与乐观悲观锁

    事务并发处理 一. 数据库的隔离级别:并发性作用. 1.   ReadUncommited(未提交读):没有提交就可以读取到数据(发出了Insert,但没有commit就可以读取到.)很少用 2.   ...

  6. static,interface and final

    1.static: a)抽象类(abstract class):使用了 abstract 关键字所修饰的 类叫做抽象类.抽象类无法实例化,不能 new 出来一个抽象类的对象(实例). 抽象方法(abs ...

  7. 常用Raspberry Pi周边传感器的使用教程

    在Raspberry Pi 的使用和开发过程中,你可能时常需要一些硬件和传感器等来支持你的开发工作,例如,加入一个超声波测距的模块来让你的Raspberry Pi具备测距功能,加入一个测温模块以实现测 ...

  8. Linux下用hostapd架无线AP

    Published by 荒野无灯 on 2011-10-08 00:56:02 under 服务器/MySQL Tags: 路由,无线AP,hostapd 34452 views 本文将介绍在lin ...

  9. Java类的生命周期详解

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  10. [css]display: table-cell,用div做分列布局

    table-cell我们却能用得到,而且是用它来干一件很重要的事情——多列布局. 多列布局在css中有多重要就不用我说了吧,传统模式下大家都使用float来解决这一问题,但是float写出来的东西代码 ...