`

开发迭代标签

    博客分类:
  • jsp
 
阅读更多

开发一个迭代标签,此标签只可以对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>  
分享到:
评论

相关推荐

    jsp自定义迭代标签

    ### JSP自定义迭代标签详解 #### 一、引言 在JSP(JavaServer Pages)开发中,自定义标签可以极大地提高代码的复用性和可维护性。特别是在处理循环迭代逻辑时,自定义迭代标签能够使页面逻辑更加清晰、简洁。本文...

    JAVAWEBjsp通用标签与迭代标签

    为了提高代码的可读性和可维护性,JSP引入了标签库,其中包括了通用标签和迭代标签。这些标签使得开发者能够以更加简洁的方式处理常见的编程任务,如数据输出、变量设置和循环。以下是关于`&lt;c:forEach&gt;`、`&lt;c:out&gt;`...

    Java标签库—Taglib.pdf

    - **Tag接口**:是传统标签必须实现的经典接口,它有一个直接子接口`IterationTag`,用于开发迭代标签。 - **TagSupport类**:是`IterationTag`的一个实现类,通过继承`TagSupport`,开发者可以方便地开发出迭代标签...

    自定义标签的开发

    `Tag`接口的直接子接口`IterationTag`是用于开发迭代标签的,如`for-each`,并且有一个默认实现类`TagSupport`。另一个子接口`BodyTag`允许标签包含内容体,`BodyTagSupport`是它的实现类,适用于需要处理内容体的...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签...

    简单JSP标签实现迭代

    在Java服务器页面(JSP)开发中,自定义标签(Custom Tags)是扩展JSP功能的一种强大工具。它们允许开发者创建可重用的组件,这些组件可以像HTML标签一样在页面上使用,从而提高代码的可读性和可维护性。本实例主要...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签...

    李兴华Java Web开发实战经典(高清版) Part2

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    12.6、开发迭代标签 12.7、BodyTagSupport类 12.8、TagExtraInfo类和VariableInfo类 12.9、使用BodyTagSupport开发迭代输出 12.10、简单标签 12.11、DynamicAttributes接口 12.12、本章摘要 第13章 标准标签...

    web开发常用标签

    【Web开发常用标签详解】 在Web开发中,熟练掌握各种标签是构建高效、易维护的网页的关键。这里我们将深入探讨Struts框架中的五个主要标签库,重点讲解Bean Tags、HTML Tags和Logic Tags。 1. Bean Tags: Bean ...

    标签打印机开发包

    在IT行业中,标签打印机的开发是一项重要的任务,特别是在自动化、物流、零售等领域有着广泛的应用。本文将基于"标签打印机开发包"的标题和描述,详细阐述相关知识点。 首先,"BPLADLL.dll"是这个开发包的核心组件...

    关于迭代的方法

    在IT领域,迭代是一个非常重要的概念,尤其在软件开发过程中,它不仅涉及算法的设计,还广泛应用于各种编程语言中数据结构的操作。本文将基于给定的信息,深入探讨迭代方法,特别是针对JSP(JavaServer Pages)环境...

    struts2迭代 Map List

    Struts2作为一款流行的Java Web框架,提供了丰富的标签库来简化视图层的开发,使得在JSP页面中处理数据变得更加便捷。在这个场景下,我们关注的是如何在Struts2中迭代Map和List对象。这两种数据结构在Web开发中经常...

    JavaWEB开发-简单标签 ppt

    `Tag`是所有标签接口的基础,而`SimpleTag`接口提供了一个更简单的处理模型,适用于不涉及迭代或嵌套标签的情况。 **标签的类型**有四种基本形式: 1. **空标签**:如 `&lt;hello/&gt;` 2. **带有属性的空标签**:如 `...

    matlab开发-使用PCA和迭代canyedge的ahybridskinlesionsegmenttool

    标题"matlab开发-使用PCA和迭代canyedge的ahybridskinlesionsegmenttool"提到了几个关键概念。首先,"matlab开发"表明这是一个基于MATLAB编程环境的项目,MATLAB是一款强大的数学计算软件,常用于数据分析、算法开发...

    matlab开发-迭代nTHPowerRootImageEqualization

    在MATLAB开发中,"迭代nTHPowerRootImageEqualization"是一种高级的图像处理技术,主要应用于图像增强和均衡化。这个技术的核心是通过迭代计算,对图像的像素值进行非线性变换,以改善图像的整体对比度和亮度分布。...

    用JSF1.2实现迭代,循环标签(还是组件?)

    在JSF 1.2中,我们经常需要处理数据的迭代和展示,这通常通过使用特定的组件或标签来实现。JSF(JavaServer Faces)是一个用于构建用户界面的Java框架,它允许开发者使用声明式的方式处理用户交互和数据绑定。在给定...

Global site tag (gtag.js) - Google Analytics