关于Struts2中的值栈与OGNL表达式

1.1.1    OGNL概述:

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

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

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

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

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

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

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

@[email protected](‘foo %s‘, ‘bar‘)

或@[email protected]_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="@[email protected]()"/><br/>

<s:property value="@[email protected](12,15)"/><br/>

<s:property value="@java[email protected](‘%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>

时间: 2024-10-11 22:15:19

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

Struts2 中的值栈的理解

通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求道服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决. 当在客服端进行跳转时,当有请求提交到服务器

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

只是学习记录,把我知道的都说出来 一,值栈的作用 记录处理当前请求的action的数据. 二,小例子 有两个action:Action1和Action2 Action1有两个属性:name和passwd Action2有两个属性:name2和passwd2 请求从Action1进入,chain方法导向Action2 Struts.xml配置信息: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE st

struts2中的值栈对象ValueStack

ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionContext对象:  然后把Action对象放入值栈中: 最后再把值栈对象放入request中,传入jsp页面. (key: struts.valueStack):     开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象. (ActionContext是给开发者用的,

Struts2中的值栈

一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在一个值栈对象 值栈对象的声明周期与Action的生命周期(第一次访问action的时候被创建, 当action中方法返回值时被销毁)一致. 二 Action中值栈对象的获取方法 1. 通过ActionContext对象获取 ActionContext context = ActionContext.

7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)

struts2 案例 技术点: 模型驱动 防止表单重复提交–拦截器 数据回显 值栈 OGNL表达式 通配符.路径匹配原则.常量 数据处理的集中方式 请求数据自动封装以及类型转换 1.导包 c3p0-0.9.1.2.jar commons-dbutils-1.6.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.j

走进Struts2(五)— 值栈和OGNL

值栈 1.值栈是什么? 简单说:就是对应每一个请求对象的轻量级的内存数据中心. Struts2引入值栈最大的好处就是:在大多数情况下,用户根本无须关心值栈,不管它在哪里,不用管它里面有什么,只需要去获取自己需要的数据就可以了. 2.值栈能干什么? 简单说:就是能够线程安全的为每一个请求提供公共的数据式服务. 3.值栈包含Map栈和对象栈,值栈通过ActionContext的getValueStack()方法来获取值栈,但是在通常情况下,向valuestack中压入值都是由Struts2去完成的,

如何自学Struts2之Struts2值栈和OGNL语言[视频]

如何自学Struts2之Struts2值栈和OGNL语言[视频] 之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上: http://pan.baidu.com/s/1kTDsa95

Java中的值栈

OGNL表示式使用 和 值栈 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语言. * xwork 提供 OGNL表达式 * ognl-3.0.5.jar OGNL 是一种比EL 强大很多倍的语言 OGNL 提供五大类功能 1.支持对象方法调用,如xxx.doSomeSpecial(): 2.支持类静态的方法调用和值访问 3.访问OGNL上下文(OGNL context)和

struts2学习笔记(7)------------ognl表达式

OGNL表达式(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言. Struts2自行维护一个特定范围的"银行",Action将数据放入其中,而JSP页面可从中取数据,表面上似乎看起来像是jsp可以直接访问Action数据.. 当Action属性不再是简单的值,而是某个对象,数组,集合时,就需要使用ognl表达式来访问这些对象,数组,集合内的数据了. 1)ognl的stack Conte