`

自定义jstl标签

阅读更多

步骤如下:


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

2、写标签处理器类。

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

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

tls文档:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>2.0</jsp-version>
	<short-name>ip</short-name>
	<uri>http://www.xx.tag</uri>
	<tag>
		<name>stringCut</name>
		<tag-class>com.xx.utils.jstl.JSTLStringCut</tag-class>
		<attribute>
			<name>str</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue><!-- 是否支持el表达式 -->
			<type>java.lang.String</type>
			<description>輸入字符串</description>
		</attribute>
		<attribute>
			<name>length</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.Integer</type>
			<description>要显示字符串的长度</description>
		</attribute>
		<attribute>
			<name>showDot</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>java.lang.Boolean</type>
			<description>是否显示点号</description>
		</attribute>
	</tag>
</taglib>

 

 标签处理器类:

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

<jsp-config>
         <taglib>        
             <taglib-uri>http://www.xx.tag</taglib-uri>   
             <taglib-location>/WEB-INF/tags/string-cut.tld</taglib-location>            
         </taglib>   
</jsp-config>

 jsp中使用标签

jsp页面顶部加入:

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

 

<ip:stringCut str="${str}" length="10" showDot="true"></ip:stringCut>

 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()返回。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics