08.十分鐘學會JSP傳統標簽編程

来源:http://www.cnblogs.com/chenxd/archive/2017/11/10/7816075.html
-Advertisement-
Play Games

一、認識標簽 1,說明:傳統標簽編程在開發中基本用不到,學習標簽編程主要還是為了完善知識體系。 2,標簽的主要作用:移除或減少jsp中的java代碼 3,標簽的主要組成部分及運行原理 4,簡單標簽示例:繼承javax.servlet.jsp.tagext.TagSupport 標簽開發步驟 4.1編 ...


一、認識標簽

1,說明:傳統標簽編程在開發中基本用不到,學習標簽編程主要還是為了完善知識體系。

2,標簽的主要作用:移除或減少jsp中的java代碼

3,標簽的主要組成部分及運行原理

4,簡單標簽示例:繼承javax.servlet.jsp.tagext.TagSupport

標簽開發步驟

4.1編寫一個繼承TagSupport(或實現Tag介面)的類

package com.chen.ying;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class FirstTag extends TagSupport {

public int doStartTag()throws JspException{

     System.out.println("調用doStartTag方法");

     HttpServletRequest req=(HttpServletRequest)pageContext.getRequest();

     JspWriter out=pageContext.getOut();

     String ip=req.getRemoteAddr();//通過request對象取得ip地址

     try {

         out.write(ip);//輸出時有可能會拋出異常

     } catch (IOException e) {

         e.printStackTrace();

     }

     return TagSupport.SKIP_BODY;//表示跳過標簽體

}

}

 

4.2在WEB-INF目錄下新建*.tld文件,用於表示標簽庫,在*.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">

      <!-- description用來添加對taglib(標簽庫)的描述 -->

     <description>陳程編程開發的自定義標簽庫</description>

      <!--taglib(標簽庫)的版本號 -->

     <tlib-version>1.0</tlib-version>

     <short-name>GaclTagLibrary</short-name>

     <!--

         為自定義標簽庫設置一個uri用於表示標簽庫,uri以/開頭,/後面的內容隨便寫,如這裡的/chen ,

         在Jsp頁面中引用標簽庫時,需要通過uri找到標簽庫

         在Jsp頁面中就要這樣引入標簽庫:<%@taglib uri="/chen" prefix="anyword"%>

     -->

     <uri>/chen</uri>

    

     <!--一個taglib(標簽庫)中包含多個自定義標簽,每一個自定義標簽使用一個tag標記來描述  -->

     <!-- 一個tag標記對應一個自定義標簽 -->

      <tag>

         <description>這個標簽的作用是用來輸出客戶端的IP地址</description>

         <!--

             為標簽處理器類配一個標簽名,在Jsp頁面中使用標簽時是通過標簽名來找到要調用的標簽處理器類

             通過IP就能找到對應的com.chen.ying.FirstTag類

          -->

         <name>IP</name>

         <!-- 標簽對應的處理器類-->

         <tag-class>com.chen.ying.FirstTag</tag-class>

         <body-content>empty</body-content>

     </tag>

    

 </taglib>

 

4.3在jsp頁面中使用自定義標簽

使用<%@taglib uri=”標簽庫的uri”  prefix=”標簽的使用首碼”%>來引入要使用的標簽庫,首碼可任意設置

 

顯示結果

每次調用<haha:IP>標簽時,都會觸發doStartTag()方法

從上面代碼可以看到,使用標簽可以移除jsp中的java代碼

二、定義有屬性的標簽

1,  要求

 

2,  完成一個日期格式化顯示的操作,即根據用戶輸入的日期格式化模板顯示日期。

2.1編寫標簽類

package com.chen.ying;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class DataTag extends TagSupport {

    private String format;

    public int doStartTag()throws JspException{

       SimpleDateFormat sdf=new SimpleDateFormat(this.format);//設置日期格式

       try {

           pageContext.getOut().write(sdf.format(new Date()));//用指定格式顯示日期

       } catch (IOException e) {

           e.printStackTrace();

       }

       return TagSupport.SKIP_BODY;

    }

    public String getFormat() {

       return format;

    }

    public void setFormat(String format) {//在標簽中通過反射機制設置

       this.format = format;

    }

}

2.2在標簽庫中配置標簽

 

2.3在jsp使用標簽

 

3,  小結

 

三、TagSupport類

1,  要求

 

2,  TagSupport主要屬性及方法

 

     Int doStartTag()

    

 

     int doAfterBody()

    

 

     int doEndTag()

    

     3,Tag介面執行流程

    

 

4,含標簽體的標簽:判斷某個屬性範圍內是否存在指定的屬性名稱的屬性

4.1編寫標簽處理器類

package com.chen.ying;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class AttributeTag extends TagSupport {

private String name;//接收屬性的名稱

private String scope;//接收屬性的範圍

public int doStartTag()throws JspException{

     Object value=null;

     if("page".equals(this.scope)){//是否是page屬性範圍

         value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);

     }

     if("request".equals(this.scope)){//是否是request屬性範圍

         value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);

     }

     if("session".equals(this.scope)){//是否是session屬性範圍

         value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);

     }

     if("application".equals(this.scope)){//是否是屬性範圍

         value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);

     }

     if(value==null){//表示沒有此屬性,不執行標簽體

         return TagSupport.SKIP_BODY;

     }

     else{//執行標簽體

         return TagSupport.EVAL_BODY_INCLUDE;

     }  

}

public void setName(String name) {

     this.name = name;

}

public void setScope(String scope) {

     this.scope = scope;

}

 

}

 

4.2在標簽庫中配置標簽

 

 

4.3在jsp中使用標簽‘

 

 是否執行標簽體,由返回值決定

 

5,小結

 

四、迭代標簽

1,  要求

 

 

在MVC模式中強調,在一個JSP文件中最好不要出現script代碼,因為這樣會破壞程式的結構,維護起來非常麻煩,JSP文件就只是用來接收、判斷與輸出的。現在要在JSP中完成集合的輸出,為了不出現script代碼,可以用迭代標簽

2,  迭代標簽開發步驟

2.1編寫標簽處理類

public class IteratorTag extends TagSupport {

    private String name;

    private String scope;

    private String id;//指定保存集合中的每個元素的屬性名稱

    private Iterator<?> iter=null;

    public int doStartTag()throws JspException{

        Object value=null;

        if("page".equals(this.scope)){//是否是page屬性範圍

            value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);

        }

        if("request".equals(this.scope)){//是否是request屬性範圍

            value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);

        }

        if("session".equals(this.scope)){//是否是session屬性範圍

            value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);

        }

        if("application".equals(this. Scope)){//是否是屬性範圍

            value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);

        }

        if(value!=null&&value instanceof List<?>){//有此屬性且為List類型

            this.iter=((List<?>)value).iterator();

            if(iter.hasNext()){

                pageContext.setAttribute(this.id,iter.next());

                //將集合元素保存在指定屬性名的屬性範圍中

                return TagSupport.EVAL_BODY_INCLUDE;//執行標簽體,通過id屬性名輸出集合元素

            }

            else{

                return TagSupport.SKIP_BODY;

            }

        }

        else{

            return TagSupport.SKIP_BODY;

        }  

    }

    public int doAfterBody()throws JspException{

        if(iter.hasNext()){

            pageContext.setAttribute(this.id,iter.next());

            //將集合元素保存在屬性範圍中,屬性名在jsp中指定

            return TagSupport.EVAL_BODY_AGAIN;//如果還有元素,交給doAfterBody()處理

        }

        else{

            return TagSupport.SKIP_BODY;

        }

    }

    public void setName(String name) {

        this.name = name;

    }

    public void setScope(String scope) {

        this.scope = scope;

    }

    public void setId(String id) {

        this.id = id;

    }  

}

註意,如果是要執行一次標簽體則在doStartTag()中返回EVAL_BODY_INCLUDE,如果是要多次執行標簽體,則在doAfterBody()中返回EVAL_BODY_AGAIN;

2.2在標簽庫中配置標簽處理類

 
    

有時候tomcat會出現如下錯誤

Unable to find setter method for ***

只要在對應屬性配置處添加<type>屬性類型</type>即可解決

 

2.3在jsp中使用標簽

 

id用於指定list中每個元素保存在屬性範圍中的屬性名,以方便用表達式語言輸出

 

2.4結果

 

 

3,  小結

通過標簽操作對象,可分為以下步驟:首先在servlet中將對象保存在屬性範圍內,然後:1,確定標簽的屬性有哪些,如要操作對象屬性的名稱,範圍等2,通過對象屬性得到對象,然後處理對象,可將處理後的結果保存在指定屬性名的屬性範圍內,然後在標簽體中顯示處理結果,如上述id=”person”.

 

五、 BodyTagSupport類

1, 要求

 

 

2, 定義

 

 

3, 主要擴充方法

 

 

4, BodyContent類

 

 

5, BodyTag介面的執行流程

 

 

6,TagExtraInfo類和VariableInfo類

 

 

TagExtraInfo類的主要方法

 

 

VariableInfo類的主要方法

 

 

7,小結

 

以上都是傳統標簽開發,在實際開發中並不常用,下麵的簡單標簽才是重點

 


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

-Advertisement-
Play Games
更多相關文章
  • 第二章 變數和變數類型 1. C++ 算數類型 bool 布爾 最小尺寸未定義 char 字元 8位 wchar_t 寬字元 16位 char16_t Unicode 字元 16位 char32_t Unicode 字元 32位 short 短整型 16位 int 整型 16位 long 長整型 3 ...
  • 1、引用變數的定義 在PHP 中引用的意思是:不同的名字訪問同一個變數內容.使用&表示 使用 & 會使(如$a = &$b)指向同一個記憶體地址(這並不像 C 的指針:例如你不能對他們做指針運算,他們並不是實際的記憶體地址),一個發生改變,另一個也會發生改變 2、使用 memory_get_usage( ...
  • public class TAutoPerson { public static void main(String args[]) { new TAutoPerson().fun(); } public void fun() { System.out.println("hello world!!!"... ...
  • C語言是目前世界上流行、使用最廣泛的高級程式設計語言。 C語言對操作系統和系統使用程式以及需要對硬體進行操作的場合,用C語言明顯優於其它高級語言,許多大型應用軟體都是用C語言編寫的。 C語言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫它是數值計算的高 ...
  • 遞歸概念:(按我自己的話說)如果一個函數function在內部調用自己,就可以看成遞歸。如果按書上的定義就是:如果一個新的調用能在相同過程中較早的調用結束之前開始,那麼個該過程就是遞歸。 舉個慄子: 1 def func(n): 2 if n ==0 or n ==1:return 1 3 else ...
  • DTOJ 2703:兩個數的餘數和商 解題報告 ——翱翔的逗比w ...
  • Pandas數據特征分析 數據的排序 將一組數據通過摘要(有損地提取數據特征的過程)的方式,可以獲得基本統計(含排序)、分佈/累計統計、數據特征(相關性、周期性等)、數據挖掘(形成知識)。 .sort_index()方法在指定軸上根據索引進行排序,預設升序 .sort_index(axis=0, a ...
  • 說到現在程式員的工資,大家想到的都是一個字:高! 然後有人就說,如今人人轉IT,未來程式員供過於求,肯定會成為白菜價。 現在的程式員平均起薪工資約5K、6K,工作幾年後動輒3W、5W,相比其他行業的技術崗位來說,似乎充滿了泡沫。 而且不瞭解IT行業,或對行業認知太淺的大部分人都認為這是普遍的經濟規律 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...