依赖注入
模块包含
struts.xml的模块包含格式
<include file="xx.xml" >
OGNL
对象导航语言 有个超大的好处就是根据对象访问属性,避免混乱。
OGNL标签分为:data tags和 control tags
一、数据标签
property标签
获取值栈中的普通对象
<s:property value=""/>
是访问哪些有get和set的属性的方法
name:<s:property value="name"/><br>
name:<s:property value="user.name"/><br>
访问值栈中的普通对象的普通方法
1.password是String类型
password:<s:property value="password.length()"/><br>
2.实体类中自定义对象的普通方法
eat:<s:property value="person.eat()"/><br>
3.Action类中定义的普通方法
<s:property value="methodaction1()"/>
4.访问集合
1>array
和list一样
2> list
访问list
<s:property value="listname"/>
访问list某个属性的集合
<s:property value="listname.{age}"/>
访问list某个集合的某特定值
<s:property value="listname.{age}[0]"/>或者
<s:property value="listname[o].age"/>更容易理解和记忆
3>set
和list一样
4>map
访问map单个元素
<s:property value="mapname.key"/>或者 <s:property value="mapname['key']"/> 单引号
访问map所有key
<s:property value="mapname.keys"/>
访问map所有value
<s:property value="mapname.values"/>
访问容器的大小
<s:property value="mapname.size()"/>或者 <s:property value="mapname.size"/>
注:什么是普通方法和属性:就是非static的方法和非构造方法和属性
5.访问静态方法和和属性(需要改设置)
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>struts.xml中修改
<s:property value="@全类名@方法或属性"/>
6.投影
users为set集合
<s:property value="users.{?#this.age==1}.{0}"/>
<s:property value="users.{^#this.age>1}.{age}"/> age大于1集合中的第一个元素
<s:property value="users.{$#this.age>1}.{age}"/> age大于1集合中的第后一个元素
<s:property value="users.{$#this.age==1}.{age}==null"/> 判断集合是否为空
两者都可以但是第二个更明确。
name:<s:property value="name"/><br>
name:<s:property value="user.name"/><br>
set标签
<s:set var="" value=""/> value的type为object,可以用来重命名
如:在浏览器中地址栏中输入...&age=-8
<s:set var="age" value="#parameters.age[0]"/>
<s:if test="#age<0">wrong yong!</s:if>
- <s:set var=”includepage” value=”'/index.html'” />
- <s:property value=”#includepage” />
- <s:include value="#includepage" /> include标签value的type是字符串类型,"#includepage" 在解析的时候会被解析成字符串
- <s:include value="%{#includepage}" />这一个加上%{}就会被当做ognl表达式
二、控制标签
if标签
<s:if test=""></s:if> test的type是布尔型 boolean
iterator标签
遍历集合:
<s:iterator value="{'1','2','3'}">
<s:property/>
</s:iterator>
<br>
自定义变量:
<s:iterator value="{'aa','bb','cc'}" var="w">
<s:property value="#w.toUpperCase()"/>
</s:iterator>
<br>
遍历map
<s:iterator value="#{'a':'A','b':'B','c':'C'}">
<s:property value="key"/>|<s:property value="value"/>
</s:iterator>
使用status
使用status <br>
<s:iterator value="{'aa','bb','cc'}" status="status">
<s:property/>
遍历过的总数:<s:property value="#status.count"/><br>
当前遍历的的索引位置:<s:property value="#status.index"/><br>
当前是奇数?:<s:property value="#status.even"/><br>
当前是偶数?:<s:property value="#status.odd"/><br>
当前是第一个元素?:<s:property value="#status.firt"/><br>
当前是最后一个元素?:<s:property value="#status.last"/>
<hr>
</s:iterator>
subset标签
注:从例子可以看出定义list和map的差别