自定义jstl标签

步骤如下:


1、写tld文档:用来指定标签的名字,标签库等。

2、写标签处理器类。

3、配置到web.xml中
4、在jsp中使用新定义的标签

例:实现一个自定义标签 功能如下 如果字符串长度超过规定长,则截取,并根据要求添加省略号

tls文档:




	1.0
	2.0
	ip
	http://www.xx.tag
	
		stringCut
		com.xx.utils.jstl.JSTLStringCut
		
			str
			false
			true
			java.lang.String
			輸入字符串
		
		
			length
			true
			true
			java.lang.Integer
			要显示字符串的长度
		
		
			showDot
			true
			true
			java.lang.Boolean
			是否显示点号
		
	

 

 标签处理器类:

package com.xx.utils.jstl;

import java.io.IOException;  

import javax.servlet.jsp.JspException;  
import javax.servlet.jsp.tagext.BodyTagSupport;  


public class JSTLStringCut extends BodyTagSupport{  
      
    private String str ;  
    private Integer length ;
    private Boolean showDot; 
      
    @Override  
    public int doStartTag() throws JspException {  
      System.out.println(str);
      System.out.println(length);
      System.out.println(showDot);
        try {  
        	if(str==null){
        		//do nothing
        	}else{
        		if(str.length()>length){
        			str=str.substring(0,length);
        			if(showDot){
        				str=str+"...";
        			}
        		}
        		pageContext.getOut().print(str); 
        	}
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return BodyTagSupport.EVAL_BODY_INCLUDE;//执行标签内容  
    }  
  
    @Override  
    public int doEndTag() throws JspException {  
        return BodyTagSupport.EVAL_BODY_INCLUDE;  
    }

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}

	public Integer getLength() {
		return length;
	}

	public void setLength(Integer length) {
		this.length = length;
	}

	public Boolean getShowDot() {
		return showDot;
	}

	public void setShowDot(Boolean showDot) {
		this.showDot = showDot;
	}  
  
}  

 配置到web.xml


                 
             http://www.xx.tag   
             /WEB-INF/tags/string-cut.tld            
            

 jsp中使用标签

jsp页面顶部加入:

<%@ taglib uri="http://www.xx.tag" prefix="ip" %>  

 

 more>>

 

 

 

以下部分转自:http://oyprunner.iteye.com/blog/539494

EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用   
EVAL_PAGE:继续处理页面,doEndTag()函数可用   
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用   
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用   
EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代   
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法  

 

 

BodyTagSupport类的方法:   
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();   
  
  
他们执行顺序如下:   
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()   
  
  
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,   
如果返回EVAL_BODY_INCLUDE则继续执行;   
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,   
而直接执行doEndTag()方法。   
  
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。   
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,   
EVAL_PAGE或SKIP_PAGE。   
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;   
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;   
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。   
  
标签中静态常量:   
  
EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流   
SKIP_BODY:告诉服务器不要处理正文内容   
EVAL_PAGE:让服务器继续执行页面   
SKIP_PAGE:让服务器不要处理剩余的页面   
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回   
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回   
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

 

你可能感兴趣的:(java,jstl)