OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写
ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个
                  ValueStack 对象). 相当于一个数据的中转站. 在其中保存当前,Action 对象和其他相关对象.
Struts 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中,request中
获取值栈对象的两种方式:
//方法一:
  ValueStack valueStack = ServletActionContext.getContext().getValueStack();
//方法二:
//  ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

在 ValueStack 对象的内部有两个逻辑部分:
ObjectStack: Struts  把动作和相关对象压入 ObjectStack 中--List
ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中
Struts 会把下面这些映射压入 ContextMap 中
parameters: 该 Map 中包含当前请求的请求参数
request: 该 Map 中包含当前 request 对象中的所有属性
session: 该 Map 中包含当前 session 对象中的所有属性
application:该 Map 中包含当前 application  对象中的所有属性
attr: 该 Map 按如下顺序来检索某个属性: request, session, application
OgnlValueStack 类包含两个重要的属性   一个root和一个context。
       *    其中root本质上是一个ArrayList.
       *    而context 是一个Map(更确切的说是一个OgnlContext对象)
在这个OgnlContext对象(context)中,有一个默认的顶层对象 _root,OGNL访问context中这个默认顶层对象中的元素时,是不需要#号的,直接通过元素的名称来进行访问,
而访问其他对象时,如 request、session、attr等,则需要#号引用。
       注:Struts2将OgnlValueStack的root对象赋值给了OgnlContext 中的_root对象,在OgnlValueStack的root对象中,保存着调用Action的实例,因此,在页面上通过Struts2标签访问Action 的属性时,就不需要通过#号来引用
     总结:ognl Context包含 ObjectStack属性和ContextMap属性
 使用OGNL表达式: 理解OGNL Context

 --------------

   ------------------

   

   

   attr:

   

注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:
//传递Map集合
 Map mapValue=new HashMap();
 mapValue.put("male", "man");
 mapValue.put("female", "woman");
 ServletActionContext.getRequest().setAttribute("mapValue", mapValue);
 //将Student和Employee对象放置到Root栈中,并将Employee对象放置到栈顶
 valueStack.getRoot().add(0,new Employee());
 valueStack.getRoot().add(1,new Student());
 深入理解值栈中的 ObjectStack

   

   

   

   

   

 OGNL表达式语言(#号的用法)

用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext()
1、  如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,
        需要添加#前缀。
2 、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack
       (值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略
         #命名对象,直接访问该对象的属性即可。
Action中代码: 
  ValueStack valueStack=ServletActionContext.getContext().getValueStack();
  valueStack.set("username", "username_valueStack");

Jsp页面:
    valueStack:

用法2:集合的投影(只输出部分属性) (过滤)

      用法3:构造Map,如井{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。
      这种方式常用在给radio或select、checkbox等标签赋值上  

      
      
        
          
          
    OGNL表达式语言(%用法)

   告诉执行环境%{}里的是表达式是OGNL表达式。将%{}中的定义的表达式以OGNL来解析 

形式一: %{ }中ognl表达式

     
       形式二: %{ }中值用 ’  ’引起来,此时不再是ognl表达式,而是普通的字符串

        
  “$”有两个主要的用途
    * 用法一: 用于在国际化资源文件中,引用OGNL表达式

    
    
    
    * 用法二: 在Struts 2配置文件中,引用OGNL表达式

     
      

 property标签:

    
     set标签:

     
     ---------

     --------------------------------------------------

     
     

 push标签:

      
       
       

      
      

     



bean标签(了解)

      
       
       
       
      
      ----------------
      

      

      action标签

      
      
      

      iterator标签

      
      
       ----------------

       ----------------

      
      ---------------------------------------------

      
       ----------------

      
      ---------------------------------------------

      
       -----------------
       -----------------
       --------

      
      ---------------------------------------------

      让表格逐行变色

      
       
        主键ID
        名称
        年龄
       
       
        ">
         
         
         
        
       
       

       -----------------------------------------------

      if/elseif/else标签

      
      
       
        主键ID
        名称
        年龄
        年龄段(21-24少年,25-27中年,27以上老年)
       
       
        ">
         
         
         
         
          =21 && #per.age<=24}">
           少年
          
          =25 && #per.age<=27}">
           中年
          
          
           老年
          

         
        
       
       

      
      

      URL标签:

      
       
       
          

          
       
       
          xxxxx
       

 使用ognl操作list和数组. 

       

       ------ 

 ognl也可直接创建集合对象. 利用下拉列表框:
        在struts的标签中定义{1,2,3,4},此时表示的是一个list集合
      


       

      
      
       ---------

      
   使用ognl操作map 
    ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
    创建map与创建list语法很相似,不同的是map前需要加"#"号.
      在struts的标签中定义井{'key01':'value01','key02':'value02'}

      
       

       -----------

      
      ///////

      
       ---------

      
   补充:(了解)

      #号的用法
         用法2:集合的投影(只输出部分属性) (过滤)
  1、集合的投影(只输出部分属性)???
             collectionName.{ expression }

   
    

   
   --------------------------------------------------

   用法2:集合的投影(过滤)
  2、集合的过滤(年龄大于19)
   1) 集合的过滤有以下三种方式:
       a.“?#”:过滤所有符合条件的集合,如:users.{?#this.age?>?19};
       b.“^#”:过滤第一个符合条件的元素,如:users.{^#this.age?>?19};
            c.“$#”:过滤最后一个符合条件的元素,如:users.{$#this.age?>?19}?。
      =25}" var="p">
     ------------------

   
   //////

   =25}" var="p">
     ------------------

   
   //////

   =25}" var="p">
     ------------------

   
   --------------------------------------------------

   用法2:集合的投影(过滤)(综合)
  3、集合的投影和过滤
        投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的
        元素,如:users.{?#this.age?>?19}[0]


   =25}.{name}" var="p">