1. 程式人生 > >Servlet和JSP之自定義標簽學習

Servlet和JSP之自定義標簽學習

new nds lsp xsd 自定義 content center 處理 rar

   此文章會講述簡單標簽處理器,因為經典自定義標簽處理器沒有簡單標簽處理器方便使用,故在此不進行描述。

參考:慕課網的《JSP自定義標簽》視頻;

    《Servlet、JSP和Spring MVC初學指南》的第六章;

    IBM的《利用 JSP 2 提供的 SimpleTagSupport 開發自定義標簽》;

    菜鳥教程的JSP自定義標簽文章。  


自定義標簽

  自定義標簽

自定義標簽就是將方法封裝到自定義標簽處理類中,然後使用方法與JSTL標簽來達到,解決JSP中JavaBean的展現與業務實現分離問題。自定義標簽提供了在JavaBean中所不能實現的便利,其中就包括,自定義標簽允許訪問JSP中隱藏的對象及它們的屬性。

自定義標簽的實現,叫做標簽處理器,而簡單標簽處理器是指實現SimpleTag接口(或繼承SimpleTagSupport類)實現的標簽處理器,經典標簽處理器是指實現BodyTag接口(或繼承BodyTagSupport類)等實現的標簽處理器。

  自定義標簽的繼承結構

    JSP<----Tag <----IterationTag<----TagSupport<----BodyTagSupport<-----BodyTag

    JSP<----SimpleTag<-----SimpleSupportTag

簡單標簽處理器

簡單標簽處理器有簡單的生命周期,SimpleTag接口中用於標簽觸發的方法只有一個------doTag,並且該方法只會執行一次。業務邏輯、遍歷及頁面內容操作都在這裏實現。簡單標簽處理器中的頁面內容都在JspFragment類的實例中體現。

簡單標簽的生命周期如下:

1) JSP容器通過簡單標簽處理器的無參數構造器創建它的實例,因此,簡單標簽處理器必須有無參數構造器(一般不用自己寫, 用系統默認的就可以了)。

2) JSP容器通過setJspContext的方法,傳入JspContext對象:該對象中最重要的方法是getOut(),它能返回JspWriter,通過JspWriter就可以把響應返回前端了。

3) 如果自定義標簽被另一個自定義標簽所嵌套,JSP容器就會調用setParent的方法。

4) JSP容器調用該標簽中所定義的每個屬性的Set方法。

5) 如果需要處理頁面內容,JSP容器還會調用SimpleTag接口的setJspBody方法,把使用JspFragment封裝的頁面內容傳過來。當然,如果沒有頁面內容,那麽JSP容器不會調用該方法。

  接下來是SimpleTag接口的詳解

方法

說明

doTag()方法

是核心方法,用於編寫標簽處理邏輯。

setParent(JspTag)方法

將父標簽處理器對象傳遞給標簽處理器。

getParent()方法

獲取當前標簽的父標簽對象。

setJspContext(JspContext)方法

將JSP頁面的pageContext對象傳遞給標簽處理器對象。

setJspBody(JspFragment)方法

將代表當前標簽體的JspFragment對象傳遞給標簽處理器對象。(JspFragment中的invoke(Writer)方法用於執行JspFragment對象所代表的代碼段)

  

  是不是看著上面的一大串文字,有點懵?沒事兒,下面就是關於實現SimpleTagSupport類(跟實現SimpleTag接口的功用類似)的例子。

  首先需要準備一個SimpleTag的.tld文件,用於註冊自定義標簽,這個文件是在apache-tomcat文件裏面,一般地址是在E:\apache-tomcat-6.0.39\webapps\examples\WEB-INF\jsp裏面,名稱是jsp2-example-taglib.tld

  用一個顯示當前時間的jsp頁面來做為第一個例子:

  自定義標簽的創建步驟

1) 創建標簽處理類

package com.ny.tag2;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DisplayInfo extends SimpleTagSupport{

    @Override
    public void doTag() throws JspException, IOException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
        String dateStr = simpleDateFormat.format(new Date());
        JspWriter jspWriter = getJspContext().getOut();
        jspWriter.write(dateStr);
    }
}

2) 創建標簽庫文件

  在WEB-INF目錄下創建一個.tld文件(如nyTag.tld),然後打開jsp2-example-taglib.tld文件,裏面有我們需要的taglib配置,打開這個文件之後找到下面的代碼段,復制到nyTag.tld中。

  如果tid文件位於WEB-INF文件下面,Tomcat會自動加載tld文件中的標簽庫。如果位於其他位置,其實也可以在web.xml中配置。

<?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">
    <description>A tag library exercising SimpleTag handlers.        </description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/SimpleTagLibrary</uri>
</taglib>

3) 在標簽庫文件中註冊標簽

<?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">
    <description>A tag library exercising SimpleTag handlers.        </description>
    <tlib-version>1.0</tlib-version>
    <short-name>ny</short-name>
    <uri>/ny-tag</uri>
    <tag>
        <name>dateInfo</name>
        <tag-class>com.ny.tag2.DisplayInfo</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>

① <short-name>:指明推薦使用的prefix(這個屬性會在jsp頁面中引入標簽的時候出現)。

② <uri>:指明引用這個標簽庫時使用的uri(註意哦是uri不是url)。

③ <tag>:指明要定義標簽的信息。

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

屬性

說明

name

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

tag-class

指定映射的Java類。

required

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

rtexprvalue

聲明在運行表達式時,標簽屬性是否有效,有效則為true。

type

定義該屬性的Java類類型,默認指定為String。

decription

描述信息

fragment

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

bodycontent

指明標簽體的限定,可以有以下幾種取值(想了解更多可以在”參考”中查找到):a) empty:指定該標簽只能作用空標簽使用;b) scriptless:指定該標簽的標簽體可以是靜態HTML元素、表達式語言,但不允許出現JSP腳本。

4) 在頁面中引入標簽庫

<%@ taglib prefix="ny" uri="/ny-tag"%>

5) 在頁面中使用標簽

<body>
    <imooc:dateInfo/>
</body>

  

  所以JSP頁面中的代碼就是:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="imooc" uri="/imooc-tag2" %>
<!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>
    <imooc:dateInfo/>
</body>
</html>

  

  是不是感覺還挺簡單的呢? 其實自定義標簽的用法不止這些哦,加油吧!

Servlet和JSP之自定義標簽學習