1.访问值栈中的action的普通属性: username = <s:property value="username"/>,图解如下:

OGNL_java


①在DomainModel中只有给model传递了参数,model对象才会被创建。如果不传参数的话,model是不可能被创建的。

②在DomainModel中要求永远有一个默认的构造方法,因为User对象(model对象)的构造函数不是你来调用的,而是系统来调用构造函数来创建对象,系统只会调用默认的构造函数,如果没有提供默认的构造函数,在debug中User对象(model对象)则不会创建,同时后台会报错。

③想初始化DomainModel,可以自己new;也可以传参数值,Struts2来帮你new,但这个时候,需要保留默认的构造函数(即model中要有默认的构造函数)。

 

2.访问值栈中对象的普通属性(get,set方法)。

OGNL_java_02


①将 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 设置为true,那么才能使用OGNL访问到Action中的static方法(静态变量不受此影响)

②访问action中静态方法及变量的格式:@ + 包 + 类 + @ + 静态方法/静态变量

③访问Math类的静态方法:<s:property value="@@max(2,3)" /> , 说明:“@@”表示访问Math类中的静态方法,特例,而不是指别的类。

 

3.访问普通类的构造函数:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>

 

4.访问集合List

①访问List:<s:property value="users"/> ,会列出List中所有元素。

②访问List中某个元素:<s:property value="users[1]"/>, 会列出List中下标为1的元素(下标从0开始)

③访问List中所有元素某个属性的集合:<s:property value="users.{age}"/> , 把users中每个元素的age属性拿出来,然后组合到一起形成新的List。

④访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/>  等价于 <s:property value="users[0].age"/> 后者常用。

⑤访问List容器的大小:<s:property value="users.size"/>

 

5.访问集合Set

①访问集合Set:<s:property value="dogs"/> 跟访问List一样

说明:OGNL有一个特点:它没有值或 取错了,或取不到,这时候它就不给你显示,并不会报错。

②访问Set中某个元素:<s:property value="dogs[1]"/>  取不到Set中的某个元素

说明:Set里面没有顺序,取第一个,第二个没有意义,所以取Set的第几个元素取不到。

 

6.访问集合Map

①访问Map:<s:property value="dogMap"/>

②访问Map中某个元素:<s:property value="dogMap.dog101"/>

                         等价于 <s:property value="dogMap['dog101']"/>

                         等价于<s:property value="dogMap[\"dog101\"]"

说明:

③访问Map中所有的key:<s:property value="dogMap.keys"/>

④访问Map中所有的value:<s:property value="dogMap.values"/>

⑤访问Map容器的大小:<s:property value="dogMap.size()"/> 

 

7.投影(过滤)

OGNL_静态方法_03


②<s:property value="users.{?#this.age==1}"/>  输出[user1],为什么带中括号呢?说明是一个集合,因为满足“?#this.age==1”条件的user可能不止一个,那么你想取集合的第一项怎么办呢?加下标[0]

③从取满足条件的对象(会存放到一个集合中)中第一项:<s:property value="users.{?#this.age==1}[0]"/>   使用下标[0] 来 从满足条件的对象集合中取第一项

④投影:<s:property value="users.{^#this.age>1}.{age}"/>

              条件“^#this.age>1” 意思是取满足this.age > 1的user中的第一个元素

              条件"$#this.age>1" 意思是取满足this.age > 1的user中的最后一个元素

⑤投影:<s:property value="users.{$#this.age>1}.{age} == null"/>  检查集合是否为空

 

8.什么时候Value Stack中会有两个action? 在服务器跳转 从一个Action跳转到另一个action。