偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

在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)容,類似這樣:

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

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

要實現(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的工作原理,概括起來,就是會在執(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)容是這樣的:

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

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

 foreach 這個標(biāo)簽

我們看到,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)簽的聲明

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

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

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

Tag聲明的tld

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

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

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

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

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

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

JSP生成的內(nèi)容

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

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

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

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

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

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

【本文為51CTO專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『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語言文章

2021-05-09 09:06:24

Python批處理命令

2018-04-09 16:35:10

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

2015-10-22 14:32:44

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

2020-10-09 08:15:11

JsBridge

2019-05-21 14:52:57

2014-05-14 11:15:02

歷史起源iOSAndroid

2023-05-08 08:21:15

JavaNIO編程

2021-07-01 10:01:16

JavaLinkedList集合

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開源分布式

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2021-06-30 00:20:12

Hangfire.NET平臺

2023-05-12 08:19:12

Netty程序框架

2021-04-09 08:40:51

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

2017-12-20 10:08:07

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

2011-07-12 13:35:04

程序員
點贊
收藏

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