1. 程式人生 > >[JSP]自定義標籤庫taglib

[JSP]自定義標籤庫taglib

目錄

自定義標籤的步驟大概有三步:

1.繼承javax.servlet.jsp.tagext.*下提供的幾個標籤類,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。

2.在tld檔案中配置標籤庫資訊,以及標籤與實現類的對映。

3.在jsp檔案中引用自定義標籤。

標籤API

Tag介面

doEndTag():執行當前標籤例項的結束標籤。在doStartTag()執行後呼叫

doStartTag():執行當前標籤例項的開始標籤。

getParent():獲取當前標籤的父標籤

release():釋放當前標籤的狀態

setPageContext(PageContext)

:設定當前標籤的頁面

setParent(Tag):設定當前標籤的父標籤

TagSupport類

TagSupport類是實現Tag介面的一個模板類。它實現了Tag介面的大部分方法,使用者只需要實現doStartTag()doEndTag()方法。

SimpleTag介面(JSP2.0)

JSP2.0的介面,比Tag介面更簡單。

doTag():執行當前標籤的所有處理任務。

getParent():獲取當前標籤的父標籤。

:提供當前標籤的實體為一個JspFragment物件

setJspContext(JspContext):設定JSP頁面的

setParent(JspTag):設定當前標籤的父標籤。

SimpleTagSupport類(JSP2.0)

SimpleTagSupport類是實現SimpleTag介面的一個模板類。它實現了SimpleTag介面的大部分方法,使用者只需要實現doTag()方法。

tld標籤庫描述檔案

tld全稱為TagLibrary Description,即標籤庫描述檔案。

tld檔案用來配置標籤庫的基本資訊。

taglib主要元素

taglib.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 web-jsptaglibrary_2_0.xsd"

version="2.0">

    <tlibversion>1.0</tlibversion>

    <jspversion>2.0</jspversion>

    <shortname>taglib</shortname>

    <uri>http://notes.javaee.jsp.com/taglib</uri>

    <info>Private Taglib</info>

    <tag>

        <name>copyright</name>

        <tagclass>notes.javaee.jsp.taglib.Copyright</tagclass>

        <bodycontent>JSP</bodycontent>

        <info>Copyright tag.</info>

    </tag>

</taglib>

uri指明引用這個標籤庫時使用的uri。

tag指明要定義標籤的資訊。

其中,tag可以設定的屬性如下:

屬性

描述

name

定義屬性的名稱。每個標籤的是屬性名稱必須是唯一的。

tagclass

指定對映的Java類。

required

指定屬性是否是必須的或者可選的,如果設定為false為可選。

rtexprvalue

宣告在執行表示式時,標籤屬性是否有效。

type

定義該屬性的Java類型別 。預設指定為String。

description

描述資訊。

fragment

如果聲明瞭該屬性,屬性值將被視為一個JspFragment。

bodycontent

指明標籤體的限制,有3種取值:empty、JSP和tagdependent
empty:不允許有標籤體存在。
JSP:允許有標籤體存在。
tagdependent:允許有標籤體存在,但是標籤體內的JSP程式碼不會被執行。

如果tld檔案位於/WEB-INF/下面,Tomcat會自動載入tld檔案中的標籤庫。如果位於其他的位置,可以在web.xml中配置。

<jsp-config>

    <taglib>

        <taglib-uri>http://notes.javaee.jsp.com/taglib</taglib-uri>

        <taglib-location>/WEB-INF/taglib.tld</taglib-location>

    </taglib>

</jsp-config>

或者在JSP中直接使用

<%@ taglib uri="/WEB-INF/taglib.tld" prefix="taglib"%>

例項

使用TagSupport自定義標籤

1.  繼承標籤API

定義一個HelloTag類,繼承TagSupport類。

HelloTag.java:

package notes.javaee.jsp.taglib;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class HelloTag extends TagSupport {

    private static final long serialVersionUID = -8828591126748246256L;

    private String name;

    @Override

    public int doEndTag() throws JspException {

        try {

            this.pageContext.getOut().println("Hello, " + name);

        } catch (Exception e) {

            throw new JspException(e);

        }

        return EVAL_PAGE;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

2.  在tld中配置標籤庫資訊

在/WEB-INF下新建taglib.tld檔案。

<shortname>指明推薦使用的prefix為taglib。

<tag>定義要引用的標籤資訊。<name>指明標籤名,<tagclass>指明對映的Java類,和前面的對應。

然後定義這個標籤的屬性。因為前面Java類中的屬性為name,這裡也要對應上。

taglib.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 web-jsptaglibrary_2_0.xsd"

version="2.0">

    <tlibversion>1.0</tlibversion>

    <jspversion>2.0</jspversion>

    <shortname>taglib</shortname>

    <uri>http://notes.javaee.jsp.com/taglib</uri>

    <info>Private Taglib</info>

    <tag>

        <name>hello</name>

        <tagclass>notes.javaee.jsp.taglib.HelloTag</tagclass>

        <bodycontent>empty</bodycontent>

        <info>Hello tag with parameters.</info>

        <attribute>

            <name>name</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

    </tag>

</taglib>

3.  在jsp檔案中引用標籤

前面在tld檔案中配置了各個關鍵資訊,現在就可以直接在jsp檔案中使用了。

首先,需要在jsp檔案中引入標籤庫檔案。這裡和標準標籤庫JSTL一樣,使用taglib關鍵字來說明要引入的是標籤庫。uri是引入地址,prefix是標籤庫關鍵字。

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

由於前面定義的標籤name為hello,所以可以使用的標籤名為:prefix+name,即:taglib:hello。

Hello.jsp:

<%@ page language="java"contentType="text/html; charset=UTF-8"%>

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<taglib:hello name="World"/> <br/>

</body>

</html>

結果:

使用SimpleTagSupport自定義標籤(JSP2.0)

1.   繼承標籤API

定義一個HelloTag類,繼承SimpleTagSupport類。

PersonTag.java:

package notes.javaee.jsp.taglib2;

import java.io.IOException;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.SimpleTagSupport;

public class PersonTag extends SimpleTagSupport {

    private String name;

    private String sex;

    private int age;

    @Override

    public void doTag() throws JspException, IOException {

        this.getJspContext().getOut().write(

                "[Person Info]name: " + name + ", sex: " + sex + ", age:" + age);

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

}

2.在tld中配置標籤庫資訊

在/WEB-INF下新建taglib.tld檔案。

關鍵配置資訊基本和使用TagSupport自定義標籤範例中一樣。但是由於對應Java類中有3個屬性,需要一一對應上。

taglib.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 web-jsptaglibrary_2_0.xsd"

version="2.0">

    <tlibversion>1.0</tlibversion>

    <jspversion>2.0</jspversion>

    <shortname>taglib</shortname>

    <uri>http://notes.javaee.jsp.com/taglib</uri>

    <info>Private Taglib</info>

    <tag>

        <name>person</name>

        <tagclass>notes.javaee.jsp.taglib2.PersonTag</tagclass>

        <bodycontent>empty</bodycontent>

        <info>person info tag</info>

        <attribute>

            <name>name</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <attribute>

            <name>sex</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

        <attribute>

            <name>age</name>

            <required>true</required>

            <rtexprvalue>true</rtexprvalue>

        </attribute>

    </tag>

</taglib>

3.在jsp檔案中引用標籤

引用標籤方式和使用TagSupport自定義標籤範例一樣。

personTag.jsp:

<%@ page language="java"contentType="text/html; charset=UTF-8"%>

<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>

<html>

<head>

<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<taglib:person name="Alex"sex="man" age="18"/>

</body>

</html>

結果:

作者:靜默虛空