开发迭代标签

开发一个迭代标签,此标签只可以对list进行迭代(学习)。

IterateTag.java:

Java代码 复制代码  收藏代码
  1. package com.keith.tag;   
  2.   
  3. import java.util.Iterator;   
  4. import java.util.List;   
  5.   
  6. import javax.servlet.jsp.JspException;   
  7. import javax.servlet.jsp.PageContext;   
  8. import javax.servlet.jsp.tagext.TagSupport;   
  9.   
  10. public class IterateTag extends TagSupport {   
  11.     // 属性名称   
  12.     private String name;   
  13.     // 属性保存范围   
  14.     private String scope;   
  15.     // 每次迭代的对象   
  16.     private String id;   
  17.     // 所以接受到的数据   
  18.     private Iterator<?> iter;   
  19.   
  20.     @Override  
  21.     public int doStartTag() throws JspException {   
  22.         Object value = null;   
  23.         // 是否是page范围   
  24.         if ("page".equals(this.scope)) {   
  25.             value = super.pageContext   
  26.                     .getAttribute(name, PageContext.PAGE_SCOPE);   
  27.         } else if ("request".equals(this.scope)) {   
  28.             // 是否是request范围   
  29.             value = super.pageContext.getAttribute(name,   
  30.                     PageContext.REQUEST_SCOPE);   
  31.         } else if ("session".equals(this.scope)) {   
  32.             // 是否是session范围   
  33.             value = super.pageContext.getAttribute(name,   
  34.                     PageContext.SESSION_SCOPE);   
  35.         } else {   
  36.             // 是否是application范围   
  37.             value = super.pageContext.getAttribute(name,   
  38.                     PageContext.APPLICATION_SCOPE);   
  39.         }   
  40.   
  41.         //如果是List接口的实例   
  42.         if (value != null && value instanceof List<?>) {   
  43.             //像List接口进行向下转型   
  44.             this.iter = ((List<?>) value).iterator();   
  45.             if (iter.hasNext()) {   
  46.                 super.pageContext.setAttribute(id, iter.next());   
  47.                 //执行标签体内容   
  48.                 return TagSupport.EVAL_BODY_INCLUDE;    
  49.             }else{   
  50.                 //退出标签执行   
  51.                 return TagSupport.SKIP_BODY;   
  52.             }   
  53.         } else {   
  54.             //不是List接口实例,不处理   
  55.             //退出标签执行   
  56.             return TagSupport.SKIP_BODY;   
  57.         }   
  58.     }   
  59.   
  60.        
  61.     @Override  
  62.     public int doAfterBody() throws JspException {   
  63.         //判断是否还有内容   
  64.         if (iter.hasNext()) {   
  65.             super.pageContext.setAttribute(id, iter.next());   
  66.             //重复执行标签体   
  67.             return TagSupport.EVAL_BODY_AGAIN;   
  68.         }else{   
  69.             //退出标签执行   
  70.             return TagSupport.SKIP_BODY;   
  71.         }   
  72.     }   
  73.   
  74.   
  75.     public String getName() {   
  76.         return name;   
  77.     }   
  78.   
  79.     public void setName(String name) {   
  80.         this.name = name;   
  81.     }   
  82.   
  83.     public String getScope() {   
  84.         return scope;   
  85.     }   
  86.   
  87.     public void setScope(String scope) {   
  88.         this.scope = scope;   
  89.     }   
  90.   
  91.     public String getId() {   
  92.         return id;   
  93.     }   
  94.   
  95.     public void setId(String id) {   
  96.         this.id = id;   
  97.     }   
  98.   
  99.     public Iterator<?> getIter() {   
  100.         return iter;   
  101.     }   
  102.   
  103.     public void setIter(Iterator<?> iter) {   
  104.         this.iter = iter;   
  105.     }   
  106.   
  107. }  
package com.keith.tag;

import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

public class IterateTag extends TagSupport {
	// 属性名称
	private String name;
	// 属性保存范围
	private String scope;
	// 每次迭代的对象
	private String id;
	// 所以接受到的数据
	private Iterator<?> iter;

	@Override
	public int doStartTag() throws JspException {
		Object value = null;
		// 是否是page范围
		if ("page".equals(this.scope)) {
			value = super.pageContext
					.getAttribute(name, PageContext.PAGE_SCOPE);
		} else if ("request".equals(this.scope)) {
			// 是否是request范围
			value = super.pageContext.getAttribute(name,
					PageContext.REQUEST_SCOPE);
		} else if ("session".equals(this.scope)) {
			// 是否是session范围
			value = super.pageContext.getAttribute(name,
					PageContext.SESSION_SCOPE);
		} else {
			// 是否是application范围
			value = super.pageContext.getAttribute(name,
					PageContext.APPLICATION_SCOPE);
		}

		//如果是List接口的实例
		if (value != null && value instanceof List<?>) {
			//像List接口进行向下转型
			this.iter = ((List<?>) value).iterator();
			if (iter.hasNext()) {
				super.pageContext.setAttribute(id, iter.next());
				//执行标签体内容
				return TagSupport.EVAL_BODY_INCLUDE; 
			}else{
				//退出标签执行
				return TagSupport.SKIP_BODY;
			}
		} else {
			//不是List接口实例,不处理
			//退出标签执行
			return TagSupport.SKIP_BODY;
		}
	}

	
	@Override
	public int doAfterBody() throws JspException {
		//判断是否还有内容
		if (iter.hasNext()) {
			super.pageContext.setAttribute(id, iter.next());
			//重复执行标签体
			return TagSupport.EVAL_BODY_AGAIN;
		}else{
			//退出标签执行
			return TagSupport.SKIP_BODY;
		}
	}


	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getScope() {
		return scope;
	}

	public void setScope(String scope) {
		this.scope = scope;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Iterator<?> getIter() {
		return iter;
	}

	public void setIter(Iterator<?> iter) {
		this.iter = iter;
	}

}

 iteratetag.tld:

Xml代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
  5.     version="2.1">  
  6.     <!-- 标签库的版本 -->  
  7.     <tlib-version>1.0</tlib-version>  
  8.     <!-- 为标签苦在TLD中的描述名称 -->  
  9.     <short-name>iteratetag</short-name>  
  10.     <tag>  
  11.     <!-- 表示标签在JSP中的使用名称 -->  
  12.         <name>iterate</name>  
  13.         <!-- 表示这个标签所这项的Class -->  
  14.         <tag-class>com.keith.tag.IterateTag</tag-class>  
  15.         <!-- 标签体内容为空 -->  
  16.         <body-content>JSP</body-content>  
  17.         <attribute>  
  18.         <!-- format为属性名 -->  
  19.             <name>id</name>  
  20.             <!-- 表示此值必须设置 -->  
  21.             <required>true</required>  
  22.             <!-- 表示属性值是请求时表达式的结果 -->  
  23.             <rtexprvalue>true</rtexprvalue>  
  24.         </attribute>  
  25.   
  26.         <attribute>  
  27.         <!-- format为属性名 -->  
  28.             <name>name</name>  
  29.             <!-- 表示此值必须设置 -->  
  30.             <required>true</required>  
  31.             <!-- 表示属性值是请求时表达式的结果 -->  
  32.             <rtexprvalue>true</rtexprvalue>  
  33.         </attribute>  
  34.            
  35.         <attribute>  
  36.         <!-- format为属性名 -->  
  37.             <name>scope</name>  
  38.             <!-- 表示此值必须设置 -->  
  39.             <required>true</required>  
  40.             <!-- 表示属性值是请求时表达式的结果 -->  
  41.             <rtexprvalue>true</rtexprvalue>  
  42.         </attribute>  
  43.     </tag>  
  44. </taglib>  
<?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>
	<!-- 为标签苦在TLD中的描述名称 -->
	<short-name>iteratetag</short-name>
	<tag>
	<!-- 表示标签在JSP中的使用名称 -->
 		<name>iterate</name>
 		<!-- 表示这个标签所这项的Class -->
 		<tag-class>com.keith.tag.IterateTag</tag-class>
		<!-- 标签体内容为空 -->
 		<body-content>JSP</body-content>
 		<attribute>
 		<!-- format为属性名 -->
 			<name>id</name>
 			<!-- 表示此值必须设置 -->
 			<required>true</required>
 			<!-- 表示属性值是请求时表达式的结果 -->
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>

 		<attribute>
 		<!-- format为属性名 -->
 			<name>name</name>
 			<!-- 表示此值必须设置 -->
 			<required>true</required>
 			<!-- 表示属性值是请求时表达式的结果 -->
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
 		
 		<attribute>
 		<!-- format为属性名 -->
 			<name>scope</name>
 			<!-- 表示此值必须设置 -->
 			<required>true</required>
 			<!-- 表示属性值是请求时表达式的结果 -->
 			<rtexprvalue>true</rtexprvalue>
 		</attribute>
	</tag>
</taglib>

 web.xml:

Xml代码 复制代码  收藏代码
  1. <taglib>  
  2.         <taglib-uri>iterate</taglib-uri>  
  3.         <taglib-location>/WEB-INF/iteratetag.tld</taglib-location>  
  4. </taglib>  
  <taglib>
  		<taglib-uri>iterate</taglib-uri>
  		<taglib-location>/WEB-INF/iteratetag.tld</taglib-location>
  </taglib>

 index.jsp:

Java代码 复制代码  收藏代码
  1. <%@ page import="java.util.*" %>   
  2. <%@ taglib prefix="iteratetag" uri="iterate"%>   
  3.   
  4.   <body>   
  5.     <%   
  6.         List<String> all = new ArrayList<String>();   
  7.         all.add("java");   
  8.         all.add("linux");   
  9.         all.add("C");   
  10.         request.setAttribute("all",all);   
  11.      %>   
  12.     <iteratetag:iterate name="all" scope="request" id="url">   
  13.         ${url }<br />   
  14.     </iteratetag:iterate>   
  15.   </body>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值