Struts2【OGNL、valueStack】就是这么简单
什么是OGNL表达式?
OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式。 Struts2框架使用OGNL作为默认的表达式语言。
为什么我们学习OGNL
在学习JSP的时候,我们已经学习过了EL表达式。EL表达式用起来也十分简单...我们在Struts2框架中也是可以使用EL表达式的...那么OGNL表达式好在哪里呢??
- 支持对象方法调用,如xxx.doSomeSpecial()
 - 支持类静态的方法调用和值访问,表达式的格式【例如:"@@floor(10.9)"就是调用Math.floor()的方法了】
 - 支持赋值操作和表达式串联【这个其实EL表达式也能做】
 - 访问OGNL上下文(OGNL context)和ActionContext
 - 操作集合对象【EL只能遍历集合,OGNL可以创建集合】
 
OGNL是Struts2的默认表达式语言,OGNL是配搭Strut2的标签使用的..我们学习了OGNL表达式,就可以更好地理解Struts2标签的运行以及Struts2内部的存储结构.
valueStack对象
在讲解OGNL表达式之前,我们先来看看valueStack对象...valueStack是Struts2数据存储的核心...我们首先要知道数据是怎么存的,存到哪里,然后才讲解OGNL表达式是怎么取出数据的。
valueStack也被称作值栈对象..
- 当用户访问Action,都会创建一个Action对象,ActionContext对象、valueStack对象..
 - Struts2把Action对象放进valueStack对象之中。
 - 将valueStack放进request域中,传入JSP页面(key: struts.valueStack)
 - JSP页面就可以使用OGNL表达式获取值栈中的数据了!
 
获取valueStack对象
- 在Action中我们可以手动获取值栈对象,有两种方式获取:
 
	//获取值栈对象的2种方式
	private void getVs() {
		// 获取值栈对象,方式1:
		HttpServletRequest request = ServletActionContext.getRequest();
		ValueStack vs1 = (ValueStack) request.getAttribute("struts.valueStack");
		// 获取值栈对象,方式2:
		ActionContext ac = ActionContext.getContext();
		ValueStack vs2 = ac.getValueStack();
		System.out.println(vs1 == vs2);//true
	}
valueStack内部存储结构
上面已经说了,用户访问Action时,会创建Action对象,valueStack对象。Struts2内部会将Action对象存到valueStack对象之中...那么valueStack的存储结构是什么样的呢???我们来看看
CompoundRoot
Action对象和Action的成员属性等值都是存到CompoundRoot下的.该CompoundRoot继承着ArrayList,因此它是List结构的
	public class CompoundRoot extends ArrayList {}
OgnlContext
OgnlContext对象存储着相关的域对象:request、response、session等数据,实现Map集合,是Map结构..
为了让request、response等域对象可以存储多个值,值也是使用Map结构...
public class OgnlContext implements Map {}
小总结
CompoundRoot保存着这样的数据:
- Action对象以及Action对象的成员属性数据
 - 使用ValueStack对象.push()进去的数据
 - 使用ValueStack对象.set()进去的数据
 - 其他代理对象的数据
 
OgnlContext保存着这样的数据:
- 维护了CompoundRoot中所有的数据
 - request、response等域对象所有的数据
 
OGNL表达式取值
- Struts2会将valueStack对象封装进request对象域中,传入JSP页面。
 - valueStack存储着OgnlContext对象。
 - OgnlContext对象维护了CompoundRoot对象的数据
 - CompoundRoot存储着Action等数据
 
也就是说通过OgnlContext对象可以获取大部分我们需要的数据了。
那么OGNL表达式是怎么取出OgnlContext对象中数据的呢??下面我们通过硬编码的方式来讲解:
	/**
	 * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号
	 * @throws Exception
	 */
	@Test
	public void testOgnl() throws Exception {
		// 创建一个Ognl上下文对象
		OgnlContext context = new OgnlContext();
		// 放入数据
		User user = new User();
		user.setId(100);
		user.setName("Jack");
		// 【往非根元素放入数据, 取值的时候表达式要用"#"】
		context.put("user", user);
		// 获取数据(map)
		// 先构建一个Ognl表达式, 再解析表达式
		Object ognl = Ognl.parseExpression("#user.name");
		Object value = Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
	/**
	 * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号
	 * @throws Exception
	 */
	@Test
	public void testOgn2() throws Exception {
		// 创建一个Ognl上下文对象
		OgnlContext context = new OgnlContext();
		// 放入数据
		User user = new User();
		user.setId(100);
		user.setName("Jack");
		// 【往根元素放入数据】
		context.setRoot(user);
		// 获取数据(map)
		// 先构建一个Ognl表达式, 再解析表达式
		Object ognl = Ognl.parseExpression("address.province");
		Object value = Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
也就是说,JSP页面中取出数据的时候,它会先构建一个OGNL表达式,再解析表达式
- 如果是CompoundRoot类的数据,表达式不需要带#号
 - 如果不是CompoundRoot类的数据,表达式需要带#号
 
例子:
  	<!-- 页面: 必须要拿到ValueStack -->
     <br/>1. 取根元素的值<br/>
     <s:property value="user.id"/>
     <s:property value="user.name"/>
     <s:property value="user.address"/>
     <s:property value="user.address.city"/>
     <s:property value="user.address.province"/> 
      <br/>2. 取非根元素的值<br/>
      <s:property value="#request.cn"/>
      <s:property value="#session.Session_data"/>
      <s:property value="#application.Application_data"/>    <br/>
      <!-- 自动找request/session/application,找到后立刻返回 -->
      <s:property value="#request_data"/>
      <s:property value="#attr.Session_data"/>
      <s:property value="#attr.Application_data"/>  <br/>
      <!-- 获取请求的参数数据 -->
      <s:property value="#parameters.userName"/>
     <!-- struts的调试标签:可以观测值栈数据 -->
     <s:debug></s:debug>
OGNL对静态方法的调用
	/**
	 * 3.Ognl对 静态方法调用的支持
	 * @throws Exception
	 */
	@Test
	public void testOgn3() throws Exception {
		// 创建一个Ognl上下文对象
		OgnlContext context = new OgnlContext();
		// Ognl表单式语言,调用类的静态方法
		//Object ognl = Ognl.parseExpression("@Math@floor(10.9)");
		// 由于Math类在开发中比较常用,所以也可以这样写
		Object ognl = Ognl.parseExpression("@@floor(10.9)");
		Object value = Ognl.getValue(ognl, context, context.getRoot());
		System.out.println(value);
	}
OGNL创建集合
    <br/>一、.构建 list集合</br>
    <s:iterator var="str" value="{'a','b'}">
    	<s:property value="#str"/>
    </s:iterator>
     <br/>一、.构建 map集合</br>
     <s:iterator var="en" value="#{'cn':'China','usa':'America'}">
     	<s:property value="#en.key"/>
     	<s:property value="#en.value"/>  <br/>
     </s:iterator>
构建Map集合的时候,需要使用#号
OGNL 几个特殊的符号#
#获取非根元素值  、 动态都建map集合
$  在配置文件取值
%  提供一个ognl表达式运行环境
<body>
  	 <br/>获取request域数据<br/>
  	 <!-- property 标签是对象类型的标签,默认支持ognl表达式, 会从根元素去China名称对应的值 -->
  	 <s:property value="China"/>		<br/>
  	 <!-- 如果直接赋值,需要用单引号 -->
  	 <s:property value="'China'"/>		<br/>
  	 <s:property value="%{#request.cn}"/>		<br/>
  	 <!-- 值类型的标签,value值默认就是值类型,不支持ognl表达式 -->
  	 国家:<s:textfield name="txtCountry" value="%{#request.cn}"></s:textfield>
  </body>
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y
Struts2【OGNL、valueStack】就是这么简单的更多相关文章
- struts2 OGNL ValueStack概念理解 # % $ 的区别
		
http://blog.csdn.net/tjujacob/article/details/8117659 —————————————————————————————————————————————— ...
 - Struts2(Ognl)
		
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
 - Struts2:ValueStack
		
一.ValueStack 1 .ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用 ...
 - 浅析=======Struts2之==========valueStack
		
今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...
 - Struts2的配置和一个简单的例子
		
Struts2的配置和一个简单的例子 笔记仓库:https://github.com/nnngu/LearningNotes 简介 这篇文章主要讲如何在 IntelliJ IDEA 中使用 Strut ...
 - Struts2中ValueStack结构和总结
		
[ValueStack和ActionContext的关系] 首先,从结构上来看ValueStack是ActionContext的一个组成部分,是对ActionContext功能的扩展.ActionCo ...
 - 使用Struts2和jQuery EasyUI实现简单CRUD系统(转载汇总)
		
使用Struts2和jQuery EasyUI实现简单CRUD系统(一)——从零开始,ajax与Servlet的交互 使用Struts2和jQuery EasyUI实现简单CRUD系统(二)——aja ...
 - java框架之Struts2(3)-OGNL&ValueStack
		
OGNL 概述 OGNL 是 Object-Graph Navigation Language 的缩写,它是一种第三方的.功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用 ...
 - struts2重点——ValueStack和OGNL
		
一.值栈(ValueStack) 1.实现类:OGNLValueStack 2.对象栈:CompoundRoot(针对的是类级别的) (1)继承自 ArrayList —— 先进后出 (2)提供了栈的 ...
 - Struts2  OGNL表达式、ValueStack
		
OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性 ...
 
随机推荐
- Centos-7 + Docker-1.12 中 devicemapper + direct_lvm 的 Docker 存储配置
			
html,body { font-size: 12pt } body { font-family: Helvetica, "Hiragino Sans GB", "微软雅 ...
 - 从Myeclipse到Intelj Idea
			
前言:经历了从eclipse到Myeclipse的时间,大学时候用Eclipse,开始工作的时候选择Myeclipse,都能体会到Java的IDE的先进和高明之处,直到最近,公司项目采git和Grad ...
 - mybatis自动生成mapper,dao映射文件
			
利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...
 - eslint规则
			
碰到eslint报错, 把错误的提示拷贝在这里Ctrl + F找到复制到eslint.js里面就行了. "off"或者0,不启用这个规则 "warn"或者1,出 ...
 - Mock摆脱后端拖拉(借鉴官网)(一)
			
mock是一个模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试.mock有如下功能 根据数据模板生成模板数据 模拟ajax请求,生成请求数据 基于html模板生成模拟数据 下载安装 n ...
 - Linux常用命令详解(一)  -- 处理目录常用命令
			
ls:列出目录 作用:查看linux文件夹包含的文件以及其权限(包括目录.文件夹.文件权限)和目录信息等 命令格式:ls [选项] [文件或目录] 选项或参数: ...
 - Ubuntu14.04+Nginx+MySql+PHP环境配置
			
http://www.cnblogs.com/gophper/p/4793711.html
 - Mac下VirtualBox共享文件夹设置
			
环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...
 - NJU 1010 Air
			
思路:把那张图打表(吐血...),然后就按照规则输出就行. AC代码 #include <cstdio> #include <cmath> #include <cctyp ...
 - JavaScript网页全屏API
			
在大多数的浏览器中都有实现网页全屏显示的功能,并且大部分浏览器实现全屏显示和退出全屏显示的快捷键通常是F11和Esc两个按键.如今,W3C已经制定了关于网页全屏显示的API,利用这个API 可以实现网 ...