1、AuthorTag.java
package com.ats.taglib; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class AuthorTag extends TagSupport{ private static final long serialVersionUID = 1L; private String version="v1.0"; @Override public int doStartTag(){ JspWriter out=pageContext.getOut(); try { out.print("<div>AuthorTag "+version+" by NEOHOPE</div>"); } catch (IOException e) { e.printStackTrace(); } return EVAL_BODY_INCLUDE; } @Override public int doEndTag(){ return EVAL_PAGE; } public String getVersion() { return version; } public void setVersion(String version) { this.version=version; } }
2、IterateTag.java
package com.ats.taglib; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class IterateTag extends BodyTagSupport { private static final long serialVersionUID = 1L; private Iterator it; private String type; private String name; public void setCollection(Collection collection) { if (collection.size() > 0) it = collection.iterator(); } public void setType(String type) { this.type=type; } public void setName(String name) { this.name=name; } @Override public int doStartTag() { JspWriter out=pageContext.getOut(); try { out.print("<table>"); } catch (IOException e) { e.printStackTrace(); } if (it == null) return SKIP_BODY; else return continueNext(it); } @Override public int doAfterBody() { return continueNext(it); } @Override public int doEndTag() { try { if (bodyContent != null) bodyContent.writeOut(bodyContent.getEnclosingWriter()); } catch (Exception e) { System.out.println(e); } JspWriter out=pageContext.getOut(); try { out.print("</table>"); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } protected int continueNext(Iterator it) { if (it.hasNext()) { pageContext.setAttribute(name, "<tr><td>"+it.next()+"</td></tr>", pageContext.PAGE_SCOPE); return EVAL_BODY_TAG; } else { return SKIP_BODY; } } }
3、IterateTagTEI.java
package com.ats.taglib; import javax.servlet.jsp.tagext.TagData; import javax.servlet.jsp.tagext.TagExtraInfo; import javax.servlet.jsp.tagext.VariableInfo; public class IterateTagTEI extends TagExtraInfo { public IterateTagTEI() { super(); } @Override public VariableInfo[] getVariableInfo(TagData data) { return new VariableInfo[] { new VariableInfo( data.getAttributeString("name"), data.getAttributeString("type"), true, VariableInfo.NESTED) }; } }
4、LoopTag.java
package com.ats.taglib; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class LoopTag extends BodyTagSupport { private static final long serialVersionUID = 1L; private int total = 0; private int count = 0; @Override public int doStartTag() { try { if (total > 0) return EVAL_BODY_TAG; else return SKIP_BODY; } catch (Exception e) { e.printStackTrace(); return SKIP_BODY; } } @Override public int doAfterBody() { try { if (total - count>1) { count++; return EVAL_BODY_TAG; } else { count=0; return SKIP_BODY; } } catch (Exception e) { e.printStackTrace(); return SKIP_BODY; } } @Override public int doEndTag() { try { bodyContent.writeOut(bodyContent.getEnclosingWriter()); } catch (Exception e) { e.printStackTrace(); } return EVAL_PAGE; } public void setTotal(int total) { this.total = total; } public int getTotal() { return total; } }
5、Taglib.tld
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"] <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>at</shortname> <tag> <name>AuthorTag</name> <tagclass>com.ats.taglib.AuthorTag</tagclass> <bodycontent>empty</bodycontent> <attribute> <name>version</name> <required>false</required> </attribute> </tag> <tag> <name>LoopTag</name> <tagclass>com.ats.taglib.LoopTag</tagclass> <bodycontent>jsp</bodycontent> <attribute> <name>total</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>IterateTag</name> <tagclass>com.ats.taglib.IterateTag</tagclass> <teiclass>com.ats.taglib.IterateTagTEI</teiclass> <bodycontent>jsp</bodycontent> <attribute> <name>collection</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>name</name> <required>true</required> </attribute> <attribute> <name>type</name> <required>true</required> </attribute> </tag> </taglib>
6、web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"] <display-name>TaglibTest</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <jsp-config> <taglib> <taglib-uri> http://www.ats.com/Taglib </taglib-uri> <taglib-location> /WEB-INF/tags/Taglib.tld </taglib-location> </taglib> </jsp-config> </web-app>
7、index.jsp
<%@ taglib prefix="ats" uri="http://www.ats.com/Taglib" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.util.Date"%> <%@ page import="java.util.ArrayList"%> <!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>TaglibTest</title> </head> <body> <ats:AuthorTag version="v1.01"/> <ats:LoopTag total="3"> <div><%=new Date()%></div> </ats:LoopTag> <% ArrayList<String> t=new ArrayList<String>(); t.add("A"); t.add("B"); t.add("C"); %> <div> <ats:IterateTag name="row" type="String" collection="<%=t%>"> <%=row%> </ats:IterateTag> </div> </body> </html>