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>