java 值栈的结构_Struts2笔记_值栈

本文详细介绍了Struts2框架中的值栈概念及其结构,包括值栈中的root区域和context区域,展示了如何在Action和JSP页面中使用值栈进行数据操作。

A.值栈概述

值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西。struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区域就是值栈,该值栈对象会贯穿整个Action生命周期,用来存储这个过程中的数据。

B.值栈结构

首先,我们一起去看看struts2中值栈在哪里。找到xwork-core--->com.opensymphony.xwork2.util------>ValueStack

70cb7758294e13c21c29d5266972aafa.png

这个ValueStack是接口,里面没有具体功能实现,并不能拿来直接用,查看它的实现类,发现是OgnlValueStack,也就是说,真正起作用的,底层创建的实例是该实现类。值栈中有两个主要区域:

b9c5d98223a3831eebd43c9612d42b82.png

1.root区域.

点进去看看这个root到底是什么?

public class CompoundRoot extends ArrayList //原来root其实就是一个ArrayList集合,只不过里面添加了出栈和进栈的方法,也就是说它变成栈了,不过还是遵循list集合

CompoundRoot:存储了Action的实例,是ognl的root对象,struts2对原先ognl的root对象改进,使用CompoundRoot自定义栈(扩展了ognl),它读取Action属性值时会先从栈顶对象中找对应的属性,找不到继续找栈中其他对象,找到则停止。

2.context区域

(注: transient是声明对象不允许被序列化) 这里context其实是OgnlContext的上下文。它是一个map结构,里面存放了一些引用。

parameters:该Map中包含当前请求的请求参数。

request::该Map中包含当request对象中的所有属性。

session:该Map中包含当session对象中的所有属性

application:该Map中包含当application对象中的所有属性

attr:该Map按照如下顺序来检索某一个属性:request,session,application.

3.ActionContext和ValueStack的关系

通过查看源码可以知道,在ActionContext创建时,也会创建一个ValueStack对象,并且将该对象给ActionContext。即ActionContext里面有一个valueStack引用,而ValueStack里面也有ActionContext的应用。这一点,我们可以通过利用ActionContext获取Servlet原生API的方式就可以看出。主要就是获取值栈里面的Servlet对象。

C.值栈的使用。

1.获取值栈对象。(同一个Action中获取到的值栈是同一个)

---通过ActionContext对象来获取值栈

//通过ActionContext对象来获取ValueStack对象(其实是一个父类引用指向子类方法)

ValueStack stack1 = ActionContext.getContext().getValueStack();

---通过request对象来获取

ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

2.操作值栈

一般操作值栈都是指操作root区域。

在Action中提供属性的get方法方式。(这里直接演示表单提交方式,简单类型和对象类型)

action类中

privateUser user;privateString password;publicString getPassword() {returnpassword;

}public voidsetPassword(String password) {this.password =password;

}publicUser getUser() {returnuser;

}public voidsetUser(User user) {this.user =user;

}publicString useStack() {System.out.println(user.getName());returnSUCCESS;

}

jsp页面

从值栈里面取出值:-----------------

运行结果

60f3e56c63910b6fa897ca89d7d2122b.png

通过上述可以知道,默认情况下,会将Action对象压入到值栈中,所以其中的属性也在值栈中。在jsp页面显示时直接写属性名,如果是对象,由于用get方法对象不一定在栈顶,所以要用对象名.属性名。属性不要重复

手动操作值栈(注意被压入栈中的都是对象,你传什么类型,底层会被封装成对象,可以自已push对象和普通属性,看看root区)

action页面

publicString handUseStack() {

ValueStack stack=ActionContext.getContext().getValueStack();

stack.push(user);//只是用来保存对象,将对象压入到栈中,传普通属性底层会包装成类对象

stack.set("password", password);//只要用set方法,底层会创建一个map集合,但是你看不到里面的属性和属性值。这是因为这个map集合没有set和get方法,不过没关系,虽然显示空,但是可以取出来。

returnSUCCESS; }

jsp页面(与将Action自动压入栈时取对象值有区别,只需要使用属性名就可以取)

dy>从值栈里面取出值:-----------------

运行结果:

7731bf7b6b1ee99b857895b606d1a272.png

3.操作Context区域

由于context区域里面封装了域对象,所以直接利用域对象就可以达到我们操作context的目的

action页面

publicString useContext() {//利用Action中内置对象获取request对象,向域中存值。其他的域都是一样

ServletActionContext.getRequest().setAttribute("user", user);

ServletActionContext.getRequest().setAttribute("password", password);returnSUCCESS;

}

jsp页面(取值还是和上面root区一样,只不过要加上一个#声明)

从context里面取出值:+..........+

运行结果

e97510e8ee25b1d8bef1671b207298bc.png

13b86e3b472dfbfe98dc6acc4a942893.png

如上图所示,都存到了contex区域里面了,普通属性直接属性名,如password,对象就直接用对象.属性 如 user.name.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值