[ SSH框架 ] Struts2框架学习之三(OGNl和ValueStack值栈学习)
一、OGNL概述
1.1 什么是OGNL
OGNL的全称是对象图导航语言( object-graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。
1.2 OGNL的作用
Struts2默认的表达式语言就是OGNL,它具有以下特点:
● 支持对象方法调用。例如: objName. methodName( )。
● 支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[ 方法名|值名 ]。例如:@ java.lang.String@format("foo%s","bar")。
● 支持赋值操作和表达式串联,例如: price=100, discount=0.8, calculatePrice( ),在方法中进行乘法计算会返回80
● 访问OGNL上下文( OGNL context)和 ActionContext。
● 操作集合对象。
1.3 OGNL的要素
了解了什么是OGNL及其特点后,接下来,分析一下OGNL的结构。OGNL的操作实际上就是围绕着OGNL结构的三个要素而进行的,分别是表达式( Expression)、根对象( Root Object)、上下文环境( Context),下面分别讲解这三个要素,具体如下。
1、表达式
表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要“做什么”。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种“链式”对象访问路径,还支持在表达式中进行简单的计算。
2、根对象(Root)
Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁操作”。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。
3、 Context对象
实际上OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境( Context)。上下文环境规定了OGNL的操作“在哪里进行”。上下文环境 Context是一个Map类型的对象,在表达式中访问 Context中的对象,需要使用“#”号加上对象名称,即“#对象名称”的形式。
1.4 OGNL入门
下面通过一个示例来演示OGNL如何访问对象的方法:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %> <html>
<head>
<title>My JSP 'ognl.jsp' starting page</title>
</head> <body>
<!--
使用struts2+ognl计算字符串长度
value属性值:ognl表达式
-->
<s:property value="'Kevin'.length()" />
</body>
</html>
在上面的测试中,我们调用了字符串的length方法,其中"'Kevin'.length( )"就是OGNL的表达式,最终输出结果为5。
二、值栈概述
2.1 什么是值栈
ValueStack是Struts的一个接口,字面意义为值栈, OgnlValueStack是ValueStack的实现类,客户端发起一个请求 struts2架构会创建一个action实例同时创建一个 OgnlValueStack 值栈实例,OgnlValueStack贯穿整个 Action的生命周期, struts2中使用OGNL将请求 Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。
2.2 值栈的内部结构
在OgnlValueStack中包括两部分:值栈和map。
● Context:即 OgnlContext上下文,它是一个map结构,上下文中存储了一些引用, parameters、request、 session、 application等,上下文的Root为 Compoundroot。
Ognlcontext中的一些引用:
parameters:该Map中包含当前请求的请求参数;
request:该Map中包含当前 request对象中的所有属性 ;
session:该Map中包含当前 session对象中的所有属性 ;
application:该Map中包含当前 application对象中的所有属性;
attr:该Map按如下顺序来检索某个属性: request, session, application。
● CompoundRoot:存储了 action实例,它作为 OgnlContext的Root对象
CompoundRoot继承 ArrayList实现压栈和出栈功能,拥有栈的特点,先进后出,后进先出,最后压进栈的数据在栈顶。我们把它称为对象栈。
struts2对原OGNL作出的改进就是Root使用 CompoundRooti(自定义栈),使用OgnlValueStack的findValue方法可以在 CompoundRoot中从栈顶向栈底找查找的对象的属性值。
CompoundRoot作为 OgnlContext的Root对象,并且在 CompoundRoot中action实例位于栈顶,当读取 action的属性值时会先从栈顶对象中找对应的属性,如果找不到则继续找栈中的其它对象,如果找到则停止查找。
2.3 获取值栈对象
【通过ActionContext获取值栈对象】:常用方式
//第一种方式:获取值栈对象,
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
【通过request域获取值栈对象】
//第二种方式:获取值栈对象
ValueStack stack2=(ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.4 操作值栈
● 使用Action中的属性提供的get方法
● 调用值栈的push和set方法手动操作值栈
//调用值栈对象的set方法
stack.set("setname", "Kevin"); //调用值栈对象的push方法
stack.push("Brank");
三、从值栈中获取数据
1. 字符串存取
【向值栈中存入字符串数据】
第一步:定义对象变量并生成变量的get方法
//向值栈中存入字符串数据
private String username;
public String getUsername(){
return username;
}
第二步:在执行方法中给变量赋值
public String execute() throws Exception {
//给字符串复制
username="Kevin"; return SUCCESS;
}
【从值栈中获取字符串数据】
<!-- 从值栈中获取字符串值 -->
<h3>获取字符串</h3>
<s:property value="username"/><br/>
2. 对象存取
【向值栈中存入 对象数据】
第一步:定义对象变量并声称get方法
//向值栈中存入对象数据
private User user=new User();
public User getUser() {
return user;
}
第二步:在执行方法中给对对象赋值
public String execute() throws Exception { //给对象赋值
user.setAddress("China");
user.setPassword("admin");
user.setUsername("Kevin"); return SUCCESS;
}
【从值栈中获取 对象数据】
<!-- 从值栈中获取对象 -->
<h3>获取对象</h3>
<s:property value="user.username"/>
<s:property value="user.password"/>
<s:property value="user.address"/>
3. List集合存取
【向值栈中存入 List集合】
第一步:定义集合变量并生成get方法
//向值栈中存入列表数据
private List<User> list=new ArrayList<User>();
public List<User> getList() {
return list;
}
第二步:在执行方法中给list集合赋值
public String execute() throws Exception { //在执行方法中给变量赋值
User user1=new User();
user1.setAddress("America");
user1.setPassword("admin");
user1.setUsername("Kevin"); User user2=new User();
user2.setAddress("British");
user2.setPassword("admin");
user2.setUsername("Brank"); list.add(user1);
list.add(user2); return SUCCESS;
}
【从值栈中获取 List集合】
<!-- 从值栈中获取列表 -->
<h3>获取列表第一种方式</h3>
<s:property value="list[0].username" />
<s:property value="list[0].password" />
<s:property value="list[0].address" />
<br/>
<s:property value="list[1].username" />
<s:property value="list[1].password" />
<s:property value="list[1].address" />
<br/> <h3>获取列表第二种方式</h3>
<!-- 使用struts2标签 类似于jstl的foreach循环
s:iterator 遍历值栈的list集合 c:foreach items="" var="user"
${user.username}
/foreach
-->
<s:iterator value="list">
<!-- 遍历list得到list里面的每个user对象 -->
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
<br/>
</s:iterator> <h3>获取列表第三种方式</h3>
<s:iterator value="list" var="user">
<!-- 遍历值栈list集合,得到每个user对象
机制:把每次遍历出来的user对象放到context里
获取context里的数据特点:写ognl表达式
使用特殊符号#
-->
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
<br/>
</s:iterator> <h3>使用foreach标签+EL表达式获取list方法设置的值</h3>
<!-- 使用foreach标签+EL表达式获取值栈list集合数据 -->
<c:forEach items="${list }" var="user">
${user.username }
${user.password }
${user.address }
</c:forEach>
[ SSH框架 ] Struts2框架学习之三(OGNl和ValueStack值栈学习)的更多相关文章
- Struts2第九篇【OGNL、valueStack详解】
什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式. Struts2框架使用OGNL作为默认的表达式语言. 为什么我们学 ...
- Struts2之 OGNL表达式和值栈
技术分析之OGNL表达式概述(了解) 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意 ...
- [ SSH框架 ] Struts2框架学习之一
一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...
- [ SSH框架 ] Struts2框架学习之二
一.Struts2访问Servlet的API 前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 Str ...
- [ SSH框架 ] Struts2框架学习之四(自定义拦截器)
一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...
- Spring框架+Struts2框架第一次整合
1:Spring框架和Struts2框架如何整合??? Spring 负责对象创建 Struts2 用Action处理请求 2:Spring与Struts2框架整合的关键点: 让struts2框架ac ...
- Struts2学习(四)———— ognl表达式、值栈、actionContext之间的关系
一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任意属性,简单说就是对javabean进行操作(重要) 2.调用 ...
- struts2(四) ognl表达式、值栈、actionContext之间的关系
今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...
- struts2 ognl表达式访问值栈
1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action.Result.Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱. ...
随机推荐
- Python学习 - 输入和输出
#输出 print('hello, python') print('The quick brown fox', 'jumps over', 'the lazy dog') #多个字符串,用逗号隔开,就 ...
- Variant does not reference an auomation object
今天两个用户突然报错. 应用场景:审核或撤审核 字面意思:变量无法映射到对象,应该是调用对象的时候找不到.会不会是杀毒软件删除掉了. 两个用户都用了瑞星杀毒,哥不是黑,确实.应该是审核元被删掉 了. ...
- html详解(三)
7.表格标签. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- EBS中内部银行相关API
来自:http://www.itpub.net/thread-1772135-1-1.html 1.创建银行 -- Create Bank DECLARE p_init_msg_list VARCHA ...
- 开源视频平台:Kaltura
Kaltura是一个很优秀的开源视频平台.提供了视频的管理系统,视频的在线编辑系统等等一整套完整的系统,功能甚是强大. Kaltura不同于其他诸如Brightcove,Ooyala这样的网络视频平台 ...
- 《java入门第一季》之面向对象(重头戏多态)
接下来介绍java第三大特性--多态性 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有 ...
- windows下追踪路由
追踪路由 tracert 目标ip/域名 测试两个ip是否畅通 ping 目标ip 在windows查看ip情况 ipconfig linux/unix下查看ip情况的使用 ifconfig
- 【56】java本地文件File类详解
1.java类的介绍 public class File extends Object implements Serializable, Comparable<File> 文件和目录路径名 ...
- HBase缓存的使用
hbase中的缓存分了两层:memstore和blockcache. 其中memstore供写使用,写请求会先写入memstore,regionserver会给每个region提供一个memstore ...
- 设计模式学习--组合模式,c++代码
下面是组合模式的UML类图: <span style="font-family:Microsoft YaHei;font-size:18px;"><span st ...