在JSP规范的1.1版中增加了自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术,通过使用自定义标签,可以在简单的标签中封装复杂的功能。
为什么要使用自定义标签库?做开发的我们都知道,在HTML页面中嵌入JSP的脚本,相对于页面来说是非常丑陋的,而对于后期维护起来又是一场灾难,如果有美工人员参与项目开发,而美工人员不熟悉JSP脚本,只熟悉HTML标签,那么对开发的效率则大打折扣了,在HTML页面中插入JSP脚本的坏处:
1、JSP脚本非常丑陋,难以阅读
2、JSP脚本和HTML代码混合,后期维护成本高
3、HTML页面中嵌入JSP脚本,美工人员难以参与开发
从这几点考虑,我们需要一种能在页面中使用的标签,这种标签具有好HTML标签类似的语法,但又可以完成JSP脚本的功能,那么这种标签就是JSP自定义标签
在JSP1.1规范中开发自定义标签比较复杂,JSP2规范简化 标签库的开发,在JSP2中开发标签库的步骤:
1、开发自定义标签处理类
2、建立一个*.tld文件,每个*.tld为念对应yield标签库,每个标签库可以包含多个标签
3、在JSP文件中使用自定义标签
下面我们就跟着步骤来开发一个简单的查询数据的自定义标签
创建自定义标签处理类QueryTag.java,这个类要继承SimpleTagSupport类,重写doTag()方法
package com.tenghu.hibernate.label;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class QueryTag extends SimpleTagSupport{
private String driver;
private String url;
private String username;
private String password;
private String sql;
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 getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
private ResultSetMetaData rsmd;
//重写doTag方法
@Override
public void doTag() throws JspException, IOException {
try {
//加载驱动
Class.forName(driver);
//获取数据库连接
conn=DriverManager.getConnection(url, username, password);
//获取语句集,并执行sql语句
ps=conn.prepareStatement(sql);
//获取结果集
rs=ps.executeQuery();
rsmd=rs.getMetaData();
//获取列数目
int columnCount=rsmd.getColumnCount();
//获取也米娜输出流
Writer out=getJspContext().getOut();
//在页面打印输出表格
out.write("<table border='1' bgColor='#9999cc' width=400>");
while(rs.next()){
out.write("<tr>");
for(int i=1;i<=columnCount;i++){
out.write("<td>");
out.write(rs.getString(i));
out.write("</td>");
}
out.write("</tr>");
}
out.write("</table>");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new JspException("自定义标签错误"+e.getMessage());
} catch (SQLException e) {
e.printStackTrace();
throw new JspException("自定义标签错误"+e.getMessage());
}finally{
//关闭结果集
try{
if(rs!=null)
rs.close();
if(ps!=null)
ps.close();
if(conn!=null)
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
super.doTag();
}
}
建立TLD文件
TLD是Tag Library Derfinition的缩写,即标签库定义,文件的后缀名为tld,每个TLD文件对应一个标签库,一个标签库可以包含多个标签,TLD文件也称为标签库定义文件
标签库定义文件的跟元素是taglib,它可以包含多个tag的子元素,每个子元素都定义一个标签。通常我们可以到Web容器下负责一个标签库文件,并在此基础上修改,如在Tomcat中的webapps\examples\WEB-INF\jsp2路径下包含一个jsp2-example-taglib.tld文件,这就是一个TLD文件的范例,我们只要将这个文件拷贝到自己的Web项目中的WEB-INF下即可
通常我们是在WEB-INF下建一个目录后,才将tld文件放入,这样易于管理
<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>taglib</short-name>
<!-- 定义标签库的URI -->
<uri>http://www.tenghu.com/taglib</uri>
<!-- 定义一个标签库 -->
<tag>
<!-- 定义标签名 -->
<name>query</name>
<!-- 定义标签处理类 -->
<tag-class>com.tenghu.hibernate.label.ConTag</tag-class>
<!-- 定义标签体为null -->
<body-content>empty</body-content>
<!-- 配置标签属性 :driver-->
<attribute>
<name>driver</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!-- 配置标签属性:url -->
<attribute>
<name>url</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!-- 配置标签属性:username -->
<attribute>
<name>username</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!-- 配置标签属性:password -->
<attribute>
<name>password</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!-- 配置标签属性:sql -->
<attribute>
<name>sql</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
</taglib>
在JSP页面中使用我们自定义标签库需要两点:
1、标签库URI:确定使用那个标签库
2、标签名:确定使用那个标签
使用标签库分为一下步骤:
1、导入标签库:使用taglib编译指令导入标签库,就是标签库和指定前缀关联起来
2、使用标签:在JSP页面中使用自定义标签
taglib语法:
<%@taglib uri="http://www.tenghu.com/taglib" prefix="th" %>
其中的uri属性去顶标签库的URI,这个URI可以确定一个标签库,而prefix属性指定标签库前缀,即所有使用该前缀的标签将由此标签库处理
<th:query password="xiaohu" url="jdbc:mysql://127.0.0.1:3306/company"
driver="com.mysql.jdbc.Driver"
sql="select * from tab_employee"
username="root" />
这样我们的自定义标签就完成了