JavaWeb之EL和自定義標簽

EL 表達式

使用它可以極大的便利 JSP 頁面中的數(shù)據(jù)獲取和處理

語法結構

所有的 EL 都是以 ${ 為起始材义,以 } 為結尾?

EL 變量

${username} 表示取出某一范圍內名稱為 username? 的變量中燥,因為此時并沒有指定哪個范圍的 username,所以它的默認情況下會先從 Page 范圍找专钉,如果找不到捺典,會依次從 Request娇斩、Session茅主、Application 范圍,直到找到值回傳弃酌,如果沒找到氨菇,返回 null。

案例

在 testel.jsp 頁面中妓湘,首先在頭部需要注明開啟 EL 表達式:

當前頁面存取 session 值

1查蓉、

運行結果:

以上取值方式等同于:

方式一針對某個范圍內進行查找,而方式二沒有指定榜贴,則默認從 Page 開始查找豌研。

注意:

如果在存 session 的 key 里面含有特殊字符,則應使用 [] 來取值

2唬党、

由圖鹃共,新建一個用戶實體,分別設置屬性驶拱,并取值霜浴。

3、

提交表單數(shù)據(jù)并當前頁面并顯示:

執(zhí)行結果:

方式一采用的以往通過 JSP 內置對象的 request 來獲取參數(shù)蓝纲,而方式二采用 EL 表達式來獲取阴孟,

4、

執(zhí)行結果

由結果得知税迷,EL 可以自動進行類型轉換

EL 隱含對象

與范圍有關的:

applicationScope永丝、sessionScope、requestScope翁狐、pageScope

與輸入有關的:

param、paramValues

其他隱含對象:

cookie凌蔬、header露懒、headerValues闯冷、initParam、pageContext

對于?pageContext 對象:

即為 PageContext 類型懈词,但只能讀取屬性就可以一直“.”下去

由圖可以獲取相關等屬性

Empty 屬性

可以作用于一個集合蛇耀,若集合不存在或者集合沒有元素,則結果為 true

自定義標簽

概念:

用戶定義的一種自定義的 JSP 標記坎弯,當一個含有自定義標簽的 JSP 頁面被 JSP 引擎編譯成 Servlet 時纺涤,tag 標簽被轉化成了對一個稱為標簽處理類的對象的操作。所以抠忘,當 JSP 頁面被 JSP 引擎轉化成 Servlet 后撩炊,實際上 tag 標簽被轉化為對 tag 處理類的操作。使用自定義標簽可以降低 JSP 開發(fā)的復雜度和維護量

編寫自定義標簽:

核心是編寫處理類崎脉,一個標簽對應一個標簽處理器類拧咳,而一個標簽庫則是很多標簽處理器的集合,所有標簽處理器都要實現(xiàn) JspTag 接口囚灼,該接口中沒有定義任何方法骆膝,主要作為 Tag 和 SimpleTag 接口的父接口。

標簽形式:

1灶体、空標簽:<hello/>

2阅签、帶有屬性的空標簽:<max num1="3" num2="5"/>

3、帶有內容的標簽:<greeting>hello</greeting>

4蝎抽、帶有內容和屬性的標簽:<greeting name="tom">hello<greeting/>

編寫步驟:

1政钟、表寫完成標簽功能的 java 類(標簽處理器)

2、編寫標簽庫描述(tld)文件织中,在 tld 文件中對自定義標簽進行描述

3锥涕、在 JSP 頁面中導入和使用自定義標簽

案例:

確保項目中已導入如下 jar 包:

在 tag 包下新建?HelloSimpleTag 標簽處理器類并實現(xiàn)?SimpleTag

然后在 WEB-INF 下新建 mytag.tld 配置文件

頭部信息與 core 一致

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"

? ? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? ? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

? ? ? ? version="2.0">

完成以上步驟后在 JSP 引用該 tag

通過引用,可以對照 mytag.tld 的配置文件說明狭吼。

重啟 tomcat

通過運行結果可以看出层坠,執(zhí)行了?HelloSimpleTag 里的?setJspContext 方法和?doTag 方法。

實現(xiàn) SimpleTag 接口的標簽處理類的生命周期:

1刁笙、setJspContext

JSP 引擎將代表 JSP 頁面的 pageContext 對象傳遞給標簽處理器對象

2破花、setParent

JSP 引擎將父標簽處理器對象傳遞給當前標簽處理器對象。只有存在父標簽時疲吸,JSP 引擎才會調用該方法

3座每、setXXX?

設置標簽屬性,只要定義屬性才調用該方法

4摘悴、setJspBody?

若存在標簽體峭梳,JSP 引擎將把標簽體封裝成一個 JspFragment 對象,調用?setJspBody 方法將 JspFragment 對象傳遞給標簽處理器對象,若標簽體為空?setJspBody? 將不會被 JSP 引擎調用

5葱椭、doTag

容器調用標簽處理器對象的 doTag 方法執(zhí)行標簽邏輯

對于?setJspContext捂寿,在方法里把 jspContext 對象賦予全局變量 pageContext,這樣就能獲取到 JSP 中的所有隱含對象孵运。

編寫帶屬性的標簽

首先秦陋,在 tld 配置文件下添加如下內容

注:rtexprvalue 表示的是 runtime expression value

然后在?HelloSimpleTag 類下添加兩個成員變量 value 和 count 用來接收參數(shù),強烈建議使用 String 類型的參數(shù)治笨,并且實現(xiàn)兩者的 set 方法驳概。

接著在 doTag 里面獲取參數(shù),并且進行邏輯處理

最后在 JSP 里面引用標簽

如果是接收動態(tài)值可以這么寫

如果重新新建了 tag 類旷赖,只需在 tld 配置文件里面重新添加 tag 標簽顺又,并進行屬性的說明

通常情況下,開發(fā)簡單標簽直接繼承?SimpleTagSupport 就可以杠愧,可以直接調用其對應的 getter 方法得到對應的 API

編寫帶標簽體的自定義標簽

1待榔、在自定義標簽的標簽處理器中使用 JspFragment 對象封裝標簽體信息

2、若配置了標簽含有標簽體流济,則 JSP 引擎會調用 setJspBody() 方法把 JspFragment 傳遞給標簽處理類锐锣,在 SImpleTagSupport 中還定義了一個 getJspBody() 方法,用于返回 JspFragment 對象

3绳瘟、JspFragment 的 invoke(writer)方法:把標簽體內容從 Writer 中輸出雕憔,若為 null,則等同于 invoke(getJspContext().getOut())糖声,即直接把標簽體內容輸出到頁面上

4斤彼、在 tld 文件中,使用 body-content 節(jié)點來描述標簽體的類型:

empty:沒有標簽體

scriptless:標簽體可以包含 el 表達式和 JSP 動作元素蘸泻,但不能包含 JSP 的腳本元素

說明:

由圖琉苇,第一種屬于 el 表達式,第二種表示 JSP 腳本元素悦施。

tagdependent:表示標簽體交由標簽本身去解析處理并扇,若指定?tagdependent,在標簽體中的所有代碼都會原封不動的交給標簽處理器抡诞,而不是將執(zhí)行結果傳遞給標簽處理器

大部分情況下穷蛹,類型取值為?scriptless

如圖,獲取標簽體的內容昼汗,并轉換成大寫打印在頁面上

編寫帶父標簽的自定義標簽

編寫一個父標簽?TestParentTag肴熏,并編寫一個子標簽?TestSonTag,在 JSP 引用的時候顷窒,父標簽在控制臺打印信息蛙吏,子標簽作為父標簽的標簽體在頁面上顯示父標簽的內容

TestParentTag:

TestSonTag:

tld 配置:

JSP 引用:

運行結果:

通過案例可以得出:

1、父標簽無法獲取子標簽的引用,父標簽僅把子標簽作為標簽體來使用

2鸦做、子標簽可以通過 getParent() 來獲取父標簽的引用(需繼承 SimpleTagSupport 或實現(xiàn) SimpleTag 接口的該方法)璧疗,若子標簽的確有父標簽,JSP 引擎會把代表父標簽的引用通過 setParent(JspTag parent) 賦給標簽處理器

3馁龟、父標簽的類型是 JspTag 類型,該 JspTag 接口為空接口漆魔,用來統(tǒng)一?SimpleTag 和 Tag 的坷檩,簡單標簽和傳統(tǒng)標簽

4、在 tld 配置文件中改抡,不需要為父標簽有額外的配置矢炼,但子標簽是以標簽體的形式存在的,所以父標簽的 body-content 需要設置為?scriptless

JSTL fn 函數(shù)

為了簡化在 JSP 頁面操作字符串阿纤,JSTL 中提供了一套 EL 自定義函數(shù)句灌,這些自定義函數(shù)包含了 JSP 頁面經(jīng)常用到的字符串操作

使用方法如下:

如圖,在頭部引用函數(shù)的聲明欠拾,然后通過?${fun:contains("name", "a")} 來操作字符串



以上為本人的一些學習筆記胰锌,如有出錯歡迎指正,陸續(xù)更新C暾W拭痢!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末荆忍,一起剝皮案震驚了整個濱河市格带,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刹枉,老刑警劉巖叽唱,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異微宝,居然都是意外死亡棺亭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門芥吟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侦铜,“玉大人,你說我怎么就攤上這事钟鸵《ど裕” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵棺耍,是天一觀的道長贡未。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么俊卤? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任嫩挤,我火速辦了婚禮,結果婚禮上消恍,老公的妹妹穿的比我還像新娘岂昭。我一直安慰自己,他們只是感情好狠怨,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布约啊。 她就那樣靜靜地躺著,像睡著了一般佣赖。 火紅的嫁衣襯著肌膚如雪恰矩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天憎蛤,我揣著相機與錄音外傅,去河邊找鬼。 笑死俩檬,一個胖子當著我的面吹牛萎胰,可吹牛的內容都是我干的。 我是一名探鬼主播棚辽,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奥洼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晚胡?” 一聲冷哼從身側響起灵奖,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎估盘,沒想到半個月后瓷患,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遣妥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年擅编,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箫踩。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡爱态,死狀恐怖,靈堂內的尸體忽然破棺而出境钟,到底是詐尸還是另有隱情锦担,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布慨削,位于F島的核電站洞渔,受9級特大地震影響套媚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜磁椒,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一堤瘤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浆熔,春花似錦本辐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至调窍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間张遭,已是汗流浹背邓萨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菊卷,地道東北人缔恳。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像洁闰,于是被迫代替她去往敵國和親歉甚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容