JSP自定义标签

在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" />


这样我们的自定义标签就完成了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值