JSP自定义标签

来源:互联网 发布:专业写作软件 编辑:程序博客网 时间:2024/06/08 09:21

在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方法@Overridepublic 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" />


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