自定义标签入门

1-编写一个实现TagSupport接口的实现类
jsp提供了一个方便类 TagSupport 覆盖doStartTag方法
public class IpTag extends TagSupport {

	private static final long serialVersionUID = 1L;

	@Override
	public int doStartTag() throws JspException {
		HttpServletRequest request = (HttpServletRequest) this.pageContext
				.getRequest();//得到 pageContext对象 因为所有的值都放在pageContext里面
		JspWriter out = this.pageContext.getOut();
	
		String ip = request.getRemoteAddr();
		try {
			out.write(ip);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return super.doStartTag();
	}
}
2-在.tld文件中为tab标签进行描述:(位于WEB-INF路径下:WEB-INF/itcast.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">
    
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
     <uri>/itcast</uri>  <!-- uri -->
    
   <tag>
    	<name>ip</name>  <!-- 为标签处理器类配一个标签名 -->
		<tag-class>com.itcast.tag.IpTag</tag-class>
		<body-content>empty</body-content>
		empty 空 
		JSP
		scriptless 不能有jsp
    </tag>
  
</taglib>
3-在jsp页面中使用标签
 <%@taglib prefix="itcast"  uri="/itcast"%>
 <itcast:ip>
 
 4-自定义标签执行流程
执行方法流程
setPageContext(PageContext pc) 
setParent(Tag t)      
doStartTag()  
doEndTag() 
release() 

5-自定义标签的作用
移除jsp代码
提高代码的可读性

6-自定义标签
  处理标签 doEndTag返回值控制页面输出
 	EVAL_BODY_INCLUDE 输出      
	EVAL_PAGE 输出
    SKIP_BODY 不执行标签体
    SKIP_PAGE 剩余页面不输出
 
 7-迭代标签 TagSupport也是继承IterationTag
 IterationTag 可以对内容进行迭代
 	 Tag.EVAL_BODY_INCLUDE;执行标签
 	 IterationTag.EVAL_BODY_AGAIN;//迭代标签 重复执行
 	 IterationTag.SKIP_BODY;//执行完 标签 跳过
 	 
 	 标签内容输出五次:
 public class DateTag extends TagSupport {
	
	int n=5;
	// 开始标签
	@Override
	public int doStartTag() throws JspException {
		
		return Tag.EVAL_BODY_INCLUDE;
	}

	// 标签体执行之后
	@Override
	public int doAfterBody() throws JspException {
	    n--;
	    if(n>0)
		return IterationTag.EVAL_BODY_AGAIN;//迭代标签 重复执行
	    else
	    	return IterationTag.SKIP_BODY;//执行完 标签 跳过
	}

	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doEndTag();
	}

}

7-修改标签 BodyTag
BodyTag.EVAL_BODY_BUFFERED; //把标签体作为对象传递给bodyContent()
 BodyTag.EVAL_PAGE;继续计算标签
/**
 * 修改标签体 
 修改标签体内容
 * @author admin
 *
 */
public class UpdateTagBody extends BodyTagSupport {
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		return BodyTag.EVAL_BODY_BUFFERED; //把标签体作为对象传递给bodyContent()
	}
@Override
   public int doEndTag() throws JspException {
	String text=getBodyContent().getString().toUpperCase();//得到标签体内容
	try {
		this.pageContext.getOut().write(text);//输出内容
	} catch (IOException e) {
		throw new RuntimeException(e);
	}
	
	return BodyTag.EVAL_PAGE;//继续执行  Continue evaluating the page.继续执行标签
}

}

8-JspContext 继承 pageContext
   	PageContext pageContext=(PageContext) getJspContext();
   
9-类 StringWriter  带缓冲的一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。

10-简单标签 SimpleTagSupport
	1-定义一个类继承SimpleTagSupport
	2-重写【覆盖】doTag方法
	*得到标签体 
		JspFragment jf=getJspBody();
	String text=writer.toString().toUpperCase();
	*得到JspContext 继承自PageContext 可以转
	PageContext pageContext=(PageContext) getJspContext();
	
    3-throw new SkipPageException();//不输出 就抛出一个异常
    4-在tld文件中配置
    
    ###简单标签生命周期
         创建一个实例 --->  setJspContext-->setParent--->setJspBody-->doTag() 
    代码
    
	@Override
	public void doTag() throws JspException, IOException {
		//得到标签体 
		JspFragment jf=getJspBody();
		//通过缓冲字符流得到缓冲字符
		StringWriter writer=new StringWriter();
		for (int i = 0; i < 5; i++) {
			jf.invoke(writer);//输出标签体	
			
		}
		String text=writer.toString().toUpperCase();
		PageContext pageContext=(PageContext) getJspContext();
		pageContext.getOut().write(text);//得到jspContext对象
//		throw new SkipPageException();//不输出 就抛出一个异常
	
	}

	
11带属性的标签
   <tag>
		<name>text</name>
		<tag-class>com.itcast.simpletag.AttributeTag</tag-class>
		<body-content>scriptless</body-content>

		<attribute>
			<name>date</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue><!-- 运行时表达式 el 和jsp -->
			
		</attribute>
	</tag>
    
自定义时间格式化标签:
注意:没有内容就不调用不然就会报错

public class DateFormatTag extends SimpleTagSupport {
	private String fmt = "yyyy-MM-dd";
	private Date date;

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment fragment = this.getJspBody();
		SimpleDateFormat format = new SimpleDateFormat(fmt);
		getJspContext().getOut().write(format.format(date));
		// fragment.invoke(null);没有内容就不调用

	}

	public void setFmt(String fmt) {
		if (fmt != null && !("".equals(fmt)))
			this.fmt = fmt;

	}

	public void setDate(Date date) {
		this.date = date;
	}
}
配置文件
<tag>
		<name>fmt</name>
		<tag-class>com.itcast.simpletag.DateFormatTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>fmt</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>date</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue><!-- 必须配置支持 el表达式运行时表达式 -->
		</attribute>
	</tag>

你可能感兴趣的:(自定义标签入门)