每当请求一个action之后就会创建一个valuestack并将相关的对象push到这个statck中。而valuestack是个什么结构呢?就是包含一个map和stack的结构,如图示
OGNL
在这之前,需要了解一下OGNL,OGNL在之前的印象中用的最多的是在通常的jsp页面用于显示数据的类似于EL表达式或者JSTL这样一个的标签语言。其实OGNL实际上是一个用来存储和调用对象以及对象属性的强大的表达式语言。全称为对象图导航语言,它的存在是为了在不能使用java语言的地方使用OGNL或简化java语言。第一个功能不能使用java语言的地方,就是常见的jsp页面,用来显示数据的。
第二个功能:使java语言更加简洁
例如:
Public class person{ Private Company company; Public void set…. } Public class Company{ Private Country country; Public void set… } Public class Country{ Private String name; …… }
这样一个需求通过person取得country。
第一种方案:java普通方式
Person.getCompany().getCountry().getName();
第二种方法:OGNL表达式
Ognl.get("Company.country.name",person)
Getvalue("ognl表达式",root对象)。如上示例,Company.country.name即为ognl表达式,而person即为root对象
valuestack
马上回来,valuestack是在ognl基础上做的一个封装,本质也是用来存取数据。如图valuestack的结构分为一个map和一个context结构,常用方法为setValue和findValue.
Root
1.栈结构
2.继承arraylist,扩展push和pop方法
3.每次action请求,则讲相应的action对象及相关对象压入栈中;
Context
1.map结构
2.为什么在有一个root之后还会存在一个map结构呢?因为valuestack是基于OGNL来封装的,而OGNL中只会存在一个根对象。但是在一般情况下,不仅仅只存在一个root对象,所以valuestack又对ognl进行了封装。使之能够处理多个根对象的数据结构,通常存放了page
session application parameter attr等对象。
和ognl结合来取值
1.通常情况在jsp页面中结合struts2的标签,利用ognl表达式即可取到在valuestack中的值。如name,这样就会在valuestack首先去查找在context中的findValue("name")这样方法取得对应的值;如若没有则去map中调用get("name").getName();取得对应的value。