zoukankan      html  css  js  c++  java
  • .Net转Java自学之路—Struts2框架篇三(值栈)

    OGNL概述:

      OGNL是一种表达式,Struts2默认的表达式语言就是OGNL,该表达式功能更加强大。它具有一下特点:
        》支持对象方法调用。例:obj.methodName();
        》支持类静态方法调用和值访问,表达式的格式:@[类全名(包括包路径)]@[方法名|值名] 例:@java.lang.String@format("foo%","bar");
        》支持赋值操作和表达式串联。
        》访问OGNL上下文(OGNL context)和ActionContext 。
        》操作集合对象。

      OGNL的主要用途:

        》在Struts2中操作值栈数据。
        》一般把OGNL放在Struts2中操作:和Struts2标签一起使用来操作值栈。OGNL不是Struts2的一部分。它是一个单独的项目,只是经常和Struts2一起使用。
          使用OGNL时,首先导入jar包,该jar包在Struts2中提供。

    OGNL入门案例:使用ognl+struts2标签计算字符串长度

    <%@taglib prefix="s" uri="/struts-tags"%>
    
    <body>
        <s:property value="'计算的字符串'.length()">
    </body>

    什么时值栈:

      在Struts2中提供本身的一种存储机制,该机制类似于域对象就是值栈,可以存值和取值。在action中把数据放到值栈中,在页面中获取值栈数据。

      servlet和action的区别:

        servlet:默认在第一次访问时创建,创建一次。单实例对象。
        action:访问时创建,每次访问action时都会创建action对象,创建多次。多实例对象。

      值栈存储位置:

        》每次访问action时,都会创建action对象。
        》在每个action对象中都会有一个值栈对象。

    如何获取值栈对象:

      获取值栈对象,使用ActionContext类中的方法获取值栈对象。ValueStack stack = ActionContext.getContext().getValueStack();每个action对象中只有一个值栈对象。

    值栈内部结构:

      所谓栈,就是数据结构中的一种结构。先进后出。值栈分为俩部分:root、context

      root:结构是list集合。一般操作都是root中的数据。

      context:结构是Map集合。存储的是对象引用。存储的key的值都是固定的,value是对应的对象引用。key值有:
        request:对应的value值是request对应引用。
        session:HttpSession对象引用。
        application:ServletContext对象引用。
        parameters:传递相关的参数。
        attr:三个域对象,向三个域对象放值,名称都相同。setAttribute("name",value);使用attr操作,获取域对象中的值,获取的是域范围最小中的值。

    向值栈放数据:结构时Map集合。

      s:debug标签:使用该标签可以查看值栈结构和存储值。
        》访问action,执行action中的方法有返回值,配置返回值到jsp页面中。
        》在action没有做任何操作时,栈顶元素时action引用。
        》action对象中有值栈对象,值栈对象中有action引用。

      向值栈放数据:

    ActionContext context=ActionContext.getContext();
    ValueStack stack=context.getValueStack();

        》获取值栈对象,调用值栈对象中的set方法。

    stack.set("key",value);//放进去的数据是一个HashMap

        》获取值栈对象,调用值栈对象中的push方法。

    stack.push(value);//放进去的数据是一个String

        》在action定义变量,生成变量的get方法。该方式存放的值的位置在action中,不需要重新分配内存空间。比较节约资源。

    从值栈获取数据:

      使用struts2标签+ognl表达式获取值栈数据。

    <s:property value="ognl表达式" />

      s:iterator标签使用:遍历值栈的list集合。

    <s:iterator value="list">
        <a:property value="属性名称"/>
    <s:iterator>
    <!--
      遍历值栈list集合,得到每个user对象。
      机制:把每次遍历出来的user对象放到context对象中。
      获取context中的数据:需要在ognl表达式前加#号。
    --> <s:iterator value="list" var="user"> <a:property value="#user.属性名称"/> <s:iterator>

      其他操作:

        使用set方法向值栈放数据。获取:

    <a:property value="set的key" />

        使用push方法向值栈放数据。获取:
          》使用push方法设置值,没有名称,只有设置的值。
          》向值栈放数据,把向值栈放的数据存到数组中,数组名称为:top,根据数组来获取值。

    <s:property value="[0].top">

    EL表达式获取值栈数据:

      1、EL表达式获取域对象的值。
      2、向域对象中放值需要使用setAttribute方法,获取值需要使用getAttribute方法。
      3、底层增强request对象中的方法getAttribute方法。增强过程:
        》首先从request域中获取值,如果获取到,直接返回。
        》如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象中。

    OGNL表达式#、%的使用:

      #:使用#+ognl表达式获取context中的数据。
      %:在struts2标签中的表单标签中使用。在struts2标签中使用ognl表达式,若直接在struts2表单标签中使用ognl表达式,则不能识别。只有使用%之后才会识别。
        %{ognl表达式}

  • 相关阅读:
    intel 蓝牙驱动安装时报错
    H310C,B365,M.2 NVME SSD,USB3.0,安装 WIN7 64 位
    C# .NET 判断输入的字符串是否只包含数字和英文字母
    squid http,https, 代理,默认端口3128
    C# .net mvc web api 返回 json 内容,过滤值为null的属性
    centos7安装python-3.5
    systemctl命令完全指南
    Centos7中systemctl命令详解
    Python if 和 for 的多种写法
    CentOS 7.0,启用iptables防火墙
  • 原文地址:https://www.cnblogs.com/zltao/p/10481817.html
Copyright © 2011-2022 走看看