日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

方立勋_30天掌握JavaWeb_自定义标签

發布時間:2023/12/20 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方立勋_30天掌握JavaWeb_自定义标签 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義標簽主要用于移除Jsp頁面中的java代碼。

使用自定義標簽移除jsp頁面中的java代碼,只需要完成以下兩個步驟:

  • 編寫一個實現Tag接口的Java類(標簽處理器類)。
  • 編寫標簽庫描述符(tld)文件,在tld文件中對標簽處理器類進行描述。

快速入門:使用標簽輸出客戶機IP。
1、編寫一個實現tag接口的標簽處理器類

public class ViewIPTag implements Tag {private PageContext pageContext;public int doStartTag() throws JspException {HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();JspWriter out = pageContext.getOut();String ip = request.getRemoteAddr();try {out.write(ip);} catch (IOException e) {throw new RuntimeException(e);}return 0;}public int doEndTag() throws JspException {return 0;}public Tag getParent() {return null;}public void release() {}public void setPageContext(PageContext arg0) {this.pageContext = arg0;}public void setParent(Tag arg0) {} }

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>A tag library exercising SimpleTag handlers.</description><tlib-version>1.0</tlib-version><short-name>SimpleTagLibrary</short-name><uri>/itcast</uri><tag><name>viewIP</name> <!-- 為標簽處理器類配一個標簽名 --><tag-class>cn.itcast.web.tag.ViewIPTag</tag-class><body-content>empty</body-content></tag></taglib>

3、在jsp頁面中導入并使用自定義標簽

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/itcast" prefix="itcast" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>輸出客戶機的IP</title></head><body>您的IP是:<itcast:viewIP/></body> </html>

傳統標簽

傳統標簽執行流程

JSP引擎將遇到自定義標簽時,首先創建標簽處理器類的實例對象,然后按照JSP規范定義的通信規則依次調用它的方法。

Tag接口的執行流程:

  • public void setPageContext(PageContext pc), JSP引擎實例化標簽處理器后,將調用setPageContext方法將JSP頁面的pageContext對象傳遞給標簽處理器,標簽處理器以后可以通過這個pageContext對象與JSP頁面進行通信。
  • public void setParent(Tag t),setPageContext方法執行完后,WEB容器接著調用的setParent方法將當前標簽的父標簽傳遞給當前標簽處理器,如果當前標簽沒有父標簽,則傳遞給setParent方法的參數值為null。
  • public int doStartTag(),調用了setPageContext方法和setParent方法之后,WEB容器執行到自定義標簽的開始標記時,就會調用標簽處理器的doStartTag方法。
  • public int doEndTag(),WEB容器執行完自定義標簽的標簽體后,就會接著去執行自定義標簽的結束標記,此時,WEB容器會去調用標簽處理器的doEndTag方法。
  • public void release(),通常WEB容器執行完自定義標簽后,標簽處理器會駐留在內存中,為其它請求服務器,直至停止web應用時,web容器才會調用release方法。
  • 自定義標簽功能擴展:

    • 開發人員在編寫Jsp頁面時,經常還需要在頁面中引入一些邏輯,例如:
      • 控制jsp頁面某一部分內容是否執行。
      • 控制整個jsp頁面是否執行。
      • 控制jsp頁面內容重復執行。
      • 修改j頁面內容輸出。
    • 自定義標簽除了可以移除jsp頁面java代碼外,它也可以實現以上功能。

    • tld文件中的四種標簽體類型
      EMPTY JSP scriptless tagdepentend

    左邊圈起來的部分是JSP2.0之前所用的,稱為傳統標簽,現在一般使用的是右邊圈起來的部分SimpleTag接口和實現類創建自定義標簽。

    簡單標簽


    • 由于傳統標簽使用三個標簽接口來完成不同的功能,顯得過于繁瑣,不利于標簽技術的推廣, SUN公司為降低標簽技術的學習難度,在JSP 2.0中定義了一個更為簡單、便于編寫和調用的SimpleTag接口來實現標簽的功能。實現SimpleTag接口的標簽通常稱為簡單標簽。簡單標簽共定義了5個方法:

    setJspContext方法:用于把JSP頁面的pageContext對象傳遞給標簽處理器對象
    setParent方法:用于把父標簽處理器對象傳遞給當前標簽處理器對象
    getParent方法:用于獲得當前標簽的父標簽處理器對象
    setJspBody方法:用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象
    doTag方法:用于完成所有的標簽邏輯,包括輸出、迭代、修改標簽體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。

    SimpleTag接口方法的執行順序

  • 當web容器開始執行標簽時,會調用如下方法完成標簽的初始化
    • WEB容器調用標簽處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標簽處理器對象。
    • WEB容器調用標簽處理器對象的setParent方法,將父標簽處理器對象傳遞給這個標簽處理器對象。注意,只有在標簽存在父標簽的情況下,WEB容器才會調用這個方法。
    • 如果調用標簽時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標簽處理器對象。如果標簽的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,然后把值傳遞給標簽處理器對象。
    • 如果簡單標簽有標簽體,容器將調用setJspBody方法把代表標簽體的JspFragment對象傳遞進來。
  • 執行標簽時:
    • 容器調用標簽處理器的doTag()方法,開發人員在方法體內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標簽體的目的。
  • JspFragment類
    javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規范的JSP片段,這段JSP片段中不能包含JSP腳本元素。

    WEB容器在處理簡單標簽的標簽體時,會把標簽體內容用一個JspFragment對象表示,并調用標簽處理器對象的setJspBody方法把JspFragment對象傳遞給標簽處理器對象。JspFragment類中只定義了兩個方法,如下所示:

    getJspContext方法
    用于返回代表調用頁面的JspContext對象.

    public abstract void invoke(java.io.Writer out)

    • 用于執行JspFragment對象所代表的JSP代碼片段
    • 參數out用于指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值為null,則將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解為寫給瀏覽器)

    invoke方法詳解

    • JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標簽體的內容、是否迭代執行標簽體的內容或對標簽體的執行結果進行修改后再輸出。例如:

      • 在標簽處理器中如果沒有調用JspFragment.invoke方法,其結果就相當于忽略標簽體內容;
      • 在標簽處理器中重復調用JspFragment.invoke方法,則標簽體內容將會被重復執行;
      • 若想在標簽處理器中修改標簽體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如StringWriter),讓標簽體的執行結果輸出到該輸出流對象中,然后從該輸出流對象中取出數據進行修改后再輸出到目標設備,即可達到修改標簽體的目的。

    開發帶屬性的標簽

    • 要想讓一個自定義標簽具有屬性,通常需要完成兩個任務:

    • 在標簽處理器中編寫每個屬性對應的setter方法
    • 在TLD文件中描術標簽的屬性
    • 為自定義標簽定義屬性時,每個屬性都必須按照JavaBean的屬性命名方式,在標簽處理器中定義屬性名對應的setter方法,用來接收JSP頁面調用自定義標簽時傳遞進來的屬性值。 例如屬性url,在標簽處理器類中就要定義相應的setUrl(String url)方法。

    • 在標簽處理器中定義相應的set方法后,JSP引擎在解析執行開始標簽前,也就是調用doStartTag方法前,會調用set屬性方法,為標簽設置屬性。

    在TLD中描述標簽屬性:

    簡單標簽調用流程圖

    總結

    以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。