struts2中s:iterator 标签的使用详解 及 OGNL用法
简单的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"这样的方式,只是去掉了前面的#。
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);
struts2中s:iterator 标签的使用详解 及 OGNL用法的更多相关文章
- struts2中<s:select/>标签的运用详解
<s:select list="smsTypes" listKey="SmsTypeId" listValue="SmsTypeName&quo ...
- java中List的用法和实例详解
java中List的用法和实例详解 List的用法List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供 ...
- 二十四、Struts2中的UI标签
二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...
- HTML video 视频标签全属性详解
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
- 【转】angularjs指令中的compile与link函数详解
这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在 ...
- angularjs指令中的compile与link函数详解
这篇文章主要介绍了angularjs指令中的compile与link函数详解,本文同时诉大家complie,pre-link,post-link的用法与区别等内容,需要的朋友可以参考下 通常大家在 ...
- Android 中各种权限深入体验及详解
Android 中各种权限深入体验及详解 分类: Android2012-07-15 19:27 2822人阅读 评论(0) 收藏 举报 androidpermissionsinstallersyst ...
- HTML-▲▲video 视频标签全属性详解▲▲
HTML 5 video 视频标签全属性详解 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
随机推荐
- 请介绍WCF服务
WCF本质上提供一个跨进程.跨机器以致跨网络的服务调用 WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中, ...
- python3.x +django + nginx + uwsgi 搭建web服务
最近一直在用django开发自己的网站.在开发和线上环境的对接过程中遇到了许多的坑.所以想以一个老鸟的经历来写一下怎么 搭建web服务 一.python3.x .django .nginx .uwsg ...
- Mysql时间存储类型优缺点?DATETIME?TIMESTAMP?INT?
TIMESTAMP 4个字节储存;值以UTC格式保存;.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区. DATETIME 8个字节储存;实际格式储存;与时区无关;datetime ...
- Atitit.异步编程 java .net php python js 的比较
Atitit.异步编程 java .net php python js 的比较 1. 1.异步任务,异步模式, APM模式,, EAP模式, TAP 1 1.1. APM模式: Beg ...
- 12. Min Stack【medium】
Implement a stack with min() function, which will return the smallest number in the stack. It should ...
- 词法分析器总结--flex&bison
转自:项目总结之词法分析器 无论是词法分析,还是语法分析,给我的第一感觉就是逻辑要严谨.由于项目有自己一套完整的语言和语法,设计好其对应的词法分析器和语法分析器显得尤为重要. 我们采用flex进行词法 ...
- 深入浅出MFC--第一章
Windows程序的生与死 当使用者按下系统菜单中的Close命令项,系统送出WM_CLOSE.通常程序的窗口函数不拦截次消息,于是DefWindowProc函数处理它.DefWindowProc收到 ...
- php html 转义
html_entity_decode($string);htmlentities($string);htmlspecialchars($string);htmlspecialchars_decode( ...
- love2d教程30--文件系统
在游戏里少不了文件操作,在love2d里我们可以直接用lua自带的io函数,如果不熟悉可以先读一下我的lua文件读写. 相对lua,love2d提供了更多的函数, 方便我们操作文件.不过可能处于安全考 ...
- Linux解决删除文件后空间没有释放问题_端口占用问题
使用命令 (1) losf | grep deleted 查询所有已经删除但是还未释放空间的进程,找到容量最大的线程,kill -9 pid 然后等待容量释放 (2) netstat -ano | g ...