struts06:值栈和值栈上下文(是一种数据结构)、ognl表达式(对象导航图)

第一:值栈

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对象)                    

 

你可能感兴趣的:(struts06:值栈和值栈上下文(是一种数据结构)、ognl表达式(对象导航图))