第一:值栈
1.struts2的s:debug将会产生值栈(valueStack)和值栈上下文(stackContext),其中值栈是根对象,值栈上下文是非跟对象。
2.值栈里面包含的内容有:对象、对象属性、对象的属性值。
(1).在提交表单的时候,会进入action层去执行相应的方法,也就是说一定会产生一个对象
(2).产生这个action对象之后,也会产生他的所有属性
(3).而属性值就是我们提交表单的时候提交到action层的值(属性和属性值是一对键值对)。
注意:看值栈的时候可以看图
3.在页面提交之前,action 对象还没进入值栈当中(由于没进入值栈中,那么肯定也没进入值栈上下文当中)。
4.在我们点击提交按钮之后,struts2会根据from表单的请求路径xxx.action去执行action层中的类(执行过程就是先创建该类的对象,然后给属性赋值,然后进入具体的业务方法)。而在struts2创建action层对象的时候,首先将action对象放入值栈中,然后在将其放入值栈上下文中,在值栈上下文的固定名称是“action”。
5.在jsp页面当中,struts2将EL表达式扩展到了值栈中,可以利用EL表达式直接输出值栈对象的属性(其实用的就是值栈中对象的属性(是个键值对),在debug中可以看到
第二:ognl表达式
user.username中的user是类中对象,username是对象的属性,.表示在导航
(1)ognl是Object Graph Navigation Language的首字母缩写,
翻译成中文是对象图导航语言的意思;
因此ognl表达式就是:基于对象图导航语言的一种表达式,
对象图导航的含义就是通过对象的链式结构表示对象的属性;
(2)什么是对象的链式结构?(el表达式的复习)
使用点号或者中括号表示对象的属性,此一点与el表达式类似,分为两种情况:
①对象的属性是普通对象:
例1,访问person对象的name属性:
person.name
person["name"]
例2,访问employee对象的company属性,
其中company属性引用的company对象含有name属性:
employee.company.name
②对象的属性是集合对象:
例1,team对象的persons属性是list类型的集合,
其中集合中的元素是person对象:
team.persons[2].name
例2,team对象的persons属性是map类型的集合,
其中集合中的元素是entry项(键值对):
team.persons["p1001"].name
或者:
team.persons.p1001.name
(3)ognl表达式的特殊性
支持ognl表达式的底层数据结构,是一个特殊的map结构,
在这个map结构中有两种类型的绑定:根对象和非根对象。
它们访问各自属性的方式是不同的:
①根对象不必通过自身引用,而直接访问自己的属性;
如果根对象中具有相同的属性,则接近栈顶的对象首先得到访问。
参考图:《值栈中对象属性的访问.jpg》
②非根对象必须通过自身的引用,才能访问自己的属性。
(4)在Struts2框架中,ActionContext对象为ognl表达式提供了一个特殊的map结构,
在这个map结构中含有一些固定的绑定,其中值栈是一个具有特权的绑定,
因为规定值栈中的对象全都是根对象,而其它的绑定都是非根对象。
-application
|
-session
|
-request
包含 |
ActionContext--->Map----com.opensymphony.xwork2.util.ValueStack.ValueStack
|
-action
|
-attr
|
-parameters
|………………
(5)ActionContext与StackContext的区别:
①ActionContext是Struts2框架的内置对象,
负责维护ognl表达式的数据结构;
②StackContext并不是Struts2框架中的一个内置对象,
而是指值栈的上下文环境,这个值栈的上下文环境就是
ActionContext对象中所包含的map结构。
2.为什么要使用ognl表达式?
(1)ognl表达式为视图组件的数据处理提供了强大的运算功能
(2)在配置文件(xml和properties)中,利用ognl表达式可以访问对象或对象属性;
三、ognl表达式使用案例:
(1)Action中的属性是JavaBean对象
通过ognl表达式,使表单项的名称与Action中bean对象的属性名称匹配,
例如:Action中包含User类型的对象user,它的一个属性是username,
那么表单项中的name应该是user.username
(2)页面中使用ognl表达式:
①值栈中的对象:
(a)${user.username}
el表达式扩展到值栈中
(b)<s:property value="user.username"/>
value属性值是ognl表达式,即输出值栈中对象的属性(值栈中的对象是根对象,所以前面不用加东西)
②Action上下文(值栈上下文)中的对象
<s:property value="#action.user.username" />
此时不能使用${} (值栈上下文中的对象前面要加上值栈对象。此时action表示值栈上下文中的一个键(键名为action),#action表示值栈上下文对象映射的action对象)