`

jsp标签编程『下』---开发迭代标签

阅读更多

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

IterateTag.java:

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 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:

  <taglib>
  		<taglib-uri>iterate</taglib-uri>
  		<taglib-location>/WEB-INF/iteratetag.tld</taglib-location>
  </taglib>

 index.jsp:

<%@ page import="java.util.*" %>
<%@ taglib prefix="iteratetag" uri="iterate"%>

  <body>
	<%
		List<String> all = new ArrayList<String>();
		all.add("java");
		all.add("linux");
		all.add("C");
		request.setAttribute("all",all);
	 %>
	<iteratetag:iterate name="all" scope="request" id="url">
		${url }<br />
	</iteratetag:iterate>
  </body>
分享到:
评论

相关推荐

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

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

    JSTL详解--Core 标签库介绍

    最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。 JavaServer Pages(JSP)是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算...

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

    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 带书签 上

    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 (高清版) 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章 标准标签...

    java web 视频、电子书、源码(李兴华老师出版)

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

    JavaWeb框架asta4d.zip

    互联网企业的开发通常是快速迭代的,并没有明确的需求一说,传统的PHP开发模式之所以受到青睐,就在于它易于变更,开发速度快,MVC模式的开发在这一点基本完败,因此,很少有互联网企业会基于Java来构建自己的前端...

    java初学者必看

    4.4.3 标签语句 4.5 返回语句 4.6 综合实例:水仙花数 4.7 本章习题 第5章 字符串 5.1 字符串简介 5.1.1 字符串常量 5.1.2 String创建字符串常量 5.1.3 StringBuffer创建字符串 5.2 连接字符串 5.2.1 与...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    Java学习笔记-个人整理的

    {2.1.3}面向对象的编程}{47}{subsection.2.1.3} {2.2}继承}{48}{section.2.2} {2.2.1}super(), this()}{49}{subsection.2.2.1} {2.2.2}方法重写/覆盖}{50}{subsection.2.2.2} {2.3}修饰符}{51}{section.2.3} ...

Global site tag (gtag.js) - Google Analytics