开发自定义 jstl标签库

先定义标签处理类  * 需要继承BodyTagSupport  或 TagSupport  方法 , 最好继承前者

继承以后 ,可以重写doAfterBody() , doEndTag() , doStartTag() 等方法 。

实例一: 打印字符串

1、编写标签处理类PringOutTarget.java

package zf.blog.util.tag;

import java.io.IOException;

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

public class PringOutTarget extends BodyTagSupport{
	
	private String name ;
	
	@Override
	public int doStartTag() throws JspException {
		try {
			pageContext.getOut().print("Hello:" + name);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return BodyTagSupport.EVAL_BODY_INCLUDE;	//执行标签内容
	}

	@Override
	public int doEndTag() throws JspException {
		return BodyTagSupport.EVAL_BODY_INCLUDE;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

2 、编写tld文件  zf.tld (放到WEB-INF)目录下面

<?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>1.2</jsp-version> 
 <short-name>zf</short-name>  
 <uri>http://www.zf.tag</uri>
 <tag>  
  <name>hello</name>        //标签名
  <tag-class>zf.blog.util.tag.PringOutTarget</tag-class>    //标签处理类
  <body-content>JSP</body-content>                    
  <attribute>                                                        
   <name>name</name>  	//属性名
   <required>true</required>            //是否是必须要的属性  true表示不能为空  false表示能为空
   <rtexprvalue>true</rtexprvalue>      //是否支持el表达式         
   <type>java.lang.String</type>        //参数类型     
  </attribute>  
 </tag>  
 
</taglib>  

3 、jsp测试

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="http://www.zf.tag" prefix="zf" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<zf:hello name="zhofueng"></zf:hello>
</body>
</html>


实例二 、 循环标签 

1、编写标签处理类LoopTag.java

package zf.blog.util.tag;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

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

public class LoopTag extends BodyTagSupport{

	private String var ;
	
	private Iterator iterator ;
	
	
	@Override
	public int doStartTag() throws JspException {
		if(haveNext()){
			return BodyTagSupport.EVAL_BODY_INCLUDE;
		}
			return BodyTagSupport.EVAL_PAGE;
	}
	
	@Override
	public int doAfterBody() throws JspException {
		if(haveNext()){
			return BodyTagSupport.EVAL_BODY_AGAIN;
		}
			return BodyTagSupport.EVAL_PAGE;
	}
	
	@Override
	public int doEndTag() throws JspException {
		return super.doEndTag();
	}

	public boolean haveNext(){
		if(iterator != null && iterator.hasNext()){
			this.pageContext.setAttribute(var, iterator.next());
			return true;
		}else{
			return false;
		}
	}
	
	public String getVar() {
		return var;
	}

	public void setVar(String var) {
		this.var = var;
	}

	public Iterator getIterator() {
		return iterator;
	}

	public void setIterator(Iterator iterator) {
		this.iterator = iterator;
	}
	
	public void setItem(Object item){
		if(item == null)
			return ;
		if(item instanceof Collection){
			this.iterator = ((Collection)item).iterator();
		}else if(item instanceof Map){
			this.iterator = ((Map)item).entrySet().iterator();
		}
	}
	
}

2、编写tld文件

<?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>1.2</jsp-version> 
 <short-name>zf</short-name>  
 <uri>http://www.zf.tag</uri>
 <tag>  
  <name>hello</name>        
  <tag-class>com.zf.target.PringOutTarget</tag-class>   
  <body-content>JSP</body-content>                    
  <attribute>                                                        
   <name>name</name>  
   <required>true</required>                            
   <rtexprvalue>true</rtexprvalue>                   
   <type>java.lang.String</type>                   
   <description>用户名称</description>            
  </attribute>  
 </tag>  
 
 <tag>
 	<name>loop</name>
 	<tag-class>com.zf.target.LoopTag</tag-class>
 	<body-content>JSP</body-content>
 	<attribute>
 		<name>var</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.String</type>     
 	</attribute>
 	<attribute>
 		<name>item</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.Object</type>  
 	</attribute>
 </tag>
 
</taglib>  

3、jsp测试

<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="http://www.zf.tag" prefix="zf" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<%
	List list = new ArrayList();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(9);   
	pageContext.setAttribute("list", list);
%>
<body>
	index.jsp
	<br/>
	<hr/>
	<zf:hello name="zhofueng"></zf:hello>
	<br/>
	<hr/>
	<zf:loop var="l" item="${list}">
		${l}    
		<br/>
	</zf:loop>
	<br/>   
</body>
</html>

实例4、 输出字符串, 超过自定长度 用.代替

1、 编写标签处理类

package zf.blog.util.tag;

import java.io.IOException;

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

public class PrintString extends BodyTagSupport {
	private static final long serialVersionUID = 1L;
	
	private String str; 	//目标字符串
	private int maxLen;	//最大长度
	
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		return super.doAfterBody();
	}
	
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		return super.doEndTag();
	}
	
	@Override
	public int doStartTag() throws JspException {
		try {
			this.pageContext.getOut().println(formatStr());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return BodyTagSupport.EVAL_PAGE;
	}
	
	public String formatStr(){
		String temp = null;
		if(str.length() > maxLen){
			temp = str.substring(0 , maxLen-3);
			temp += "...";
		}else{
			temp = str;
		}
		return temp;
	}
	
	
	
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public int getMaxLen() {
		return maxLen;
	}
	public void setMaxLen(int maxLen) {
		this.maxLen = maxLen;
	}
}

2、编写tld文件

<?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>1.2</jsp-version> 
 <short-name>zf</short-name>  
 <uri>http://www.zf.tag</uri>
 <tag>  
  <name>hello</name>        
  <tag-class>com.zf.target.PringOutTarget</tag-class>   
  <body-content>JSP</body-content>                    
  <attribute>                                                        
   <name>name</name>  
   <required>true</required>                            
   <rtexprvalue>true</rtexprvalue>                   
   <type>java.lang.String</type>                   
   <description>用户名称</description>            
  </attribute>  
 </tag>  
 
 <tag>
 	<name>loop</name>
 	<tag-class>com.zf.target.LoopTag</tag-class>
 	<body-content>JSP</body-content>
 	<attribute>
 		<name>var</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.String</type>     
 	</attribute>
 	<attribute>
 		<name>item</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.Object</type>  
 	</attribute>
 </tag>
 
 <tag>
 	 <name>pringStr</name>
 	 <tag-class>com.zf.target.PrintString</tag-class>
 	 <body-content>JSP</body-content>
 	 <attribute>
 		<name>str</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.String</type>     
 	</attribute>
 	 <attribute>
 		<name>maxLen</name>
 		 <required>true</required>     
 		 <rtexprvalue>true</rtexprvalue>   
 		 <type>java.lang.Integer</type>     
 	</attribute>
 </tag>
 
</taglib>  

3、编写jsp测试
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="http://www.zf.tag" prefix="zf" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<%
	List list = new ArrayList();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(9);   
	pageContext.setAttribute("list", list);
%>
<body>
	index.jsp
	<br/>
	<hr/>
	<zf:hello name="zhofueng"></zf:hello>
	<br/>
	<hr/>
	<zf:loop var="l" item="${list}">
		${l}    
		<br/>
	</zf:loop>
	<br/>   
	<hr/>
	<zf:pringStr maxLen="10" str="fdsafdsafsdafsad">444444444</zf:pringStr>
	<br/>
	<zf:pringStr maxLen="10" str="2144343232">444444444</zf:pringStr>
</body>
</html>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值