Ognl表达式

1.概述

1.1.是一种功能强大的表达式, 一般和struts2标签一起使用,用来操作值栈
1.2.不是struts2的一部分,但经常一起使用
1.3.使用时需要导入jar包,struts2有提供
1.4.值栈的概念:
<1> struts2本身提供的一种存储机制,类似于域对象,可以存取值
<2> 一般在action中把数据存放至值栈,在前端页面获取
<3> 每次访问action都会创建action对象,每个action对象中都有且仅有一个值栈对象
<4> 值栈对象有多种获取方式,常用ActionContext类中的方法获取
<5> 内部结构:
root部分:list集合结构
context部分:map集合结构

2.基本操作

2.1 前端页面导入标签库
<%@ taglib uri="/struts-tags" prefix="s" %>

*入门案例:显示字符串长度:

<s:property value='"hahahahah".length()'/>
2.2 查看值栈结构和存储值
<s:debug/>
2.3 从值栈存取数据

(1). 存取字符串/对象
向值栈放入字符串/对象:

public class OGNL_one extends ActionSupport {
    private User user=new User();

    public User getUser() {
        return user;
    }

    public String execute(){
        user.setUaddr("add");
        user.setUname("kin");
        return "success";
    }
}

前端用struts2+ognl表达式获取:

<s:property value="user.uname"/>
<s:property value="user.uaddr"/>

(2).存取list集合
向值栈放入list:

public class OGNL_one extends ActionSupport {

    private List<User> list=new ArrayList<User>();

    public List<User> getList() {
        return list;
    }
    public  String listSet(){
        User user1=new User();
        user1.setUname("甲");
        user1.setUaddr("城东");
        user1.setUtime("noon");
        list.add(user1);
        User user2=new User();
        user2.setUname("乙");
        user2.setUaddr("城西");
        user2.setUtime("dawn");
        list.add(user2);
        return "success";
    }
}

前端获取:

<!--
方法一:
     枚举
-->
<s:property value="list[0].uname"/>
<s:property value="list[0].utime"/>
<s:property value="list[0].uaddr"/>
<br/>
<s:property value="list[1].uname"/>
<s:property value="list[1].utime"/>
<s:property value="list[1].uaddr"/>
<!-- ... -->
<br/>
<!--
方法二:
     遍历list得到集合中每个user对象
-->
<s:iterator value="list">
    <s:property value="uname"/>
    <s:property value="utime"/>
    <s:property value="uaddr"/>
    <br/>
</s:iterator>
<!--
方法三:
     遍历list集合,获取每一个user对象
     将遍历得到的user放到值栈的context中,以var命名
     用ognl表达式获取context中数据,使用特殊符号"#"
-->
<s:iterator value="list" var="u">
    <s:property value="#u.uname"/>
    <s:property value="#u.utime"/>
    <s:property value="#u.uaddr"/>
    <br/>
</s:iterator>

*struts2标签无法识别ognl表达式,直接在struts2表单标签中使用ognl表达式应在前加%注明
例:在struts2标签中用ognl表达式获取request域中的值

HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("req","reqValue");

key的名称对应域的名称request

<s:textfield name="username" value="%{#request.req}"/>

(3).set、push方法
直接使用值栈对象里面的方法步骤:
I.获取值栈对象
II.调用set/push方法

//获取值栈对象
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
//调用set方法
stack.set("test","testvalue");
//调用push方法
stack.push("WOWOWOWOW~");

前端获取:
set方法以名称-值的键值对方式存入值栈
前端根据名称获取值

<!--获取set方法设置值-->
<s:property value="test"/>

push方法设置值,没有名称
值栈放数据都存储在top数组里,根据数组获取值

<!--获取push方法设置值-->
<s:property value="[0].top"/>

*top原理为栈,元素先进后出
例如先后push数据A、B,前端获取[0].top,[1].top,结果为B,A

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容