Struts2值栈和ognl表达式

    xiaoxiao2021-03-25  103

    值栈

    在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操作值栈

    从值栈中获取数据

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

    获取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>获取push方法设置的值 使用push方法设置的值没有名称,只有设置的值用push方法向值栈放的数据都存在top数组中,根据数组来获取值

    EL表达式也能获取到值栈中的值,但效率低,因为它先在域对象中找对应的值,如果找到则直接返回,如果没找到则到值栈中的获取,并放入域对象中


    ognl中的#和%

    #:获取context中的数据, 如<s:property value="#request.req"/>%:struts2标签中的表单标签 如果直接在struts2表单标签里使用ognl表达式不能够被识别。只有%之后才会识别。如<s:textfield name="username" value="%{#request.req}"></s:textfield>
    转载请注明原文地址: https://ju.6miu.com/read-10218.html

    最新回复(0)