自定义标签<some:forEach>的使用

本文介绍如何使用自定义标签库简化JSP页面中集合遍历的代码,并通过XML配置实现动态属性绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<%@taglib uri="/WEB-INF/tag.tld" prefix="some"%> <% String[] array = { "One", "Two", "Three" }; request.setAttribute("arry", array); %> <some:forEach items="${arry}" var="value" varStatus="st"> <h2> ${value} (${st.index}/${st.length}) </h2> </some:forEach>
<?xml version="1.0" encoding="GB18030" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <display-name>Some TagLib</display-name> <tlib-version>1.1</tlib-version> <short-name>some</short-name> <tag> <name>forEach</name> <tag-class>tag.ForEachTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>varStatus</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
package tag; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspPage; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class ForEachTag extends SimpleTagSupport { private Object items; private String var; private String varStatus; public Object getItems() { return items; } public void setItems(Object items) { this.items = items; } public String getVar() { return var; } public void setVar(String var) { this.var = var; } public String getVarStatus() { return varStatus; } public void setVarStatus(String varStatus) { this.varStatus = varStatus; } @Override public void doTag() throws JspException, IOException { tag(); } private void tag() throws JspException, IOException { PageContext context = (PageContext) getJspContext(); Status status = null; if (varStatus != null) { status = new Status(); context.setAttribute(varStatus, status); } Iterator iterator = iterator(status); int index = 0; while (iterator.hasNext()) { if (status != null) { status.setIndex(index++); } context.setAttribute(var, iterator.next()); getJspBody().invoke(context.getOut()); } } private Iterator iterator(Status status) { Iterator iterator = null; if (items instanceof Collection) { if (status != null) { status.setLength(((Collection) items).size()); } iterator = ((Collection) items).iterator(); } else if (items instanceof Map) { if (status != null) { status.setLength(((Map) items).size()); } iterator = ((Map) items).entrySet().iterator(); } else if (items instanceof Object[]) { if (status != null) { status.setLength(((Object[]) items).length); } iterator = Arrays.asList((Object[]) items).iterator(); } return iterator; } }
package tag; public class Status { private int index; private int length; public int getLength() { return length; } public void setLength(int length) { this.length = length; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值