OGNl和ValueStack的基础和深入分析

Posted 葉子。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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="<%=basePath%>">
    
    <title>My JSP \'index.jsp\' starting page</title>
    
  </head>
  
  <body>
  <!--     单列集和 -->
    <s:property value="name"/>
    
   <!--  双列集合 -->
        <s:iterator value="#list" var="item">
            <%-- <s:property value="#item.name"/> --%>
            <s:property value="name"/>
        </s:iterator>
    
    <a href="/Struts2_05/upload">测试</a>
    
    <s:debug/>
  </body>
</html>

 

  解析:

  <!--     单列集和 -->
    <s:property value="name"/>
    
   <!--  双列集合 -->
        <s:iterator value="#list" var="item">
            <%-- <s:property value="#item.name"/> --%>
            <s:property value="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的基础和深入分析的主要内容,如果未能解决你的问题,请参考以下文章

Struts2数据传输的背后机制:ValueStack(值栈)

[ SSH框架 ] Struts2框架学习之三(OGNl和ValueStack值栈学习)

Struts 中 ActionContext ctx.put()把数据放到ValueStack里之数据传输背后机制:ValueStack(值栈)

struts2 ValueStack

Struts_ValueStack,Ognl

Struts2Ognl与ValueStack