Servlet和JSP之自定義標簽學習

来源:https://www.cnblogs.com/NYfor2018/archive/2018/02/24/8463776.html
-Advertisement-
Play Games

此文章會講述簡單標簽處理器,因為經典自定義標簽處理器沒有簡單標簽處理器方便使用,故在此不進行描述。 參考:慕課網的《JSP自定義標簽》視頻; 《Servlet、JSP和Spring MVC初學指南》的第六章; IBM的《利用 JSP 2 提供的 SimpleTagSupport 開發自定義標簽》; ...


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

         參考:慕課網的《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>

  

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ES6 模塊的設計思想,是儘量的靜態化,使得編譯時就能確定模塊的依賴關係,以及輸入和輸出的變數。 ES6 模塊不是對象,而是通過export命令顯式指定輸出的代碼,再通過import命令輸入。 需要特別註意的是,export命令規定的是對外的介面,必須與模塊內部的變數建立一一對應關係。 export ...
  • ⚠️組件的作用域是孤立的,vue解決組件傳值問題是通過props ⚠️子傳父的時候需要vm.$emit觸發實例上的事件,頁面需要定一個方法去取值 ⚠️一定要註意命名方式和書寫,例如mylChart和myl-chart dataRadio和data-radio :objline和@data-radio ...
  • 之前的文章大量的內容在和大家探討分散式存儲,接下來的章節進入了分散式計算領域。坦白說,個人之前專業的重心側重於存儲,對許多計算的內容理解可能不是和確切,如果文章中的理解有所不妥,願虛心賜教。本篇將和大家聊一聊分散式計算的一個子集: 批處理 。 批處理系統通常也叫離線系統 ,需要大量的輸入數據,運行一 ...
  • Related Links:Zuul https://github.com/Netflix/zuulCAT https://github.com/dianping/catApollo https://github.com/ctripcorp/apolloKairosDB https://github... ...
  • 前面我們曾有篇文章中提到過關於用tensorflow訓練手寫28 28像素點的數字的識別,在那篇文章中我們把手寫數字圖像直接碾壓成了一個784列的數據進行識別,但實際上,這個圖像是28 28長寬結構的,我們這次使用CNN捲積神經網路來進行識別。 捲積神經網路我的理解是部分模仿了人眼的功能。 我們在看 ...
  • 在Java5.0之前,協調對共用對象的訪問可以使用的機制只有synchronized和volatile。我們知道synchronized關鍵字實現了內置鎖,而volatile關鍵字保證了多線程的記憶體可見性。在大多數情況下,這些機制都能很好地完成工作,但卻無法實現一些更高級的功能,例如,無法中斷一個正 ...
  • 目錄: Python之路第一篇——認識Python ...
  • 本來覺得沒什麼可寫的,因為網上這玩意一搜一大把,不過爬蟲畢竟是python的一個大亮點,不說說感覺對不起這玩意基礎點來說,python2寫爬蟲重點需要兩個模塊,urllib和urllib2,其實還有re先介紹下模塊的一些常用功能urllib.urlopen('http://xxx.xxx.xxx') ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...