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

自定义标签入门

程序员文章站 2022-06-08 22:23:50
...
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>

转载于:https://my.oschina.net/*/blog/163234