欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts2笔记_值栈

程序员文章站 2022-05-08 08:14:02
A.值栈概述 值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西。struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区域就是值栈,该值栈对象会贯穿整个Action生命周期,用来存储这个过程中的数据。 B.值栈结构 首先 ......

a.值栈概述

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

 

b.值栈结构

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

Struts2笔记_值栈               

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

Struts2笔记_值栈

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类中
private user user; private string password; public string getpassword() { return password; } public void setpassword(string password) { this.password = password; } public user getuser() { return user; } public void setuser(user user) { this.user = user; } public string usestack() { system.out.println(user.getname()); return success; }

jsp页面

从值栈里面取出值:
    <s:property value="user.name"/>-----------------<s:property value="password"/>
    <s:debug></s:debug>

运行结果

Struts2笔记_值栈

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

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

action页面

public  string  handusestack() {
         valuestack stack = actioncontext.getcontext().getvaluestack();
         
         stack.push(user); //只是用来保存对象,将对象压入到栈中,传普通属性底层会包装成类对象
         stack.set("password", password); //只要用set方法,底层会创建一个map集合,但是你看不到里面的属性和属性值。这是因为这个map集合没有set和get方法,不过没关系,虽然显示空,但是可以取出来。  
return success; }

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

dy>
    从值栈里面取出值:
    <s:property value="name"/>-----------------<s:property value="password"/>
    <s:debug></s:debug>

运行结果:

  Struts2笔记_值栈

 

3.操作context区域 

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

  action页面

 

public string usecontext() {
//        利用action中内置对象获取request对象,向域中存值。其他的域都是一样
        servletactioncontext.getrequest().setattribute("user", user);
        servletactioncontext.getrequest().setattribute("password", password);
        return success;
    }

 

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

 

从context里面取出值:
    <s:property value="#request.user.name"/>+..........+<s:property value="#request.password"/>
    <s:debug></s:debug>

运行结果

Struts2笔记_值栈

 

 Struts2笔记_值栈

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