溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何讀懂框架標(biāo)簽taglib的工作原理

發(fā)布時間:2021-12-03 10:29:10 來源:億速云 閱讀:95 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)如何讀懂框架標(biāo)簽taglib的工作原理,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

在Java Web應(yīng)用開發(fā)時,如果不是前后端分離進(jìn)行數(shù)據(jù)交互的實現(xiàn),一般都會通過JSP、FreeMarker、Velocity之類的技術(shù)進(jìn)行頁面的渲染。而在頁面的渲染過程中,很多時候會使用到標(biāo)簽(taglib)這個技術(shù)。

比如為了控制頁面一些顯示邏輯,實現(xiàn)類似代碼里if/else這種效果,就會使用到core標(biāo)簽里的內(nèi)容,類似這樣:

如何讀懂框架標(biāo)簽taglib的工作原理

要實現(xiàn)一個容器數(shù)據(jù)的遍歷,可以直接使用core標(biāo)簽的foreach

如何讀懂框架標(biāo)簽taglib的工作原理

要實現(xiàn)頁面上數(shù)據(jù)的格式化,則可以直接使用format標(biāo)簽,進(jìn)行對應(yīng)數(shù)據(jù)的格式化展現(xiàn)。

甚至在一些MVC框架中,也都包含一些便捷的用于頁面數(shù)據(jù)渲染的標(biāo)簽,可以直接使用。例如Spring中的form標(biāo)簽就可以直接進(jìn)行數(shù)據(jù)的綁定。

那這些標(biāo)簽背后是如何工作的呢?

之前的文章里有寫過JSP的工作原理(你了解Tomcat是怎樣處理Jsp文件的嗎?),概括起來,就是會在執(zhí)行時將JSP生成Servlet文件,然后再執(zhí)行對應(yīng)的service方法,進(jìn)行請求的處理。其中涉及到使用標(biāo)簽的部分也會生成對應(yīng)的執(zhí)行邏輯。

而實際上,一個tag,對應(yīng)的是一個Java類,根據(jù)規(guī)范實現(xiàn)相應(yīng)的方法。由JSP生成的Servlet在執(zhí)行標(biāo)簽的過程中,會直接調(diào)用標(biāo)簽對應(yīng)類的指定方法,根據(jù)返回值,來進(jìn)行頁面上對應(yīng)內(nèi)容的輸出。如果是繼續(xù)則輸出內(nèi)容,如果是跳過內(nèi)容就會被忽略?;揪褪沁@樣一個思路。

例如本文前面的 if 標(biāo)簽,對應(yīng)生成的Servlet內(nèi)容是這樣的

如何讀懂框架標(biāo)簽taglib的工作原理

再看 foreach 這個標(biāo)簽,生成的內(nèi)容是這樣的:

如何讀懂框架標(biāo)簽taglib的工作原理

我們看到,foreach 被直接轉(zhuǎn)換成了do while 循環(huán)。

其中,最核心的兩個方法是:

  • doStartTag

  • doEndTag

doStartTag 

該方法會在JSP類內(nèi),被具體的標(biāo)簽實現(xiàn)類調(diào)用。用于實例的標(biāo)簽開始,執(zhí)行時pageContext和一系列屬性被認(rèn)為已經(jīng)設(shè)置完成。

會返回EVAL_BODY_INCLUDE或者SKIP_BODY,從這兩個結(jié)果的變量名稱可以看出,如果如果tag期望繼續(xù)處理body,就返回前者,否則不處理就返回后者。

doEndTag用于確認(rèn)該標(biāo)簽執(zhí)行后,頁面是否要繼續(xù)渲染。

整個taglib使用起來都比較便捷,直接在JSP中聲明 prefix 和 uri ,相當(dāng)于把這部分內(nèi)容依賴添加了進(jìn)來,然后直接使用標(biāo)簽進(jìn)行屬性的設(shè)置,對應(yīng)命名空間下標(biāo)簽的使用等。

而這些標(biāo)簽的聲明,是通過類似這樣的形式,被保存在Jar文件或者WEB-INF這些地方。

如何讀懂框架標(biāo)簽taglib的工作原理

具體的標(biāo)簽實現(xiàn)類,一般繼承TagSupport,然后重寫我們上面提到的doStartTag 和 doEndTag 方法。

所以,對于一般在JSP頁面內(nèi)有大堆的 <% %>  這種所謂的 scriptlet,可以直接定義一個標(biāo)簽,然后把邏輯移動到重寫方法內(nèi)即可。

這些Tag聲明的tld,一般會在應(yīng)用部署后啟動時進(jìn)行掃描,然后添加到Map里,

如何讀懂框架標(biāo)簽taglib的工作原理

頁面解析執(zhí)行的時候,會判斷對應(yīng)聲明的tld是否存在,沒有就會停止頁面執(zhí)行

如何讀懂框架標(biāo)簽taglib的工作原理

頁面解析生成Servlet類之后,執(zhí)行時會調(diào)用具體標(biāo)簽的屬性設(shè)置,doStartTag這些方法,此時如果一些屬性不存在,綁定不成功等這些具體的標(biāo)簽邏輯會被暴露出來。

比如我們在使用 Spring 標(biāo)簽時,經(jīng)常使用其 form 標(biāo)簽進(jìn)行參數(shù)綁定。為了試驗,我們隨便寫一個Spring 的標(biāo)簽使用

<form:input path="abc" id="test"/>

此時,JSP生成的內(nèi)容是這樣的

如何讀懂框架標(biāo)簽taglib的工作原理

然后頁面渲染時,會真正的進(jìn)行數(shù)據(jù)綁定,判斷這些屬性的合法性等等,這里由于是隨便寫的一行代碼,無法綁定所有報錯了。

如何讀懂框架標(biāo)簽taglib的工作原理

所以,對于 Spring、Struts2 等等這些框架的標(biāo)簽,本質(zhì)上執(zhí)行也還是這些邏輯,如果頁面在渲染的時候出現(xiàn)問題,了解清楚是在哪一步的時候出了問題,知道具體這些標(biāo)簽的工作原理。

例如下圖 Spring 的 InputTag 繼承關(guān)系,也沒有脫離Servlet 的Tag這個框。

如何讀懂框架標(biāo)簽taglib的工作原理

總結(jié)下,Taglib的工作原理,是在應(yīng)用部署的時候,解析tld的聲明。頁面渲染的時候,解析如果引入的tld不存在,就會報錯。tld合法之后執(zhí)行 tag 的具體邏輯,根據(jù)返回值判斷是否繼續(xù)頁面的渲染。

以上就是如何讀懂框架標(biāo)簽taglib的工作原理,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI