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

自定义jstl标签

程序员文章站 2022-06-08 18:07:00
...

步骤如下:


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