• OGNL与值栈


    一、OGNL入门

    1、什么是OGNL

      OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言。使用这种表达式语言,可以通过使用某种表达式语言,来存取Java对象的任意属性,调用Java的方法,同时能够自动实现必要的数据类型转换,

    2、OGNL的作用

      Struts2默认的表达式语言就是ognl表达式语言,该语句具有以下的特点

        • 支持对象方法的调用。例如:objectName.methodName().
        • 支持静态方法调用和值访问,表达式的格式为@[类全名]@[方法名 | 值名] 例如:@java.lang.String@format('foo %s','bar')。
        • 支持赋值操作和表达式串联。
        • 访问OGNL上下文对象(OGNL Context)和ActionContext
        • 操作集合对象。

    3、OGNL表达式的要素   

    (1)表达式

      表达式是整个OGNL表达式的核心,OGNL会根据表达式中的对象去取值。

    (2)根元素(root)

      root元素可以理解为OGNL表达式要操作的对象

    (3)context  

      context对象中保存了对象的引用的map集合

    4、OGNL表达式实例   

      使用OGNL表达式获取字符串的长度

      

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%--要使用struts2标签,必须要引入struts2标签库 --%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%--
            1、ognl表达式必须要在struts2标签中使用
            2、在ognl表达式中可以直接调用Java的方法
            3、value的值就是ognl表达式
         --%>
        <s:property value="'hello ongl'.length()"/>
    </body>
    </html>

    二、struts2的值栈

    1、什么是值栈

      值栈(ValueStack)是Struts的一个接口,ognlValueStack是该接口的一个实现类,客户端发起一个action请求时会创建一个action实例同时也会创建一个值栈实例,该值栈贯穿整个Action的生命周期,struts2使用ognl将请求action的参数封装为对象存储到值栈中去,并通过ognl表达式去读取值栈中对象属性的值

    2、Struts2 与值栈

       在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值。

      (1)在action里面把数据放到值栈里面,在页面中获取到值栈数据

    3、Action与Servlet的不同点

      (1)Servlet:默认在第一次访问时候创建,创建一次,单实例对象

      (2)Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次,多实例对象

    4、值栈的存储位置

      (1)值栈存储在Action对象中,

      (2)在每个action对象里面都会有一个值栈对象(只有一个)

    5、值栈的内部结构

      可以使用struts2的<debug>标签来查看值栈的内部结构 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <s:debug></s:debug>
    </body>
    </html>

    通过该标签查看到的结构如下图:

    说明:在图中可以看到该值栈中有两块数据,一个是root,一个是context。

      (1)在我们的使用中一般都是操作root,操作context比较少。

      (2)root的内部结构是list结合,context内部的结构是map集合。

      (3)context中主要存储的是一些对象的引用。

  • 相关阅读:
    iBatisnet 1.5版本的配置文件的几个变化
    使用Trace时要注意
    无刷新转页面?
    无刷新“页面跳转”问题一:与AtlasToolKit协同工作
    Assembly的Release与Debug
    iBatis.Net系列(四) iBatisNet API基础
    Atlas 调用web service
    无刷新“页面跳转”
    iBatis.Net系列(六) ResultMap
    在GridView中格式化时间字段
  • 原文地址:https://www.cnblogs.com/jack1995/p/6972625.html
Copyright © 2020-2023  润新知