Struts2第二天:值栈以及数据存取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ilikejj0/article/details/81987087

一、OGNL概述:
是一种表达式,功能比EL表达式更为强大,一般和struts2标签一起使用操作值栈数据ONGL不是struts2的一部分,只是经常和struts2标签一起使用。
使用时,需要导入jar包。并且在jsp页面需要引入标签库

<%@ taglib uri="/struts-tags" prefix="s" %>

二、什么是值栈
在之前的web阶段,在servlet里面进行操作,把数据放到域对象中,在页面中使用El表达式获取其中的值,域对象,在一定范围内,进行存值取值。

在struts2中,本身提供了一种存储机制,类似于域对象,是值栈,可以进行存值和取值。在Action中把数据存储到值栈中,在页面进行获取。

Servlet和值栈的区别:
Servlet默认是在第一次访问的时候创建,只创建一次,是单实例对象
Action是每次访问都会创建对象,是多实例对象

值栈的存储位置
每次访问的时候都会创建Action对象,每个Action对象中都有一个值栈对象(只有一个),两次获取值栈对象,输出地址,会发现他们的地址一样。

三、获取值栈(有很多种方式)
常用方式:使用ActionContext类中的方法得到值栈对象。

public class ActionStack extends ActionSupport {
    @Override
    public String execute() throws Exception {
        ActionContext context = ActionContext.getContext();
        ValueStack valueStack = context.getValueStack();        
        return NONE;
    }
}

栈:元素先进后出,放下一个元素叫压栈,最上面的元素叫栈顶元素。

值栈分为两部分:一是root部分,是list结构,二是context部分,是Map结构。
一般操作的都是root里面的数据
context部分中key的值一般都是固定的,如request,session等,value是其对应的引用。
struts2里面标签 s:debug,使用这个标签可以查看值栈结构和存储值
(1)访问action,执行action的方法有返回值,配置返回值到jsp页面中,在jsp页面中使用这个标签
(2)点击这个连接,即可看到其结构。
值栈结构
在Action中没有进行任何操作的时候,栈顶就是Action的引用。

Action对象中有值栈对象,值栈对象中有Action的引用

四、向值栈中添加数据
(1)、最常用:在Action中定义变量,然后生成变量的get方法。

public class ActionStack extends ActionSupport {    
    private String name;
    public String getName() {
        return name;
    }   
    public String execute() throws Exception {
        name="123456";
        return "OK";
    }
}

向值栈中加入数据

扫描二维码关注公众号,回复: 3151461 查看本文章

(2)、获取值栈对象,调用对象中的set方法
(3)、获取值栈对象,调用对象中的push方法

向值栈中添加对象(使用上面的第一种方式)
实现:定义变量对象,生成变量对象的get方法,在执行的方法里面向对象设置值。此时对象也是放在Action中,不会在栈中开辟新的空间
向值栈中放list也是一样。

五、从值栈中获取数据
1 使用struts2的标签+ognl表达式获取值栈数据

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

(1)、从值栈中去字符串

<s:property value="name"></s:property>

(2)、获取对象的值

User
<s:property value="user.username"></s:property>

(3)、获取list集合中的数据

list<User>     不灵活
<s:property value="list[0].username"></s:property>
注意<!--  -->不能够注释struts2标签,需要使用<%-- --%>注解
<s:iterator value="list">
    <!-- 这里得到的就是每一个User对象,所以直接输出他的属性值即可 -->
    <s:property value="username"></s:property>
</s:iterator>

最常用的是下,面这种方式

最常用
<s:iterator value="list" var="user">
    <!-- 这里得到是每次遍历出来的user
        机制:把每次遍历出来的user都放到context里面,
        会在context的map结构下临时加一个key-value键值对
        key:user,value:user对象的引用
        获取context里面的数据有一个特点,
        使用ONGL的使用需要使用一个特殊的符号:#
     -->
    <s:property value="#user.username"></s:property>
</s:iterator>

EL表达式为什么能够取到值栈数据?
EL表达式取的是域对象中的值,
能够取值栈中的值的原理是:底层增强了request对象中的getAttribute方法,El表达式取值的时候,首先从request域中取值,如果取得到,就返回,如果取不到,就把值栈中的值获取出来,放到request域中。但是不建议使用EL表达式进行取值,这样的性能很低。

ONGL表达式
#获取context中的值,context是map结构,里面的key是固定的,所以可以用来去放在request中的值
%:主要是在struts2标签中去使用。

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

猜你喜欢

转载自blog.csdn.net/ilikejj0/article/details/81987087