1. [代码]使用到了数组反射的一些知识
//1:EachTag
package cn.itcast.apsliyuan.tag;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class EachTag extends TagSupport {
/**
* 反序列化
*/
private static final long serialVersionUID = 7239081890975877992L;
private String var;
private Iterator<Object> it;
public void setVar(String var) {
this.var = var;
}
public void setItems(Object object) {
if (object instanceof Collection) {
it = ((Collection) object).iterator();
} else if (object instanceof Map) {
it = ((Map) object).entrySet().iterator();
} else if (object.getClass().isArray()) {//数组反射,虽然影响了效率,但是比每种类型相比是简单多了
List<Object> list = new ArrayList<Object>();
int len = Array.getLength(object);
for (int i = 0; i < len; i++) {
list.add(Array.get(object, i));
}
it = list.iterator();
}
}
// 只会执行一次
@Override
public int doStartTag() throws JspException {
if (it.hasNext()) {
pageContext.setAttribute(var, it.next());
return EVAL_BODY_INCLUDE;
} else {
return SKIP_BODY;
}
}
@Override
public int doAfterBody() throws JspException {
// TODO Auto-generated method stub
if (it.hasNext()) {
pageContext.setAttribute(var, it.next());
return EVAL_BODY_AGAIN;// 再次执行body部分
} else {
return SKIP_BODY;
}
}
@Override
public int doEndTag() throws JspException {
pageContext.removeAttribute(var);
return EVAL_PAGE;
}
}
2. [代码][Java]代码
//2:each.tld<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <!-- 定义版本 --> <tlib-version>1.0</tlib-version> <!-- 定义名字 --> <short-name>apsliyuan</short-name> <!-- 定义uri --> <uri>http://my.oschina.net/apsliyuan</uri> <tag> <name>forEach</name> <tag-class>cn.itcast.apsliyuan.tag.EachTag</tag-class> <body-content>JSP</body-content> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag></taglib>3. [代码][Java]代码
//3:jsp代码<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%><%@taglib uri="http://my.oschina.net/aps" prefix="aps"%><%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@taglib uri="http://my.oschina.net/apsliyuan" prefix="apsliyuan"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>index.jsp</title></head><body> <% List str = new ArrayList(); str.add("liyuan"); str.add("liyuan02"); str.add("liyuan03"); str.add("liyuan04"); pageContext.setAttribute("strs",str); Map map=new HashMap(); map.put("01",11); map.put("02",12); map.put("03",13); map.put("04",14); pageContext.setAttribute("map",map); String[] strArray={"12","23","34"}; pageContext.setAttribute("strArray",strArray); %> <apsliyuan:forEach items="${strs}" var="strss"> ${strss}<br/> </apsliyuan:forEach> <hr/> <apsliyuan:forEach items="${map}" var="maps"> ${maps}<br/> </apsliyuan:forEach> <hr/> <apsliyuan:forEach items="${strArray}" var="strArrays"> ${strArrays} <br/> </apsliyuan:forEach></body></html>
本文介绍了一种在JSP中实现自定义迭代标签的方法,该标签能够遍历集合、映射和数组等多种数据结构,并通过反射机制简化了对数组的操作。文章提供了完整的代码示例,包括标签的实现类、tld文件配置以及JSP页面调用。
&spm=1001.2101.3001.5002&articleId=72780122&d=1&t=3&u=230de5ff359c4dcbb27b023b9b52a7a8)
1379

被折叠的 条评论
为什么被折叠?



