最近讲课讲到JSP自定义标签,发现书本上的例子很复杂,不适合初级入门的同学学习,于是自己重新整理了一下,简要内容放上来,希望能对同样需求的朋友有用。
做Web开发的人都知道HTML标签,在JSP开发中常用的就是<%脚本%>来处理逻辑,而这种HTML中签入Java程序的方式构成了JSP最初的样子。
后来,为了进一步简化编程,或者说使JSP源代码看上去更清晰一些,标签技术营运而生。最有代表性的当时是JSTL,还有Struts标签等。为了更好的理解这些标签的工作原理,自定义标签课程必不可少。
下面就先通过亲手做一个标签来体会一下。
在JSP2中,可以通过两种方式来创建自己的标签库。一种是标记文件的方式,一种是标签处理程序的方式。其实它们本质上是一样的。
先说标记文件方式,这种方式做起来相对简单。先来做一个简单的显示红色字体“你好”的标签。首先建立一个hello.tag文件
放到WEB-INF/tags/下。
然后开始调用这个标签。创建一个usetagfile.jsp
OK,运行测试一下吧。效果很简单。
第二中方式是标签处理程序的方式。我们可以通过实现SimpleTagSupport类来做一个简单标签,通过传入一条select语句,实现一个表格显示。我们首先建立一个标签库描述符,这其实就相当于标签库的注册表。
然后我们来实现标签处理类TableTagHandler
最好,我们需要一个测试页面来看看运行效果。
注意,这里的taglib指令中使用uri来指定标签位置。和标记文件使用时不同。
做Web开发的人都知道HTML标签,在JSP开发中常用的就是<%脚本%>来处理逻辑,而这种HTML中签入Java程序的方式构成了JSP最初的样子。
后来,为了进一步简化编程,或者说使JSP源代码看上去更清晰一些,标签技术营运而生。最有代表性的当时是JSTL,还有Struts标签等。为了更好的理解这些标签的工作原理,自定义标签课程必不可少。
下面就先通过亲手做一个标签来体会一下。
在JSP2中,可以通过两种方式来创建自己的标签库。一种是标记文件的方式,一种是标签处理程序的方式。其实它们本质上是一样的。
先说标记文件方式,这种方式做起来相对简单。先来做一个简单的显示红色字体“你好”的标签。首先建立一个hello.tag文件
<%@tag description=
"打印Hello" pageEncoding=
"UTF-8"%>
<%-- 这是属性: --%>
<%@attribute name= "message"%>
<%-- 这是标签内容 --%>
<h2 style= "color:red">${message}</h2>
<%-- 这是属性: --%>
<%@attribute name= "message"%>
<%-- 这是标签内容 --%>
<h2 style= "color:red">${message}</h2>
然后开始调用这个标签。创建一个usetagfile.jsp
<%@page contentType=
"text/html" pageEncoding=
"UTF-8"%>
<%@ taglib tagdir= "/WEB-INF/tags" prefix= "jerry" %>
<!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>使用标记文件</title>
</head>
<body>
<jerry:hello message="你好"></jerry: hello >
</body>
</html>
<%@ taglib tagdir= "/WEB-INF/tags" prefix= "jerry" %>
<!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>使用标记文件</title>
</head>
<body>
<jerry:hello message="你好"></jerry: hello >
</body>
</html>
第二中方式是标签处理程序的方式。我们可以通过实现SimpleTagSupport类来做一个简单标签,通过传入一条select语句,实现一个表格显示。我们首先建立一个标签库描述符,这其实就相当于标签库的注册表。
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
< taglib version ="2.0" xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" >
< tlib-version >1.0 </ tlib-version >
< short-name >jerry </ short-name >
< uri >/WEB-INF/tlds/jerry </ uri >
< tag >
< name >table </ name >
< tag-class >taghandler.TableTagHandler </ tag-class >
< body-content >scriptless </ body-content >
< attribute >
< name >selectSQL </ name >
< rtexprvalue >true </ rtexprvalue >
< type >java.lang.String </ type >
</ attribute >
</ tag >
</ taglib >
< taglib version ="2.0" xmlns ="http://java.sun.com/xml/ns/j2ee" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" >
< tlib-version >1.0 </ tlib-version >
< short-name >jerry </ short-name >
< uri >/WEB-INF/tlds/jerry </ uri >
< tag >
< name >table </ name >
< tag-class >taghandler.TableTagHandler </ tag-class >
< body-content >scriptless </ body-content >
< attribute >
< name >selectSQL </ name >
< rtexprvalue >true </ rtexprvalue >
< type >java.lang.String </ type >
</ attribute >
</ tag >
</ taglib >
package taghandler;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
/**
*
* @author Administrator
*/
public class TableTagHandler extends SimpleTagSupport {
private String selectSQL;
public void doTag() throws JspException {
try {
JspWriter out = getJspContext().getOut();
out.println( "<link rel=\"stylesheet\" href=\"css/tablestyle.css\" type=\"text/css\" />");
out.println( "<table>");
out.println( "<thead>");
out.println( "<tr>");
out.println( "<th>学号</th>");
out.println( "<th>姓名</th>");
out.println( "<th>性别</th>");
out.println( "</tr>");
out.println( "</thead>");
out.println( "<tbody>");
//从数据库中取数据,形成ArrayList
database.SQLServer db = new database.SQLServer();
java.util.ArrayList<String[]> students = db.selectToArrayList( this.selectSQL);
for (String[] stu : students) {
out.println( "<tr>");
out.println( "<td>" + stu[0] + "</td>");
out.println( "<td>" + stu[1] + "</td>");
out.println( "<td>" + stu[2] + "</td>");
out.println( "</tr>");
}
out.println( "</tbody>");
out.println( "</table>");
} catch (IOException ex) {
Logger.getLogger(TableTagHandler. class.getName()).log(Level.SEVERE, null, ex);
}
}
public void setSelectSQL(String selectSQL) {
this.selectSQL = selectSQL;
}
}
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
/**
*
* @author Administrator
*/
public class TableTagHandler extends SimpleTagSupport {
private String selectSQL;
public void doTag() throws JspException {
try {
JspWriter out = getJspContext().getOut();
out.println( "<link rel=\"stylesheet\" href=\"css/tablestyle.css\" type=\"text/css\" />");
out.println( "<table>");
out.println( "<thead>");
out.println( "<tr>");
out.println( "<th>学号</th>");
out.println( "<th>姓名</th>");
out.println( "<th>性别</th>");
out.println( "</tr>");
out.println( "</thead>");
out.println( "<tbody>");
//从数据库中取数据,形成ArrayList
database.SQLServer db = new database.SQLServer();
java.util.ArrayList<String[]> students = db.selectToArrayList( this.selectSQL);
for (String[] stu : students) {
out.println( "<tr>");
out.println( "<td>" + stu[0] + "</td>");
out.println( "<td>" + stu[1] + "</td>");
out.println( "<td>" + stu[2] + "</td>");
out.println( "</tr>");
}
out.println( "</tbody>");
out.println( "</table>");
} catch (IOException ex) {
Logger.getLogger(TableTagHandler. class.getName()).log(Level.SEVERE, null, ex);
}
}
public void setSelectSQL(String selectSQL) {
this.selectSQL = selectSQL;
}
}
<
%@page
contentType
="text/html"
pageEncoding
="UTF-8"%
>
< %@ taglib uri ="/WEB-INF/tlds/jerry" prefix ="jerry" % >
<!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 >JSP Page </title>
</head>
< body >
< jerry:table selectSQL ="select xuehao,xingming,xingbie from student" > </jerry:table>
</body>
</html>
< %@ taglib uri ="/WEB-INF/tlds/jerry" prefix ="jerry" % >
<!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 >JSP Page </title>
</head>
< body >
< jerry:table selectSQL ="select xuehao,xingming,xingbie from student" > </jerry:table>
</body>
</html>
本文转自 王杰瑞 51CTO博客,原文链接:http://blog.51cto.com/wangjierui/108791,如需转载请自行联系原作者