`
ymq267
  • 浏览: 128894 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

自定义JSP中的Taglib标签之三简单仿JSTL中带标签体的ForEach循环

阅读更多
上2篇文章分别了介绍了taglib的无属性状态和有带属性状态,但是都是分别都是独立的闭标签,这次带来的是带属性的和带标签体的例子,仿照jstl中的forEach循环构造一个简单的循环标签.

Java代码如下:
package org.lxh.taglib;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

public class TestForEach extends BodyTagSupport {

	private static final long serialVersionUID = -5210136338413610356L;
	private String var;
	private Iterator<?> iterator;

	public String getVar() {
		return var;
	}

	public void setVar(String var) {
		this.var = var;
	}

	public void setItem(Object item) {
		if (item instanceof Map) {
			Map items = (Map) item;
			this.iterator = items.entrySet().iterator();
		} else {
			Collection<?> c = (Collection) item;
			this.iterator = c.iterator();
		}
	}

	@Override
	public int doAfterBody() throws JspException {
		if (this.process()) {
			return EVAL_BODY_AGAIN;
		} else {
			return EVAL_PAGE;
		}
	}

	@Override
	public int doStartTag() throws JspException {
		if (this.process())
			return EVAL_BODY_INCLUDE;
		else
			return EVAL_PAGE;

	}

	private boolean process() {

		if (null != iterator && iterator.hasNext()) {
			Object item = iterator.next();
			pageContext.setAttribute(var, item);
			return true;
		} else
			return false;
	}

}
 


问题1:为什么要继承BodyTagSupport 而不去只实现IterationTag接口或者直接继承TagSupport使用呢?

TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport而不去实现IterationTag接口的,因为BodyTagSupport继承了TagSupport类,并且该类已经实现了IterationTag接口并且实现了功能.

doStartTag()方法在标签开始时执行,要记住每次都要对类进行初始化,避免上一次的遗留数据对操作造成影响。然后判断是否有数据需要处理,如果有,则返回EVAL_BODY_INCLUDE开始处理标签里的内容,如果没有,返回 EVAL_PAGE跳过标签内容执行标签下面的内容。

doAfterBody()方法在每次处理完标签内部内容后执行,判断循环是否已经结束,如果可以继续循环,返回EVAL_BODY_AGAIN用循环得到新的数据再次处理标签内部内容,如果循环结束就返回EVAL_PAGE结束标签。

tld如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
	version="2.0">
	<tlib-version>1.0</tlib-version>
	<short-name>for</short-name>
	<uri></uri>

	<tag>
		<name>foreach</name>
		<tag-class>org.lxh.taglib.TestForEach</tag-class>
		<tei-class>org.lxh.tagei.ForEachInfo</tei-class>
		<body-content>JSP</body-content>

		<attribute>
			<name>var</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>item</name>
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.Object</type>
			<!--  <type>java.util.Collection</type>-->
		</attribute>
	</tag>
</taglib>

是不是发现tld有点改变了,没错,如果要使用包含标签体的标签库的话需要在<body-content>标签中加入jsp,这样的话该标签表示可以包含jsp和html的标签进行一起循环,上面是否还发现多了一个<tei-class>标签,该标签用途就是对当前自定义的标签体进行验证检查的.

tei验证检查代码如下:
package org.lxh.tagei;

import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.TagExtraInfo;
import javax.servlet.jsp.tagext.VariableInfo;

public class ForEachInfo extends TagExtraInfo {
	final private static String ITEMS = "item";
	final private static String VAR = "var";

	 @Override
	 public VariableInfo[] getVariableInfo(TagData data) {
	 return new VariableInfo[] {
	 new VariableInfo(data.getAttributeString("var"),
	 "java.lang.String", true, VariableInfo.AT_BEGIN),
	 new VariableInfo(data.getAttribute("item").toString(),
	 "java.lang.Object", true, VariableInfo.AT_BEGIN) };
	 }

	@Override
	public boolean isValid(TagData us) {
		if (!Util.isSpecified(us, ITEMS))
			return false;
		return true;
	}

}
public class Util {

	/**
	 * Returns true if the given attribute name is specified, false otherwise.
	 */
	public static boolean isSpecified(TagData data, String attributeName) {

		return (data.getAttribute(attributeName) != null);
	}

才用验证的好处非常之多的,可以对当前传入的值进行验证,还有非空的检查,在标签的时候如果不写某个标签体会出现验证为false的提示.
jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="/WEB-INF/tld/testforeach.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@page import="java.util.*"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<%
    List<String> list = new ArrayList<String>();
    list.add("aa");
    list.add("bb");
    list.add("cc");
    Map map = new HashMap();
    map.put("1","a");
    map.put("2","b");
    map.put("3","c");
    map.put("4","b");
%>
<body>
<table>

    <c:foreach var="hi"  item="<%=map %>" >
        <tr>
            <td>${hi}</td>
        </tr>
    </c:foreach>
</table>
</body>
</html>
分享到:
评论

相关推荐

    JSTL 以及自定义标签开发相关

    JSTL 以及自定义标签...3.循环标签:forEach、forTokens 4.URL操作标签:import、url、redirect 使用标签时,一定要在jsp文件头加入以下代码: &lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;

    JSTL 开发自定义标签使用的jar

    3. **在JSP页面中使用自定义标签**:在JSP页面中,你可以通过`&lt;%@ taglib %&gt;`指令引入自定义标签库,并用`&lt;mytag:tagname&gt;`的形式调用自定义标签。 4. **配置Web应用**:确保web.xml文件中配置了对JSTL的支持,包括...

    自定义JSTL标签java项目文件

    4. **在JSP页面中使用自定义标签**:完成以上步骤后,就可以在JSP页面中像使用标准JSTL标签一样使用自定义标签了。 例如,假设我们有一个名为`myTag`的自定义标签,其处理类为`com.example.MyTag`,在TLD文件中定义...

    jsp中使用jstl标签的驱动

    JSTL还提供了条件判断标签,如`&lt;c:if&gt;`和`&lt;c:choose&gt;`,以及循环标签`&lt;c:forEach&gt;`等,这些都极大地简化了JSP页面中的逻辑处理。例如,使用`&lt;c:forEach&gt;`遍历一个集合: ```jsp &lt;c:forEach items="${list}" var=...

    JavaWeb-12:自定义标签库开发&JSTL标签库

    1. **Core标签**:包括if、forEach、choose、when、otherwise等,它们对应于Java编程中的条件语句和循环结构,使得JSP页面的逻辑更清晰。 2. **Format标签**:用于日期和数字的格式化,如`&lt;fmt:formatDate&gt;`和`...

    JSP自定义Table标签demo

    首先,自定义标签是JSP标准标签库(JSTL)的一个扩展,JSTL虽然提供了很多内置标签,如`&lt;c:forEach&gt;`和`&lt;fmt:formatDate&gt;`,但它们可能无法满足所有复杂的业务需求。因此,开发者可以创建自己的标签库,以便更好地...

    自定义JSTL

    JavaServer Pages Standard Tag Library(JSTL)是Java Web开发中的一个标准标签库,它提供了用于处理常见任务的标签,如迭代、条件语句、XML处理等,使得开发者可以避免在JSP页面中编写过多的Java脚本,提升代码的...

    JSP 标准标签库(JSTL)

    JSTL(JavaServer Pages Standard Tag Library)是用于简化JSP开发的一组预定义标签库,它提供了多种功能,使得开发者能够更有效地处理常见的Web应用任务。JSTL的核心目标是减少在JSP页面中使用脚本元素,提高代码的...

    struts1.2、jstl、jsp三种标签教程

    2. **JSTL应用**:掌握JSTL的各个标签库,学会如何在JSP页面中使用JSTL简化代码,提升代码可读性。 3. **JSP进阶**:学习EL表达式,理解JSP指令(taglib、page、include等),以及JSP生命周期和内置对象的使用。 4...

    JSTL标签库-tomcat10-简化JSP中java代码

    JSTL(JavaServer Pages Standard Tag Library)是Java Web开发中一个重要的标签库,主要用于简化JSP页面中的Java代码,提高JSP页面的可读性和维护性。在Tomcat 10这个高性能、轻量级的Servlet容器中,JSTL的使用...

    自定义JSP标签

    4. **引入标签库**:在JSP页面中,使用`&lt;%@ taglib %&gt;`指令引入自定义标签库,并指定URI(通常是TLD文件的路径)。 5. **使用自定义标签**:在JSP页面中,就像使用标准JSP标签一样使用自定义标签,如`...

    taglib-standard-jstlel-1.2.5.zip

    在JavaWeb开发中,`taglib-standard-jstlel-1.2.5.zip`是一个重要的组件,它包含了用于增强JSP(JavaServer Pages)功能的标签库。这个压缩包主要用于提供一套标准的标签,使得开发者能够更加方便地在JSP页面上进行...

    Apache Standard Taglib(standard.jar 和 jstl.jar )jar下载

    在实际开发中,正确理解和使用Apache Standard Taglib能有效提升开发效率,简化JSP页面的复杂性,是每个Java Web开发者必备的技能之一。通过不断实践和学习,你可以掌握这些标签的用法,并灵活运用到实际项目中,...

    JSP标签、自定义标签,含有属性

    本资料包“JSP标签、自定义标签,含有属性”专注于讲解JSP中的两种主要标签类型:标准动作标签(JSP Standard Tags, JSTL)和自定义标签。 1. **JSP标准动作标签**: JSTL是一组符合JSR-52标准的标签库,包括核心...

    JSTL常用标签总结

    JSTL(JavaServer Pages Standard Tag Library)即JavaServer页面的标准标签库,它是一套用于JSP页面的自定义标签库,通过这些标签可以简化JSP页面的开发。本文将对JSTL中常用的标签进行总结。 首先,标签主要用于...

    简单JSP标签、自定义标签

    - **在JSP页面中使用自定义标签**:通过`&lt;jsp:useBean&gt;`导入标签库,然后在页面中像使用标准标签一样使用自定义标签。 ### 3. JSP简单标签 简单标签是自定义标签的一种特殊形式,它们没有开始和结束标签,只有一个...

    jstl标签库的配置

    **JSTL(JavaServer Pages Standard Tag Library)标签库**是Java Web开发中常用的一组标准标签库,它提供了一套方便、高效的JSP页面控制和数据处理标签,旨在简化JSP开发,提高代码的可读性和可维护性。本篇文章将...

    JSTL标签JSTL标签

    **JSTL(JavaServer Pages Standard Tag Library)标签库**是Java Web开发中的一个重要组成部分,它为JavaServer Pages(JSP)提供了一套标准的标签,用于简化网页开发,提高代码的可读性和可维护性。JSTL的出现是...

    在jsp页面中引入jstl

    - `&lt;c:forEach&gt;`:这是一个循环标签,用于迭代集合或数组中的元素。在这里,它遍历名为`stulist`的列表。 - `var`属性:指定一个变量名来存储每次迭代的当前项,本例中为`stu`。 - `items`属性:指定要迭代的集合或...

    JSTL 标签库 jsp C 标签库

    **JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是Java社区为了简化JSP开发而提出的一个标准,它提供了一系列的标签来处理常见的任务,如迭代、条件判断、XML处理等,旨在减少Java代码在JSP页面中...

Global site tag (gtag.js) - Google Analytics