s:sort之后使用s:iterator迭代器

sort标签之后使用iterator迭代器


写个排序写了一上午,找百度全都只有根对象的,迷茫死了,可我的数据是非根对象啊哭
s:sort之后使用s:iterator迭代器

sort标签

Sort标签根据comparator属性指定的比较器对集合进行排序,并将排序后的迭代器压入值栈的栈顶。在sort标签的内部,你可以使用iterator标签取出栈顶的迭代器对排序后的元素进行迭代。当sort标签结束时,栈顶的迭代器将被删除。
sort标签进行排序时,必须提供自己的排序规则,即实现自己的Comparator,而且Comparator需要实现java.util.Comparator接口
属性:
– comparator:必选属性,指定进行排序的Comparator对象
注:写一个java类继承comparator接口,然后实现compare方法。o1-o2排出来是从小到大,o2-o1是从大到小。
– source:可选属性,指定被排序的集合;如果不指定,则对ValueStack栈顶的集合进行排序
– var:可选属性,如果指定则生成的Iterator对象设置成page范围的属性
注:在jsp中要先用<s:bean name=“包名.类名” var=“自定义对象名”></s:bean>标签去创建一个bean对象,然后在comparator属性中写var的值

iterator标签

iterator标签主要是对集合进行迭代操作,集合可以使List、Map、Set和数组。
使用iterator标签对集合进行迭代输出时,可以指定如下三个属性:
value:这是一个可选的属性;用于指定被迭代的集合,被迭代的集合通常都使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合
id:这是一个可选属性;指定了集合里元素的ID,可以用var代替
status:这是一个可选的属性,指定迭代时的IteratorStatus实例,通过该实例可以判断当前迭代元素的属性

总结

在只用sort标签进行排序后,被排序好的对象会被放在值栈顶端。因此使用iterator迭代遍历的时候,value可以不填,默认取值栈顶对象,要么就写从根对象中取。不要加#来从非根对象中取,那样取出来的是没有排好序的集合或列表。

public class MyComparator implements Comparator<Book> {
	@Override
	public int compare(Book b1, Book b2) {
		//从大到小排序
		return b2.getBookId()-b1.getBookId();
	}
}
<s:if test="#application.booklist!=null">
				<s:bean name="action.MyComparator" var="myComparator"></s:bean>
				<s:sort comparator="myComparator" source="#application.booklist">
					<s:iterator var="book">
						<tr>
							<td><s:property value="#book.BookId"/></td>
							<td><s:property value="#book.BookName"/></td>
							<td><s:property value="#book.author"/></td>
							<td><s:property value="#book.price"/></td>
							<td><s:property value="#book.press"/></td>
							<td><s:property value="#book.image"/></td>
							<td><a href="Book_Delete_Action?dbookid=<s:property value="#book.BookId"/>">删除</a></td>
						</tr>
					</s:iterator>
				</s:sort>
			</s:if>

一个垃圾的水水之路