• 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表达式来访问时需要加上“#”作为前缀。

        剩余不一一讲解。

  • 相关阅读:
    Linux_DNS服务器
    Linux_DNS服务器
    Linux_FTP服务器
    Linux_FTP服务器
    Linux_DHCP&DHCP Relay
    分布式内存存储式元数据服务的构建
    如何提高分布式系统的可观察性:Insight Tool的引入
    论分布式系统中Metric框架的设计
    分布式存储系统关于GDPR条例中的数据清除原则
    Pipeline并行处理模型
  • 原文地址:https://www.cnblogs.com/yejiaojiao/p/5858908.html
Copyright © 2020-2023  润新知