1.访问值栈中的action的普通属性: username = <s:property value="username"/>,图解如下:
①在DomainModel中只有给model传递了参数,model对象才会被创建。如果不传参数的话,model是不可能被创建的。
②在DomainModel中要求永远有一个默认的构造方法,因为User对象(model对象)的构造函数不是你来调用的,而是系统来调用构造函数来创建对象,系统只会调用默认的构造函数,如果没有提供默认的构造函数,在debug中User对象(model对象)则不会创建,同时后台会报错。
③想初始化DomainModel,可以自己new;也可以传参数值,Struts2来帮你new,但这个时候,需要保留默认的构造函数(即model中要有默认的构造函数)。
2.访问值栈中对象的普通属性(get,set方法)。
①将 <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.投影(过滤)
②<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。