JSP Taglib指令定义自定义标签

Taglib 指令是定义一个标签库以及其自定义标签的前缀。一个自定义的tag标签是用户定义的一种JSP标记。当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处理类的对象进行的操作。当JSP页面被jsp引擎转化为servlet后,实际上tag标签被转化成为了对tag处理类的操作。

定义

<%@ taglib uri="" prefix="c"%>

prefix 是一个标签库别名 
taglib的uri 引入jsp的标签库

子元素

1. Element:Description

2. tlib-version:Tag库的版本

3. jsp-version:Tag库所需要的jsp的版本

4. short-name:助记符,tag的一个别名(可选)

5. uri:用于确定一个唯一的tag库

6. display-name:被可视化工具(诸如Jbuilder)用来显示的名称(可选)

7. small-icon:被可视化工具(诸如Jbuilder)用来显示的小图标(可选)

8. large-icon:被可视化工具(诸如Jbuilder)用来显示的大图标(可选)

9. description:对tag库的描述(可选)

10. listener:一个tag库可能定义一些类做为它的事件侦听类,这些类在TLD中被称为listener 元素,jsp服务器将会实例化这些侦听类,并且注册它们。Listener元素中有一个叫listener-class的子元素,这个元素的值必须是该侦听类的完整类名

11. tag:每个tag元素在tag库中都要指出它的名字、类名、脚本变量、tag的属性。其中脚本变量的值可以直接在TLD中定义或通过tag附加信息的类来取得。每个属性描述了这个属性是否可以省略,它的值是否可以通过<%= …%>这样的JSP语法来获得,以及属性的类型。

tag子元素如下:

name:独一无二的元素名

tag-class:Tag标签对应的tag处理类

tei-class:javax.servlet.jsp.tagext.TagExtraInfo的子类,用于表达脚本变量(可选)

body-content:Tag标签body的类型

display-name:被可视化工具(诸如Jbuilder)用来显示的名称(可选)

small-icon:被可视化工具(诸如Jbuilder)用来显示的小图标(可选)

large-icon:被可视化工具(诸如Jbuilder)用来显示的大图标(可选)

description:此tag标签的描述

variable:提供脚本变量的信息(同tei-class)(可选)

attribute:Tag标签的属性名

Taglib引入方式

1. 自定义引入标签

jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
<%@ taglib prefix="c" uri="myjstl" %>  
<!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>Insert title here</title>  
</head>  
<body>  
    <c:out value="${param.username}"/>  
</body>  
</html>

web.xml

<web-app id="WebApp_ID" version="2.4" 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-app_2_4.xsd">  
                ...  
    <jsp-config>  
       <taglib>  
           <taglib-uri>myjstl</taglib-uri>  
           <taglib-location>/WEB-INF/tld/c.tld</taglib-location>  
       </taglib>  
    </jsp-config>  
                ...  
</web-app>

相当于你给自定义的标签起了一个个性名字。

2. 标准定义标签

当你打开一个tld文件时,在文件的头部会有一个uri节点,里面的内容即为uri的标准定义。使用标准定义的优点 在于,不用在web.xml下加上上面的代码。代码如下:

jsp Taglib指令tld例子

jsp文件

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>collection</title>
</head>
<body>
<c:forEach var="l" items="${list}">
<table>
    <th>
        <td>编号</td>
        <td>名称</td>
        <td>URL</td>
        <td>时间</td>
    </th>
    <tr>
        <td>${l.id}</td>
        <td><a href="${l.url}">${l.name}</a></td>
        <td>${l.createTime}</td>
        <td><a href="${l.url}">编辑</a><a href="${l.url}">删除</a></td>
    </tr>
</table>
<p>${l.url }</p>
</c:forEach>
</body>
</html>

开发自定义标签

1. 开发自定义标签处理类

自定义标签类都必须继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport,或者TagSupport除此之外,JSP自定义标签类还有如下要求。

1. 如果标签类包含属性,每个属性都有对应的getter和setter方法。

2. 重写doTag()或者doStartTag()或doEndTag()方法方法,这个方法负责生成页面内容。

public class HelloWorldTag extends TagSupport {
    private static final long serialVersionUID = -3382691015235241708L;
    @Override
    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().write("Hello World !");
            return super.doEndTag();
        } catch(JspException e) {
            e.printStackTrace();
            return 0;
        } catch(IOException e) {
            e.printStackTrace();
            return 0;
        }
    }
    @Override
    public int doStartTag() {
        try {
            pageContext.getOut().write("Hello World");
            return super.doStartTag();
        } catch(JspException e) {
            e.printStackTrace();
            return 0;
        } catch(IOException e) {
            e.printStackTrace();
            return 0;
        }
    }
}

2. 建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标签

TLD是Tag Library Definition的缩写,即标签库定义,文件的后缀是tld,每个TLD文件对应一个标签库,一个标签库中可包含多个标签,TLD文件也称为标签库定义文件。

标签库定义文件的根元素是taglib,它可以包含多个tag子元素,每个tag子元素都定义一个标签。通常我们可以到Web容器下复制一个标签库定义文件,并在此基础上进行修改即可。

<?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 web-jsptaglibrary_2_0.xsd" version="2.0"> 
  <tlib-version>1.0</tlib-version>  
  <short-name>myhelloworld</short-name>  
  <!-- 定义该标签库的URI 必须添加但可以空-->  
  <uri/>  
  <!-- 定义第一个标签 -->  
  <tag> 
    <!-- 定义标签名 -->  
    <name>helloWorld</name>  
    <!-- 定义标签处理类 -->  
    <tag-class>org.lxh.taglib.HelloWorldTag</tag-class>  
    <!-- 定义标签体为空 -->  
    <body-content>empty</body-content> 
  </tag> 
</taglib>

3. 在JSP文件中使用自定义标签

使用方法见上面Taglib引入方式

总结

1. taglib可以在JSP页面中自定义tag标签的属性,并且访问JSP页面中的所有对象; 

2. taglib可以动态地修改页面输出,同时彼此之间相互通信; 

3. taglib可以先创建一个JavaBeans组件,然后在一个tag中调用此JavaBeans组件,同时可以在另一个tag中调用它; 

4. taglib可以相互嵌套,可以在一个JSP页面中完成一些复杂的交互。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。