欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义标签

程序员文章站 2022-06-08 23:03:25
...
package com.fsti.tag;

import java.util.Collection;
import java.util.Iterator;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class MyTagFor extends BodyTagSupport {
	/**
	 * 这个里面定一个集合,我们不考虑数组的这个情况。
	 */
	private Collection items;	
	private String var;
	private Iterator it;
	
	public void setItems(Collection items) {
		this.items = items;
	}
	public void setVar(String var) {
		this.var = var;
	}
	/**
	 * 根据声明周期,我们知道,如果items为null或者说长度为0,我们就没有必要再继续这个标签体的方法了。所以,我们就可以在doStartTag方法中
	 * 直接跳出。
	 */
	
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		
		if(it.hasNext())
		{
			this.pageContext.setAttribute(var,it.next());
			return EVAL_BODY_AGAIN;// 这个返回值,是让方法继续循环执行方法 
		}		
		return SKIP_BODY;
	}
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		
		if( items == null || items.size() == 0)
		{
			return SKIP_BODY;//这个返回值在doStartTag方法和doAfterBody方法中可以起到直接结束当前方法的作用
		}				
		it = items.iterator();	
		return EVAL_BODY_INCLUDE;//这个返回值,可以让我们的数据自然的保存在输出流中。并且继续下面的方法,这个返回值我们要特别的注意
	}	
}
 
<?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">  
<tag>
    <name>for</name>
    <tag-class>com.fsti.tag.MyTagFor</tag-class>
    <body-content>JSP</body-content>
   	<attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>