简单 的 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> 当然 value 还 可以写成 value="%{label}" label 可以有 . 操作 label 的属性 List 可以写成 value="%{label.list}" 相当于: getLabel().getList(); 4 :遍 历 2 个 list ; List<AttrName> attrN {color,size,style} List<AttrValue> attrV {red,20,gay} 这 2 个 list 的元素是一一 对应 的,一个 attrN 对应 一个 attrV <s:iterator value="%{attrN }" id="id" status="status"> index is : <s:property value='status.index'/> attrName is : <s:property value='id'/> or <s:property value='%{id}'/> attrName is : <s:property value='%{attrV[#status.index]}'/> </s:iterator> <s:bean name="org.apache.struts2.util.Counter" id="counter"> <s:param name="first" value="5" /> <s:param name="last" value="10" /> <s:iterator> counter:<s:property/> </s:iterator> </s:bean>
这 个 标签 主要的的作用就是迭代出集合。。 value 属性表示需要跌代 显 示出来的 值 。 status 属性,又来保存迭代 时 的一些状 态值 。 注: 1. 如果需要引用 valueStack 中的 值 ,需要使用 这样 的形式。 <s:iterator value="#userList" /> //userList 在 action 部分被保存在 Request 中,所以使用 # 加属性名来引用 值 。 2. 如果集合的 值 是通 过 action 的方法,假 设 我 们 的 action 中有一个 getListMenu 方法,返回一个 List 集合。 我 们 可以使用如下的形式来引用 这 个集合,并用 s:iterator 来 输 出。 <s:iterator value="listMenu" /> 3.iterator 的 value 使用定 义 好的方式,如: <s:iterator value="{1,2,3,4}" /> // 这样 跌代 输 出的 值 就是 1.2.3 .4 这 四个 值 。 二、 iterator 中 输 出具体 值 ,如果,在上面我 们 的 list 中的 对 象,有两个属性,都是 String 类 型,一个是 name, 一个是 url 。 我 们 可以 这样 来引用。 1. <s:property value="name" /> // 这样 我 们 将可以 输 出跌代 对 象的 name 属性 值 。 2. 如果我 们 希望使用 <s:url /> 来将跳 转过 后的 url 进 行 处 理, 该 如何来做? <s:url value="%{url}"/> //%{}ognl 的表达式, 这样 的 值 能 够 将 url 的 值进 行 <s:url/> 的 处 理 实际 上就是 转为绝对 路径。 这样 ,我 们 就可以 对 付一些因跳 转换产 生的路径 问题 。 原因:因 为 <s:iteratotr /> 以后,当前的 对 象 应该 就在 ValueStack 顶 部了, 这样 当然的 url 实际 上就是 对 象的 url 属性了 三、使用 ognl 输 出 对应 的 值 。 <s:textfield name="loginName" value="%{#request.loginNames}"/> 使用此表达式,会生成一个文本框,并且,如果 request.attribute 中有 loginNames 属性,将会做 为 些文本框的默 认值 。 如果只使用 #request.loginNames 在 struts2 的 标签 内部,是不会 显 示任何 值 的,注意外面加上的 %{} 附号,才会被正常的使用。 如果希望如 EL 语 言一 样 直接 输 出文件,如在一个 <a></a> 之 间 的 innerHTML 文本 为 #request.loginNames 的 值 ,我 们 只要使用: <s:property value="#request.loginNames" /> 使可以正常使用! 注: 1.${} 是 EL 语 言的 %{} 这样 的形式是 ognl 表 过 式 语 言的,在 struts2 的 标签 内部,使用 %{} 这样 的形式,在 标签 外部可以使用 ${}EL 语 言的方式。如果在 struts2 的 标签 内部使用 ${} 这样 的方式,会出 现 以下的 错误 提示: According to TLD or attribute directive in tag file, attribute value does not accept any expressions 2. 很多 时 候,我 们 使用 struts2 的一些 标签 ,属性是需要接受集合的,如果集合是保存在 request,session ,或者是 值栈 ( 非根 对 象的 栈顶 ) ,可以使用 # 变 量名的方式,如果 获 取的 值 是在 Action 中通 过 特定的方法来 获 取,就需要使用如 value="userList" 这样 的方式,只是去掉了前面的 # 。
struts2 中的 OGNL 用法
User 对 象属性 获 取 如 User 中有 username 和 password 字段 获 取 username 属性 <s:property value="user.username" /> 获 取 password 属性 <s:property value="user.password" /> 若 User 中又包含定 义 了 address 对 象, address 对 象中包含有 addr 属性, 则 可以 这样访问 获 取 addr 属性 <s:property value="user.address.addr" /> 若 User 中 还 包含一个 get() 的普通方法,可以 这样调 用 <s:property value="user.get()" /> 以上是 调 用 值栈 中 对 象的普通方法, user 为值栈 中的 对 象 调 用 action 中的静 态 方法 get() ,普通方法不能直接 调 用 <s:property value="@com.netshuai.action.ManagerAction@get()" /> 以上 为调 用非 值栈 中的静 态 方法 调 用 JDK 中 类 的静 态 方法 <s:property value="@java.lang.Math@floor(32.56)" /> 上例也可写成 <s:property value="@@floor(32.56)" /> ,省略前面的 类则 默 认 使用 java.lang.Math 类 ,其他 类 不可省略 调 用普通 类 中的静 态 属性 <s:property value="@com.netshuai.model.Address@city" /> address 中的 city 静 态 属性要用 public 声明 调 用普通 类 的构造方法,如构造方法 为 public User(String username) { this.username=username; } 调 用方法 为 <s:property value="new com.netshuai.model.User('hello').username" /> , 则 返回 username 值为 hello 获 取 List<s:property value="list" /> 获 取 List 中的某一个元素 <s:property value="list[0]" /> 获 取 List 的大小 <s:property value="list.size" /> 获 取 Set<s:property value="set" /> 无法 获 取 Set 中的某一个元素,因 为 Set 没有 顺 序 获 取 Map<s:property value="map" /> 获 取 Map 中所有 key 的 值 <s:property value="map.keys" /> 获 取 Map 中所有 value 的 值 <s:property value="map.values" /> 获 取 Map 中的某一个元素 <s:property value="map['k1']" /> 获 取 List 所有 对 象 <s:property value="listObject" /> ,需要重写 toString() 方法才能正常 显 示 对 象的 值 利用投影 获 取 List 中所有 对 象的 username 属性 <s:property value="listObject.{username}" /> 利用投影 获 取 List 中第一个 对 象的 username 属性 <s:property value="listObject.{username}[0]" /> 利用 选择获 取 List 中年 龄 大于 30 的 对 象 <s:property value="listObject.{?#this.age>30}" /> 利用 选择获 取 List 中年 龄 大于 30 的 对 象的 username<s:property value="listObject.{?#this.age>30}.{username}" /> 利 用 选择获 取 List 中年 龄 大于 30 的第一个 对 象的 username<s:property value="listObject.{?#this.age>30}.{username}[0]" /> 或 <s:property value="listObject.{^#this.age>30}.{username}" /> 利用 选择获 取 List 中年 龄 大于 30 的最后一个 对 象的 username<s:property value="listObject.{$#this.age>30}.{username}" /> 获 取 parameters 中的属性 <s:property value="#parameters.name" /> 获 取 request 中的属性 <s:property value="#request.name" /> 获 取 session 中的属性 <s:property value="#session.name" /> 获 取 application 中的属性 <s:property value="#application.name" /> <s:property value="#attr.name" /> 按 顺 序遍 历 上面四个 对 象,然后返回首先找到的 值 %{} 可以取出存在 值 堆 栈 中的 Action 对 象,直接 调 用它的方法,如 %{getText('key')} 可以取出国 际 化信息 ${} 可以用在国 际 化 资 源文件中和 struts2 配置文件中 使用 top 获 取 值栈 中第二个 对 象 <s:property value="[1].top.user"/> 使用 top 获 取 值栈 中第二个 对 象的属性 <s:property value="[1].user"/> 调 用 值栈 中 action 的静 态 方法 get()<s:property value="@vs@get()"/> , vs 也可写做 vs1 调 用 值栈 中第二个 action 的静 态 方法 get()<s:property value="@vs2@get()"/> 将一个 对 象放入 值栈 ActionContext.getContext().getValueStack().push(user);