代码演示:首先创建一个Book类,里面是id和name属性,然后实现get、set方法
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
然后创建一个TestData类存放Book
public static List<Book> getBooks() {
List<Book> books = new ArrayList<>();
Book b1 = new Book();
b1.setId(1);
b1.setName("水浒传");
Book b2 = new Book();
b2.setId(2);
b2.setName("红楼梦");
Book b3 = new Book();
b3.setId(3);
b3.setName("西游记");
books.add(b1);
books.add(b2);
books.add(b3);
return books;
}
然后在创建一个ForeachTag实现类,代码如下
public class ForeachTag extends BodyTagSupport{
//存放数据源
private List<?> items;
private String var;
//get方法可不要
public void setItems(List<?> items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
@Override
public int doStartTag() {
//判断数据源是否为空
if(this.items == null || this.items.size() == 0) {
return SKIP_BODY;//跳出标签体
}
Iterator<?> iterator = this.items.iterator();//获取一个迭代器
Object obj = iterator.next();//获取第一个值
this.pageContext.setAttribute(this.var, obj);
this.pageContext.setAttribute("iterator", iterator);
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() {
//获取Attribute里的值
Iterator<?> it = (Iterator<?>)this.pageContext.getAttribute("iterator");
if(it.hasNext()) {//如果有下一个
this.pageContext.setAttribute(this.var, it.next());
return EVAL_BODY_AGAIN;//如果有值继续调用doAfterBody
}
return SKIP_BODY;//跳出标签体
}
}
然后我们在mytag里定义foreach标签
<!-- foreach标签的定义 -->
<tag>
<name>foreach</name>
<tag-class>com.zking.tagdemo.tag.ForeachTag</tag-class>
<!--该标签有标签体-->
<body-content>jsp</body-content>
<attribute>
<name>items</name>
<!-- 表示该属性为必要的属性 -->
<required>true</required>
<!-- 该属性可以接受EL表示式的值 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<!-- 表示该属性为必要的属性 -->
<required>true</required>
<!-- 该属性可以接受EL表示式的值 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
最后在测试:
<!-- foreach -->
<%
//获取测试数据
List<Book> books = TestData.getBooks();
//放入request对象中
request.setAttribute("books", books);
%>
<z:foreach items="${books}" var="book">
<p>${book.id } - ${book.name }</p>
</z:foreach>
运行结果如下:
如有疑点参考上一篇博客(JSP标签)