首页 > 代码库 > OGNl和ValueStack的基础和深入分析

OGNl和ValueStack的基础和深入分析

一、OGNL

1)什么是OGNL?

  解析:OGNL是Object Graph Navigation Language(对象图导航语言)它是强大的表达式语言。

2)用途:通过简单一致的表达式语法来读取和设置java对象的属性值。(调用对象方法,遍历整个对象的结构图,实现

    字段类型转换等功能)

3)OGNL表达式的计算都是围绕OGNL上下文来进行的,OGNl上下文实际上就是一个Map对象,由ognl.OgnlContext类

  (实现了java.util.Map接口)来表示。OGNL上下文可以包含一个或者多个JavaBean对象。(对象就是上下文的根

   root对象)

二、例子

1Action类

  技术分享

2、配置省略......

3、视图代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%@taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href=http://www.mamicode.com/"<%=basePath%>">        <title>My JSP index.jsp starting page</title>      </head>    <body>  <!--     单列集和 -->    <s:property value=http://www.mamicode.com/"name"/>       <!--  双列集合 -->        <s:iterator value=http://www.mamicode.com/"#list" var="item">            <%-- <s:property value=http://www.mamicode.com/"#item.name"/> --%>            <s:property value=http://www.mamicode.com/"name"/>        </s:iterator>        <a href=http://www.mamicode.com/"/Struts2_05/upload">测试</a>        <s:debug/>  </body></html>

 

  解析:

  <!--     单列集和 -->    <s:property value="http://www.mamicode.com/name"/>       <!--  双列集合 -->        <s:iterator value="http://www.mamicode.com/#list" var="item">            <%-- <s:property value="http://www.mamicode.com/#item.name"/> --%>            <s:property value="http://www.mamicode.com/name"/>        </s:iterator>

  通过上面的例子我们发现在Action类中我们使用了两种方式向ValueStack中赋值,且在视图页面进行读取时的语法也不一样,只是为什么呢?这就要说到ValueStack了。

三、首先我们先了解ValueStack

 1、ValueStack也就是值栈,简单的来说,值栈就是框架创建的一个存储区域,用来保存Model对象。它具有栈的特性,可以存放多个对象。

 2、特点:后进先出的栈

 3、值栈通过一个接口(com.opensymphony.xwork2.util.ValueStack)来定义,对应的实现类是com.opensymphony.xwork2.util.OgnlValueStack

 在视图页面中我们也可以使用<s:debug></s:debug>标签来查看值栈中的信息,如图所示:

技术分享

  解析:从上图中我们可以看出页面显示的ValueStack中大致划分了Value Stack Contents和 Stack Context两块儿区域:

    其中Value Stack Contents是Root对象其以ArrayList的形式存放数据。OGNL表达式语言可以直接通过Property Name名称来获取其对应的值。

    Stack Context中的数据则存放在Context中其是以map集合的形式来存放数据的。在是用OGNL表达式来访问时需要加上“#”作为前缀。

    剩余不一一讲解。

 

OGNl和ValueStack的基础和深入分析