你的位置:首页 > Java教程

[Java教程]jsp中自定义Taglib案例


一、使用TagSupport类案例解析

1.自定义Tag使用jdbc连接mysql数据库

1.1定义标签处理器类

package com.able.tag;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;public class DBconnectionTag extends TagSupport {	private String driver;// 连接驱动	private String url;// 连接db地址	private String password;// 连接db密码	private String sql;// 查询sql	private String username;// 连接db用户名	Connection conn = null;	Statement stmt = null;	ResultSet rs = null;	@Override	public int doEndTag() throws JspException {		try {			Class.forName(this.driver);			conn = DriverManager.getConnection(this.url,this.username,this.password);			stmt = conn.createStatement();			rs = stmt.executeQuery(this.sql);			if (rs != null) {				while (rs.next()) {					pageContext.getOut().print(rs.getString("cname")+"<br/>");				}			}			return EVAL_PAGE;		} catch (Exception e) {			e.printStackTrace();			return SKIP_PAGE;		} finally {				try {					if (rs != null) {						rs.close();					}					if (stmt != null) {						stmt.close();					}					if (conn != null) {						conn.close();					}				} catch (SQLException e) {					e.printStackTrace();				}		}	}	public String getDriver() {		return driver;	}	public void setDriver(String driver) {		this.driver = driver;	}	public String getUrl() {		return url;	}	public void setUrl(String url) {		this.url = url;	}	public String getPassword() {		return password;	}	public void setPassword(String password) {		this.password = password;	}	public String getSql() {		return sql;	}	public void setSql(String sql) {		this.sql = sql;	}	public String getUsername() {		return username;	}	public void setUsername(String username) {		this.username = username;	}}

1.2 在tag.tld文件中添加tag标签

 <tag>	 	<name>DBconnectionTag</name><!-- 定义标签名 -->	 	<tag-class>com.able.tag.DBconnectionTag</tag-class>	 	<body-content>empty</body-content> <!-- 定义标签体为空 -->	 	<attribute>	 		<name>driver</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue><!-- 可以使用el表达式接收参数 -->	 	</attribute>	 	<attribute>	 		<name>url</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 	<attribute>	 		<name>username</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 	<attribute>	 		<name>password</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 	<attribute>	 		<name>sql</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 </tag>

1.3 定义jsp,页面引入标签库,并定义标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body> <tm:DBconnectionTag url="jdbc:mysql://192.168.9.223:3306/test_2016" driver="com.mysql.jdbc.Driver" username="root" password="ablejava" sql="select * from course"/>	  <br/>  <br> </body></html>

2.forEach循环遍历输出集合

2.1 定义自定义标签处理器类

package com.able.tag;import java.util.Collection;import java.util.Iterator;import java.util.Map;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;public class ForEachTag extends TagSupport {		private String var;		private Iterator<?> iterator;	public void setItem(Object item) {		if (item instanceof Map) {			Map items = (Map) item;			this.iterator = items.entrySet().iterator();		} else {			Collection<?> c = (Collection) item;			this.iterator = c.iterator();		}	}		@Override	public int doStartTag() throws JspException {		if (this.process())			return EVAL_BODY_INCLUDE;		else			return EVAL_PAGE;			}	@Override	public int doAfterBody() throws JspException {		if (this.process()) {			return EVAL_BODY_AGAIN;		} else {			return EVAL_PAGE;		}	}	private boolean process() {		if (null != iterator && iterator.hasNext()) {			Object item = iterator.next();			pageContext.setAttribute(var, item);			return true;		} else {			return false;		}	}		public String getVar() {		return var;	}		public void setVar(String var) {		this.var = var;	}}

2.3 在tld文件中定义标签

<tag>		<name>foreach</name>		<tag-class>com.able.tag.ForEachTag</tag-class>		<body-content>JSP</body-content>		<attribute>			<name>var</name>			<required>true</required>			<rtexprvalue>true</rtexprvalue>		</attribute>		<attribute>			<name>item</name>			<required>true</required>			<rtexprvalue>true</rtexprvalue>			<!-- <type>java.lang.Object</type> -->			 <type>java.util.Collection</type>		</attribute>	</tag>

2.4 在jsp页面定义循环标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body> 	<%	  List<String> list = new ArrayList<String>();	  list.add("aa");	  list.add("bb");	  list.add("cc");	  Map map = new HashMap();	  map.put("1","a");	  map.put("2","b");	  map.put("3","c");	  map.put("4","b");		%> 	 	<tm:foreach var="hi" item="<%=map %>"> 		<h1>${hi }</h1> 	</tm:foreach>	  <br/>  <br> </body></html>

3.定义Iterator循环输出数组

3.1定义标签处理器类

package com.able.tag;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;public class IteratorTagDemo extends TagSupport {	private String var;	private String[] items;	private int i =1;	@Override	public int doStartTag() throws JspException {		if (items != null && items.length>0) {			pageContext.setAttribute("name", items[0]);			return EVAL_BODY_INCLUDE;		} else {			return SKIP_BODY;		}	}			@Override	public int doAfterBody() throws JspException {		if (i<items.length) {			pageContext.setAttribute("name", items[i]);			i++;			return EVAL_BODY_AGAIN;		} else {			return SKIP_BODY;		}	}	@Override	public int doEndTag() throws JspException {		// TODO Auto-generated method stub		return super.doEndTag();	}	public String getVar() {		return var;	}	public void setVar(String var) {		this.var = var;	}	public String[] getItems() {		return items;	}	public void setItems(String[] items) {		this.items = items;	}}

3.2 在.tld文件中定义标签

 <tag>	 	<name>IteratorTagDemo</name><!-- 定义标签名 -->	 	<tag-class>com.able.tag.IteratorTagDemo</tag-class>	 	<body-content>scriptless</body-content> <!-- 定义标签体为空 -->	 	<attribute>	 		<name>var</name>	 		<required>true</required>	 	</attribute>	 	<attribute>	 		<name>items</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 </tag>

3.3在jsp页面定义Tag

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head>  <body>  <% 	String[] nbastar = {"jordan","kobar"}; 	pageContext.setAttribute("nbastar", nbastar); %> <tm:IteratorTagDemo items="${nbastar }" var="name"> 	${name } </tm:IteratorTagDemo>	  <br/>  <br> </body></html>

4.自定义Tag实现防盗链

4.1自定义标签处理器类

package com.able.tag;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;public class SkipPageOrEvalPageTag extends TagSupport {	@Override	public int doEndTag() throws JspException {		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();		String referer = request.getHeader("referer");		String url = "http://"+request.getServerName();		if (referer != null && referer.startsWith(url)) {			return EVAL_PAGE;		} else {			try {				pageContext.getOut().print("盗链");			} catch (IOException e) {				e.printStackTrace();			}		}		return SKIP_PAGE;	}}

4.2在.tld文件中定义tag标记

<tag>	 	<name>SkipPageOrEvalPageTag</name><!-- 定义标签名 -->	 	<tag-class>com.able.tag.SkipPageOrEvalPageTag</tag-class>	 	<body-content>empty</body-content> <!-- 定义标签体为空 -->	 </tag>

4.3定义访问连接的SkipPageOrEvalPageAccess.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body>	  <!-- 防盗链 -->	  <a href="http://localhost/JSP_Tag_Demo/SkipPageOrEvalPage.jsp">防盗链</a>	  <br/>  <br> </body></html>

4.4定义访问成功后的SkipPageOrEvalPage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body>	  <!-- 防盗链 -->	  <tm:SkipPageOrEvalPageTag/>	  <h1>SkipPageOrEvalPage标签处理学习</h1>	  <br/>  <br> </body></html>

二、使用SimpleTagSupport实现自定义Tag

1.继承SimpleTagSupport类实现循环输出集合或数组

1.1定义标签处理器类

package com.able.simpleTag;import java.io.IOException;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Iterator;import java.util.Map;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class foreachAll extends SimpleTagSupport {	private Object items;	private String var;	private Collection collection;	public void setItems(Object items) {		this.items = items;		if (items instanceof Collection) {//list set			collection=(Collection) items;		}		if (items instanceof Map) {			Map map=(Map) items;			collection =map.entrySet();//set		}		if (items instanceof Object[]) {			Object obj[]=(Object[]) items;			collection=Arrays.asList(obj);		}		if (items.getClass().isArray()) {			this.collection=new ArrayList();			int length=Array.getLength(items);			for (int i=0; i<length ; i++) {				Object value=Array.get(items, i);				this.collection.add(value);			}		}	}	public void setVar(String var) {		this.var = var;	}	@Override	public void doTag() throws JspException, IOException {		Iterator it=this.collection.iterator();		while (it.hasNext()) {			Object value=it.next();			this.getJspContext().setAttribute(var, value);			this.getJspBody().invoke(null);					}	}}

1.2定义.tld文件中添加标签

<tag>	 	<name>simpleforeachAll</name>	 	<tag-class>com.able.simpleTag.foreachAll</tag-class>	 	<body-content>scriptless</body-content>	 	<attribute>	 		<name>items</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 	<attribute>	 		<name>var</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 </tag>

1.3定义jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body> 	<%	  List<String> list = new ArrayList<String>();	  list.add("aa");	  list.add("bb");	  list.add("cc");	  Map map = new HashMap();	  map.put("1","a");	  map.put("2","b");	  map.put("3","c");	  map.put("4","b");	   int arr[]={1,2,3,4,5};	 	request.setAttribute("arr", arr);		%> 		  <br/>  <br>  <tm:simpleforeachAll var="i" items="${arr }">${i }</tm:simpleforeachAll> </body></html>

2.使用SimpleTagSupport实现防盗链

2.1定义标签处理器类

package com.able.simpleTag;import java.io.IOException;import java.sql.Date;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.SkipPageException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class RefererTag extends SimpleTagSupport {	private String site;	private String page;	public void setSite(String site) {		this.site = site;	}	public void setPage(String page) {		this.page = page;	}	@Override	public void doTag() throws JspException, IOException {		PageContext pageContext =(PageContext) this.getJspContext();		HttpServletRequest httpServletRequest=(HttpServletRequest) pageContext.getRequest();		HttpServletResponse httpServletResponse=(HttpServletResponse) pageContext.getResponse();		//1.referer		String referer=httpServletRequest.getHeader("referer");		if (referer==null || !referer.startsWith(site)) {			if (page.startsWith(httpServletRequest.getContextPath())) {				httpServletResponse.sendRedirect(page);				return;			}else if (page.startsWith("/")) {				httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+page);			}else{				httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/"+page);			}			throw new SkipPageException();		}	}	}

2.2 定义.tld文件

<tag>	 	<name>referer</name>	 	<tag-class>com.able.simpleTag.RefererTag</tag-class>	 	<body-content>empty</body-content>	 	<attribute>	 		<name>site</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 	<attribute>	 		<name>page</name>	 		<required>true</required>	 		<rtexprvalue>true</rtexprvalue>	 	</attribute>	 </tag>

2.3定义refererAccess.jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body>	  <!-- 防盗链 -->	  <a href="http://localhost/JSP_Tag_Demo/Referer.jsp">防盗链</a>	  <br/>  <br> </body></html>

2.4定义访问页面referer.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body>	  <!-- 防盗链 -->	  <tm:referer site="" page=""/>	  <br/>  <br> </body></html>

三、使用BodyTagSupport实现自定义Tag

1.继承BodyTagSupport实现简单数据输出

1.1定义标签处理器类

package com.able.bodyTag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.BodyContent;import javax.servlet.jsp.tagext.BodyTagSupport;public class BodyTagSupportTag extends BodyTagSupport {	private BodyContent bodyContent;		@Override	public int doEndTag() throws JspException {		String content = bodyContent.getString();		System.out.println(content);				String newStr = "www.cnblogs.com/izhongwei";		JspWriter jspWriter= bodyContent.getEnclosingWriter();		try {			jspWriter.write(newStr);		} catch (IOException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}		return EVAL_PAGE;	}	public BodyContent getBodyContent() {		return bodyContent;	}	public void setBodyContent(BodyContent bodyContent) {		this.bodyContent = bodyContent;	}		}

1.2在.tld文件中定义标签

<tag>	 	<name>bodyTag</name><!-- 定义标签名 -->	 	<tag-class>com.able.bodyTag.BodyTagSupportTag</tag-class>	 	<body-content>scriptless</body-content> <!-- 定义标签体为空 -->	 </tag>

1.3定义jsp文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><%-- <%@taglib uri="http://www.able.com" prefix="tm" %> --%><%-- <%@ taglib prefix="tm" uri="/WEB-INF/tlds/online.tld" %> --%><%@taglib prefix="tm" uri="/WEB-INF/tag.tld" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head>  <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>	<meta http-equiv="pragma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">  	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/css" href="styles.css">	--> </head> <body> <tm:bodyTag> 	hello </tm:bodyTag>	  <br/>  <br> </body></html>