SlideShare a Scribd company logo
1
8
• 自訂標籤
學習目標
• 使用Tag File自訂標籤
• 使用Simple Tag自訂標籤
• 使用Tag自訂標籤
2
簡介Tag File
3
簡介Tag File
4
簡介Tag File
• 撰寫一個副檔名為.tag的檔案,把它們放在
WEB-INF/tags底下
5
簡介Tag File
6
簡介Tag File
• Tag File會被容器轉譯為
javax.servlet.jsp.tagext.SimpleT
agSupport的子類別
• 在Tag File中可以使用out、config、
request、response、session、
application、jspContext等隱含物件
• 其中jspContext在轉譯之後,實際上則是
javax.servlet.jsp.JspContext物件
7
簡介Tag File
• Tag File在JSP中,並不是靜態包含
(<%@include>)或動態包含
(<jsp:include>)
• 在Tag File中撰寫Scriplet的話
– 其中的隱含物件其實是轉譯後的.java中doTag()
方法中的區域變數
– 不可能與JSP中的Scriptlet溝通
8
簡介Tag File
9
處理標籤屬性與本體
10
處理標籤屬性與本體
11
處理標籤屬性與本體
12
處理標籤屬性與本體
13
處理標籤屬性與本體
• Tag File的標籤在使用時若有本體,預設是不
允許有Scriptlet的
• tag指示元素的body-content屬性預設就
是scriptless,還可以設定empty或
tagdependent
14
TLD檔案
• 如果要將Tag File包成JAR檔案,那麼有幾個
地方要注意一下:
– *.tag檔案必須放在JAR檔的META-INF/tags資料
夾或子資料夾下。
– 要定義TLD(Tag Library Description)檔案。
– TLD檔案必須放在JAR檔的META-INF/TLDS資
料夾下。
15
16
TLD檔案
17
簡介Simple Tag
18
簡介Simple Tag
19
簡介Simple Tag
20
了解API架構與生命週期
21
了解API架構與生命週期
• 建立自訂標籤處理器實例。
• 呼叫標籤處理器的setJspContext()方法設定
PageContext實例。
• 如果是巢狀標籤中的內層標籤,則還會呼叫標籤處
理器的setParent()方法,並傳入外層標籤處理
器的實例。
• 設定標籤處理器屬性(例如這邊是呼叫IfTag的
setTest()方法來設定)。
• 呼叫標籤處理器的setJspBody()方法設定
JspFragment實例。
• 呼叫標籤處理器的doTag()方法。
• 銷毀標籤處理器實例。
22
了解API架構與生命週期
• 每一次的請求都會建立新的標籤處理器實例,
而在執行doTag()過後就銷毀實例
• Simple Tag的實作中,建議不要有一些耗資
源的動作
23
了解API架構與生命週期
• 如果執行doTag()的過程在某些條件下,必
須中斷接下來頁面的處理或輸出,則可以丟
出SkipPageException
24
處理標籤屬性與本體
25
處理標籤屬性與本體
26
27
處理標籤屬性與本體
28
處理標籤屬性與本體
29
與父標籤溝通
30
與父標籤溝通
31
與父標籤溝通
32
33
34
TLD檔案
• JAR檔案根目錄下放置編譯好的類別(包含
對應套件的資料夾)。
• JAR檔案META-INF資料夾或子資料夾中放置
TLD檔案。
35
簡介Tag
36
簡介Tag
37
簡介Tag
38
了解架構與生命週期
39
了解架構與生命週期
• 嘗試從標籤池(Tag Pool)找到可用的標籤物件,如果找
到就直接使用,如果沒找到就建立新的標籤物件。
• 呼叫標籤處理器的setPageContext()方法設定
PageContext實例。
• 如果是巢狀標籤中的內層標籤,則還會呼叫標籤處理器的
setParent()方法,並傳入外層標籤處理器的實例。
• 設定標籤處理器屬性(例如這邊是呼叫IfTag的
setTest()方法來設定)。
• 呼叫標籤處理器的doStartTag()方法,並依不同的傳回
值決定是否執行本體或呼叫doAfterBody()、
doEndTag()方法(稍後詳述)。
• 將標籤處理器實例置入標籤池中以便再度使用。
40
了解架構與生命週期
• Tag實例是可以重複使用的
• 自訂Tag類別時,要注意物件狀態是否會保
留下來,必要的時候,在doStartTag()方
法中,可以進行狀態重置的動作
• 別以為可以使用release()方法來作狀態重
置,因為release()方法只會在標籤實例真
正被銷毀回收前被呼叫
41
了解架構與生命週期
42
重複執行標籤本體
• 想繼承TagSupport實作<f:forEach>標
籤,該在哪個方法中實作?
• doStartTag()?doEndTag()?
43
44
45
處理本體執行結果
46
處理本體執行結果
47
處理本體執行結果
48
處理本體執行結果
49
與父標籤溝通
50
51
與父標籤溝通
52
53
綜合練習/微網誌
• 在微網誌首頁顯示使用者發佈的最新訊息,
並稍微利用一下自訂標籤,讓頁面的處理更
為精簡且易維護
54

More Related Content

What's hot

Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Justin Lin
 

What's hot (20)

Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器
 
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 ServletServlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
Servlet & JSP 教學手冊第二版試讀 - 撰寫與設定 Servlet
 
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMailServlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
Servlet & JSP 教學手冊第二版 - 第 11 章:簡介 JavaMail
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答Servlet & JSP 教學手冊第二版 - 課後練習解答
Servlet & JSP 教學手冊第二版 - 課後練習解答
 
Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSPServlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
Servlet & JSP 教學手冊第二版 - 第 6 章:使用 JSP
 
Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
CH02:從JDK到IDE
CH02:從JDK到IDECH02:從JDK到IDE
CH02:從JDK到IDE
 

Similar to Ch08 自訂標籤

2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
Anthony Chen
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
yiditushe
 
Django development
Django developmentDjango development
Django development
loveyudu
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
yiditushe
 
03.wls depoly jdbc
03.wls depoly jdbc03.wls depoly jdbc
03.wls depoly jdbc
Meng He
 

Similar to Ch08 自訂標籤 (20)

2011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.02011 JavaTwo JSF 2.0
2011 JavaTwo JSF 2.0
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Django development
Django developmentDjango development
Django development
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
喬叔 Elasticsearch Index 管理技巧與效能優化
喬叔 Elasticsearch Index 管理技巧與效能優化喬叔 Elasticsearch Index 管理技巧與效能優化
喬叔 Elasticsearch Index 管理技巧與效能優化
 
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDEJava SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
 
Lucene实践
Lucene实践Lucene实践
Lucene实践
 
Hibernate教程
Hibernate教程Hibernate教程
Hibernate教程
 
中远公司 Java培训资料
中远公司  Java培训资料中远公司  Java培训资料
中远公司 Java培训资料
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
 
test
testtest
test
 
HTML 語法教學
HTML 語法教學HTML 語法教學
HTML 語法教學
 
03.wls depoly jdbc
03.wls depoly jdbc03.wls depoly jdbc
03.wls depoly jdbc
 
20111018 zhouchen share
20111018 zhouchen share20111018 zhouchen share
20111018 zhouchen share
 
Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解Spring4.x + hibernate4.x_配置详解
Spring4.x + hibernate4.x_配置详解
 
SQL Server 資料庫版本控管
SQL Server 資料庫版本控管SQL Server 資料庫版本控管
SQL Server 資料庫版本控管
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
 
OPM
OPMOPM
OPM
 

More from Justin Lin

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走
 
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
 
Python 3.9 技術手冊目錄
Python 3.9 技術手冊目錄Python 3.9 技術手冊目錄
Python 3.9 技術手冊目錄
 

Ch08 自訂標籤