java 中使用自定义标签模仿jstl的 ForEach()

本文介绍了一种在JSP中实现自定义迭代标签的方法,该标签能够遍历集合、映射和数组等多种数据结构,并通过反射机制简化了对数组的操作。文章提供了完整的代码示例,包括标签的实现类、tld文件配置以及JSP页面调用。

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值