struts2.1.6教程四—二、OGNL与ValueStack(VS) (ActionContext 、ValueStack 、Stack Context

ActionContext 
一次Action调用都会创建一个ActionContext 
调用:ActionContext context = ActionContext.getContext()

ValueStack 
由OGNL框架实现 
可以把它简单的看作一个栈(List) 。

Stack Object:放入stack中的对象,一般是action。 
Stack Context(map):stack上下文,它包含一系列对象,包括request/session/attr/application map等。 
EL:存取对象的任意属性,调用对象的方法,遍历整个对象结…

ActionContext是Action上下文,可以得到request session application 
ValueStack是值栈 存放表单中的值 
Stack Context 栈上下文 也是用来存值的

struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示:

|--request

|

|--application

|

context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ]

|

|--session

|

|--attr

|

|--parameters

在Struts2中,采用标准命名的上下文(Context)来处理OGNL表达式。处理OGNL的顶级对象是一个Map(也叫context
map),而OGNL在这个context中就是一个顶级对象(root)。在用法上,顶级对象的属性访问,是不需要任何标记前缀的。而其它非顶级的对象
访问,需要使用#标记。 
   
Struts2框架把OGNL Context设置为我们的ActionContext。并且ValueStack作为OGNL的根对象。除value

stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到
ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet
API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能,以方便对Action类进行测试!) 
   
Action的实例,总是放到value
stack中。因为Action放在stack中,而stack是root(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问
ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。 
    那么访问Action中的属性的代码就可以这样写

<s:property value="postalCode"/>
    其它ActionContext中的非根对象属性的访问要像下面这样写:
<s:property value="#session.mySessionPropKey"/> or
<s:property value="#session[‘mySessionPropKey‘]"/> or
<s:property value="#request[‘myRequestPropKey‘]"/>
    对Collection的处理,内容就很简单。
<s:select label="label" name="name" list="{‘name1‘,‘name2‘,‘name3‘}" value="%{‘name2‘}" />
    这是处理List。这个代码在页面上建立一个下拉选项,内容是list中的内容,默认值是name2.
处理map 

<s:select label="label" name="name" list="#{‘foo‘:‘foovalue‘, ‘bar‘:‘barvalue‘}" /> 

     需要注意的是,判断一个值是否在collection中。我们要使用in或者not in来处理。
<s:if test="‘foo‘ in {‘foo‘,‘bar‘}">
   muhahaha
</s:if>
<s:else>
   boo
</s:else>
另外,可以使用通配符来选择collection对象的子集。
?——所有匹配选择逻辑的元素
^——只提取符合选择逻辑的第一个元素
$——只提取符合选择逻辑的最后一个元素
person.relatives.{? #this.gender == ‘male‘} 

以下为补充摘录的一些问题:

1.提问:在Struts2中,如何使用自身的Tag读取Action中的变量?

Struts2
自身的Tag会根据value中的OGNL表达式,在ValueStack中寻找相应的对象。因为action在ValueStack的顶部,所以默认情
况下,Struts2的Tag中的OGNL表达式将查找action中的变量。请注意,value中的内容直接是OGNL表达式,无需任何el的标签包
装。

例如:<s:property value="user.name" />

2.提问:在Struts2中,如何使用自身的Tag读取HttpServletRequest,HttpSession中的变量?


上面的知识中,我们知道,Struts2中OGNL的上下文环境中,包含request,session,application等servlet对象的
Map封装。既然这些对象都在OGNL的上下文中,那么根据OGNL的基本知识,我们可以通过在表达式前面加上#符号来对这些变量的值进行访问。

例如:<s:property value="%{#application.myApplicationAttribute}" /> 
<s:property value="%{#session.mySessionAttribute}" /> 
<s:property value="%{#request.myRequestAttribute}" /> 
<s:property value="%{#parameters.myParameter}" />

3.通俗struts2中ValueStack和Stack Context二者的区别。

ValueStack 由 OGNL框架实现,可以把它简单的看作一个栈(List)
Stack Context(保存方式是map类型):stack的上下文,它包含一系列对象,包括
request,session,attr,application,map 等ValueStack中保存的值可以直接取,而stack中的需要在前面加#(request,session,application)

一句话就是两种都可以存储值,一种struts封装建议的方式,是保留原始的servletAPI的方式

时间: 2024-08-30 03:04:26

struts2.1.6教程四—二、OGNL与ValueStack(VS) (ActionContext 、ValueStack 、Stack Context的相关文章

struts2.1.6教程四、OGNL与ValueStack(VS)

1.值栈入门 下面我们建立struts2ognl项目来练习ognl的使用. 步骤一.搭建strust2的开发环境 步骤二.建立LoginAction,主要代码如下: package com.asm; public class LoginAction extends ActionSupport{ private User user; public String execute() throws Exception { return SUCCESS; } ...省略user的get/set方法 }

Struts2的标签库(二)——OGNL表达式

Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框架时被创建,当前端的JSP页面向Action发送请求时,Struts2框架会将请求的数据封装并存放在栈顶,当请求结束后,此栈顶的数据被清除.Struts2的标签访问数据就是通过访问ValueStack来实现的. 2.Struts2可以直接从对象中获取属性,可以自动搜索Stack Context的所有

Struts2.x教程(二) OGNL和值栈

一.OGNL是什么 OGNL(Object Graph Nvigation Language,对象图导航语言)是一个开源的表达式引擎.通过使用OGNL的表达式语法可以存取Java对象树的任意属性和调用Java对象树的方法等. 我们通过一个示例来了解OGNL. 分别创建三个实体类(全部省略了getter.setter方法): //学生类 public class Student { private String name; private Integer age; private Grade gr

struts2官方 中文教程 系列十二:控制标签

介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项目:struts_basic2 本帖地址:struts2官方 中文教程 系列十二:控制标签 即 http://www.cnblogs.com/linghaoxinpian/p/6941683.html 下载本章节代码 struts2 if标签 我们在thankyou.jsp中添加如下代码: <s:i

《80X86汇编语言程序设计教程》二十四 进入与离开V86模式实例

1.  这是我这本书调得最失败的一个实例,而且问题都是超出了这本书能教会我的范畴.作者对调试环境几乎只字不提,这让我有点费解.原作者使用TASM的编译代码,而我使用的MASM加虚拟机进行测试,不知道这两样东西哪里有问题还是源代码要做哪些修正.理论知识参考"<80X86汇编语言程序设计教程>二十二 分页管理机制与虚拟8086模式". 2.  进入和离开V86模式实例:各2种方式进入和离开V86模式.V86模式下8086程序调用实模式软中断处理程序.逻辑功能:以驻留方式结束程序

Windows server 2012 搭建VPN图文教程(二)配置路由和远程访问服务

Windows server 2012 搭建VPN图文教程(一)安装VPN相关服务 Windows server 2012 搭建VPN图文教程(二)配置路由和远程访问服务 Windows server 2012 搭建VPN图文教程(三)配置VPN访问账户 Windows server 2012 搭建VPN图文教程(四)客户端访问VPN测试 PartII 配置路由和远程访问服务 本部分主要介绍如何安装和配置路由及远程访问服务的方法,请参考以下操作步骤: (续上)前面提到重新启动操作系统,重启后服务

微信公众平台开发教程(二) 基本原理及消息接口

微信公众平台开发教程(二) 基本原理及消息接口 一.基本原理 在开始做之前,大家可能对这个很感兴趣,但是又比较茫然.是不是很复杂?很难学啊? 其实恰恰相反,很简单.为了打消大家的顾虑,先简单介绍了微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现). 服务处理完毕,然后挥发给微信服务器,微信服务器再将具体响应回复到终端. 通信协议为:HTTP 数据格式为:XML 具体的流程如下图

Linux平台上SQLite数据库教程(二)——C语言API介绍

Linux平台上SQLite数据库教程(二)--C语言API介绍 前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c.sqlite3.h.源码地址:https://github.com/AnSwErYWJ/SQLite. 打开数据库 1.原型: int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义