自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇文章讀懂Java Web的框架標(biāo)簽

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

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

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

實(shí)現(xiàn)類似代碼里if/else這種效果,就會(huì)使用到core標(biāo)簽里的內(nèi)容

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

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

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

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

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

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

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

本文前面的 if 標(biāo)簽,對(duì)應(yīng)生成的Servlet內(nèi)容

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

 foreach 這個(gè)標(biāo)簽

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

其中,最核心的兩個(gè)方法是:

  • doStartTag
  • doEndTag

doStartTag

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

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

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

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

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

標(biāo)簽的聲明

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

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

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

Tag聲明的tld

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

頁面解析執(zhí)行的時(shí)候,會(huì)判斷對(duì)應(yīng)聲明的tld是否存在

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

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

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

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

JSP生成的內(nèi)容

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

數(shù)據(jù)綁定

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

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

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

框架的標(biāo)簽也是如此。 

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)『Tomcat那些事兒』獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2020-04-22 13:27:20

數(shù)據(jù)分析模塊解決

2017-09-04 13:44:00

Java

2019-09-24 14:19:12

PythonC語言文章

2018-04-09 16:35:10

數(shù)據(jù)庫MySQLInnoDB

2021-05-09 09:06:24

Python批處理命令

2015-10-22 14:32:44

微服務(wù)PaaS應(yīng)用開發(fā)

2020-10-09 08:15:11

JsBridge

2019-05-21 14:52:57

2023-05-08 08:21:15

JavaNIO編程

2014-05-14 11:15:02

歷史起源iOSAndroid

2021-07-01 10:01:16

JavaLinkedList集合

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開源分布式

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2021-04-09 08:40:51

網(wǎng)絡(luò)保險(xiǎn)網(wǎng)絡(luò)安全網(wǎng)絡(luò)風(fēng)險(xiǎn)

2017-12-20 10:08:07

數(shù)據(jù)庫阿里巴巴分庫分表技術(shù)

2023-07-30 15:18:54

JavaScript屬性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)