Struts2值栈和ognl表达式

值栈

  • 在struts2中提供的一种存储机制,类似于域对象,可以存值和取值
  • 在action里把数据放到值栈中,在页面中获取到值栈数据
  • servlet和action的区别:
    • Servlet:默认在第一次访问时创建,只创建一次,单实例对象
    • Action:访问时创建,每次访问action时,都会创建一个action对象,创建多次,多实例对象
  • 值栈存储位置:
    • 每次访问action时,都会创建action对象
    • 在每个action对象里有且只有一个值栈对象
  • 获取值栈对象:
    • 常用方式:使用ActionContext类里面的方法得到值栈对象
      • (ActionContext.getContext()).getValueStack()
  • 值栈的内部结构:
    • 分两部分
      • root:继承ArrayLiat类,结构是list集合
      • context:继承Map类,结构是map集合
    • 使用s:debug标签可以查看值栈结构和存储值
    • 值栈对象中有action的引用
  • 向值栈中存放数据的三种方式
    • 获取值栈对象,调用值栈对象里的set方法
    • 获取值栈对象,调用值栈对象里的push方法
    • 在action中定义变量,生成变量的get方法
      • 变量定义在action中,不用分配额外空间
  • 向值栈中存放对象
    • 实现步骤:
      • 定义对象变量
      • 生成变量的get方法
      • 在执行的方法里面设置对象的值

ognl

  • struts2默认的表达式语言,不属于struts2,但一般一起使用
  • 在struts2中操作值栈数据
  • ognl.jar包
  • 在jsp页面引入ognl标签库<%@ taglib uri="/struts-tags" prefix="s"%>

ognl操作值栈

  • 从值栈中获取数据

    1. 获取字符串:在jsp页面ognl标签中的name和值栈中的属性名相同,如
    2. 获取对象:
    3. 获取list对象:

      • <s:property value="list[0].username"/>

        • “`java
          //遍历值栈list集合




          * 
          * ```java
           //用这种方式遍历会在值栈的context部分分配一段临时空间,把遍历出来的user对象放到里面,因为contextmap结构,所以放进去的key是ognl表达式var的值,value是遍历出来的user对象的引用。要取context中的值在ognl表达式中要加#符号
           <s:iterator value="list" value="user">
             <s:property value="#user.username"/>
             <s:property value="#user.password"/>
           </s:iterator>
    4. 获取push方法设置的值
      • 使用push方法设置的值没有名称,只有设置的值
      • 用push方法向值栈放的数据都存在top数组中,根据数组来获取值
  • EL表达式也能获取到值栈中的值,但效率低,因为它先在域对象中找对应的值,如果找到则直接返回,如果没找到则到值栈中的获取,并放入域对象中


ognl中的#和%

  • #:获取context中的数据, 如<s:property value="#request.req"/>
  • %:struts2标签中的表单标签
    • 如果直接在struts2表单标签里使用ognl表达式不能够被识别。只有%之后才会识别。如<s:textfield name="username" value="%{#request.req}"></s:textfield>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值