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拭痢!