先定义标签处理类 * 需要继承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>