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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

16-自定义标签

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 16-自定义标签 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、自定義標簽入門

1. 為什么引入標簽

??? jsp頁面作為顯示的模板,應盡量使用頁面標簽來實現,避免寫java代碼

??? 如果在jsp頁面寫java代碼,首先會令jsp頁面難以閱讀,不利于頁面排版,其次,作為頁面美化人員有可能會看不懂java代碼,如果將java代碼替換成標簽,那么只要是懂html標簽的人都能看得懂

?

2. 如何實現自定義標簽

?? 移除jsp頁面中的java代碼其實很簡單,只需要寫一個java類實現Tag接口,在java類中實現jsp頁面的代碼,在tld標簽描述文件中針對標簽和java類進行映射。

?

案例: 實現標簽顯示來訪者的ip

實現步驟:

??? 1) 寫一個類 IpTag 實現 Tag 接口

??? 2) 在 WEB-INF 目錄下 新建tld文件, 對標簽進行描述

??? 3)在 jsp 頁面進行調用

?

二、傳統標簽

1. Tag接口

??? 執行流程:

??? 1)創建對象? 初始化

??? 2)調用setPageContext方法傳入表示jsp頁面的pageContext

??? 3)如果有父標簽調用 setParent 方法傳入父標簽

??? 4)調用 setter 方法為屬性賦值

??? 5)調用 doStartTag 方法

??? 6)執行標簽體 可選

??? 7)調用 doEndTag 方法

??? 8)調用release方法釋放資源

?

2. 方法的返回值

??? Tag.EVAL_BODY_INCLUDE??? 執行標簽體

??? Tag.SKIP_BODY??????????? 跳過標簽體?

??? Tag.EVAL_PAGE??????????? 執行剩余頁面

??? Tag.SKIP_PAGE??????????? 跳過剩余頁面

?

3. Tag接口的子類

??? 1) IterationTag 接口

?????? 增加doAfterBody()方法,在方法體執行完畢時被調用

?????? 增加返回值EVAL_BODY_AGAIN 用于執行再次執行標簽體

??? ??? 實現此接口可以實現循環執行標簽體

??? ??? 一般通過繼承默認實現類TagSupport來實現該標簽

?

??? 2) BodyTag 接口

?????? 增加setBodyContent(BodyContent?b)方法傳入標簽體

?????? 我們可以通過該方法獲得標簽體 從而對標簽體進行操作

?????? 增加了常量(返回值) EVAL_BODY_BUFFERED 將標簽體緩存

?

tag –> IterationTag --> BodyTag

?

???

4.tld文件

??? tld 是 taglib description 的縮寫? 為標簽庫描述文件

??? 通過 tag元素描述一個標簽

??? <tag>

??? ??? <description>Outputs Hello, World</description>

??????? <name>helloWorld</name>

??? ??? <tag-class>cn.itcast.tag.HelloWorldTag</tag-class>

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

??? </tag>

??? 其中 name用于指定標簽的名稱

??? tag-class用于指定標簽對應的java類

??? body-content用于指定標簽對之間可以輸入的內容類型

?????? empty表示空標簽,即不能有標簽體

?????? JSP 標簽體不為空,可以寫jsp腳本

?????? scriptless 不能寫jsp腳本,但可以寫表達式和el

?????? tagdependent? 將原始內容提交? 忽略el表達式等運算

?

5.標簽的屬性

??? 需要在頁面標簽中使用屬性需完成以下步驟:

??? 1) 在標簽類中定義一個屬性

??? 2) 為屬性添加 setter 方法

??? 3) 在tld文件中對屬性進行描述

???

實現:

<tag>元素的<attribute>子元素用于描述自定義

標簽的一個屬性,自定義標簽所具有的每個屬性

都要對應一個<attribute>元素 。

?

<attribute>

??? <description>description</description>

??? <name>aaaa</name>

??? <required>true</required>

??? <rtexprvalue>true</rtexprvalue>

??? <type>ObjectType</type>

</attribute>

?

attribute的子元素

元素名

是否必須指定

?????

description

用于指定屬性的描述信息。

name

用于指定屬性的名稱。屬性名稱是大小寫敏感的,并且不能以jsp_jspjavasun開頭。

required

用于指定在JSP頁面中調用自定義標簽時是否必須設置這個屬性。其取值包括truefalse,默認值為falsetrue表示必須設置,否則可以設置也可以不設置該屬性。

rtexprvalue

rtexprvalueruntime expression value(運行時表達式)的英文簡寫,用于指定屬性值是一個靜態值或動態值。其取值包括truefalse,默認值為falsefalse表示只能為該屬性指定靜態文本值,例如"123"true表示可以為該屬性指定一個JSP動態元素,動態元素的結果作為屬性值,例如JSP表達式<%=value %>

type

用于指定屬性值的Java類型。

?

6. 案例

實現將標簽體循環執行指定次數的標簽? Loop

?

三、簡單標簽

1. 簡單標簽SimpleTag

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

?

我們可以通過繼承 SimpleTagSupport 類來實現該接口

?

方法詳解:

setJspContext方法

用于把JSP頁面的pageContext對象傳遞給標簽處理器對象

setParent方法

用于把父標簽處理器對象傳遞給當前標簽處理器對象

getParent方法

用于獲得當前標簽的父標簽處理器對象

setJspBody方法

用于把代表標簽體的JspFragment對象傳遞給標簽處理器對象

doTag方法

用于完成所有的標簽邏輯,包括輸出、迭代、修改標簽體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用于通知WEB容器不再執行JSP頁面中位于結束標記后面的內容,這等效于在傳統標簽的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。

?

方法的調用順序?

?

?

2. 開發案例

開發<c:if>標簽

?

開發<c:if><c:else>標簽

???? choose? when otherwise

開發迭代標簽

??? foreach

開發html轉義標簽

?

打包標簽庫

?

總結

以上是生活随笔為你收集整理的16-自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。

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