.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表达式}

原文地址:https://www.cnblogs.com/zltao/p/10481817.html