<%@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; } }
<?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; } }