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、_jsp、java和sun開頭。 |
| required | 否 | 用于指定在JSP頁面中調用自定義標簽時是否必須設置這個屬性。其取值包括true和false,默認值為false,true表示必須設置,否則可以設置也可以不設置該屬性。 |
| rtexprvalue | 否 | rtexprvalue是runtime expression value(運行時表達式)的英文簡寫,用于指定屬性值是一個靜態值或動態值。其取值包括true和false,默認值為false,false表示只能為該屬性指定靜態文本值,例如"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轉義標簽
?
打包標簽庫
?
總結
- 上一篇: 无人机揍坦克优势明显
- 下一篇: 单兵数字化装备中武器分系统主要部件包括(