今天在调试一些前台页面上的问题,在处理structs标签、jstl标签时遇到了些麻烦,为了调用后台数据字典中的类方法,开始在<c:forEach>中尝试怎么样都不行,后来知道要用<s:property>,于是把迭代又给位<s:iterator>,然后又因为在<s:iterator>、<s:if>中用了El表达式各种报错调试,最终浪费了近2小时左右时间,也算又深入理解了jsp相关的标签和表达式。
struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo:
s:iterator 标签有3个属性:
value:被迭代的集合
id :指定集合里面的元素的id
status 迭代元素的索引
1:jsp页面定义元素写法 数组或list
- <s:iterator value="{'1','2','3','4','5'}" id='number'>
- <s:property value='number'/>A
- </s:iterator>
打印结果为: 1A2A3A4A5A
2:索引的用法
如果指定了status,每次的迭代数据都有IteratorStatus的实例,它有以下几个方法
int getCount()返回当前迭代了几个元素
int getIndex()返回当前元素索引
boolean isEven()当然的索引是否偶数
boolean isFirst()当前是否第一个元素
boolean isLast()
boolean isOdd()当前元素索引是否奇数
- <s:iterator value="{'a','b','c'}" id='char' status='st'>
- <s:if test="#st.Even">
- 现在的索引是奇数为:<s:property value='#st.index'/>
- </s:if>
- 当前元素值:<s:property value='char'/>
- </s:iterator>
3:遍历map
value可以直接定义为:
- value="#{"1":"a","2":"b"}"
每个元素以都好隔开。元素之间的key和value 冒号隔开
value也可以是数据栈里面的java.util.Map对象
遍历写法如下:
- <s:iterator value="map" id="id" status="st">
- key : <s:property value='key'/>
- value:<s:property vlaue='value'/>
- </s:iterator>
当然key 和value 都可以使java 的 Object
3:遍历数据栈.简单的List类,
List<Attr>
class Attr{String attrName;String getAttrName(){return "123";}}
- <s:iterator value="label" id="id">
- <s:property value="#id.attrName" />
- </s:iterator>
<c:out>标签的作用是用来显示表达式的值。它的作用是用来替代通过JSP内置对象out或者<%=%>标签来输出对象的值。
<c:out>标签的语法说明如下:
<c:out value="expression" default="expression" escapeXml="boolean"/>
<c:out>标签具有以下一些属性:
l value:用来定义需要求解的表达式。
l default:缺省值。当求解后的表达式为null或者String为空时将打印这个缺省值。
l escapeXML:这个属性是可选的。用于指定在使用<c:out>标记输出诸如“<”、“>;”和“&”之类的字符(在 HTML 和 XML 中具有特殊意义)时是否应该进行转义。如果将 escapeXml 设置为true,则会自动的进行编码处理。
<s:property />用法汇总
<li>1。访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>2. 访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user["age"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>3。访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>4。访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>5. 访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>6. 访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>7. 访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>8. 访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>9. 访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>10. 访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>11. 访问List:<s:property value="users"/></li>
<li>12. 访问List中某个元素:<s:property value="users[1]"/></li>
<li>13. 访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>14. 访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>15.访问Set:<s:property value="dogs"/></li>
<li>16.访问Set中某个元素:<s:property value="dogs[1]"/></li>
<li>17.访问Map:<s:property value="dogMap"/></li>
<li>18.访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap["dog101"]"/></li>
<li>19.访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>20.访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>21.访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>22.投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>23.投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>24.投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>25.投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>26.[]:<s:property value="[0].username"/></li>