java web高级编程 百度网盘_[有书共享]JavaWeb高级编程
JavaWeb高級(jí)編程 -- 篇6
在JSP中使用表達(dá)式語(yǔ)言
表達(dá)式語(yǔ)言(EL)源于JSP標(biāo)準(zhǔn)庫(kù)(JSTL)的一部分,用于在不使用腳本、聲明或者表達(dá)式的情況下,在JSP頁(yè)面中渲染數(shù)據(jù)。
EL的基本語(yǔ)法描述了一個(gè)必須與其他JSP頁(yè)面語(yǔ)法分開(kāi)執(zhí)行的表達(dá)式。基本的EL語(yǔ)法有兩種類型:立即執(zhí)行和延遲執(zhí)行。
1. 立即執(zhí)行
立即執(zhí)行EL表達(dá)式將在頁(yè)面渲染的時(shí)候,被JSP引擎解析和執(zhí)行。因?yàn)镴SP從上向下執(zhí)行,這意味著EL表達(dá)式將在JSP引擎發(fā)現(xiàn)它,并在繼續(xù)執(zhí)行其他頁(yè)面部分之前執(zhí)行它。如下為一個(gè)有效的EL表達(dá)式:
${expr}
美元符號(hào)和開(kāi)始/結(jié)束花括號(hào)定義了EL表達(dá)式的邊界。
2. 延遲執(zhí)行
延遲執(zhí)行EL表達(dá)式是統(tǒng)一表達(dá)式的一部分,主要用于滿足JavaServer Faces的需要。盡管延遲執(zhí)行語(yǔ)法在JSP中是合法的,但通常不會(huì)出現(xiàn)在JSP中。如下,其中expr是一個(gè)合法的表達(dá)式:
#{expr}
在JSF中,延遲執(zhí)行表達(dá)式將在頁(yè)面渲染或者回傳到頁(yè)面時(shí)執(zhí)行,或者同時(shí)在兩個(gè)階段內(nèi)執(zhí)行。在JSP中,#{}延遲執(zhí)行語(yǔ)法只是一個(gè)有效的JSP標(biāo)簽特性,用于將EL表達(dá)式的執(zhí)行推遲到標(biāo)簽的渲染過(guò)程中。不同于在特性值綁定到標(biāo)簽之前執(zhí)行EL表達(dá)式的方式,該標(biāo)簽的特性將獲得一個(gè)對(duì)未執(zhí)行EL表達(dá)式的引用。該標(biāo)簽可以在之后一個(gè)合適的時(shí)間,調(diào)用一個(gè)方法來(lái)執(zhí)行EL表達(dá)式。
EL可以直接用在JSP的任何位置,除了少數(shù)例外情況。首先,EL表達(dá)式不能用在任何指令中。在編譯JSP時(shí),指令(、和)將會(huì)被執(zhí)行,但EL表達(dá)式是在稍后渲染JSP時(shí)執(zhí)行,所以在其中添加EL表達(dá)式是無(wú)法正常工作的。另外,JSP聲明()、腳本()或者表達(dá)式()中的EL表達(dá)式也是無(wú)效的。除此之外,EL表達(dá)式可以添加到其他任何位置。一種常見(jiàn)的情況是將EL表達(dá)式添加到輸出到屏幕的簡(jiǎn)單文本中。:
The user will see ${expr} text and will know that ${expr} is good.
當(dāng)表達(dá)式執(zhí)行時(shí),結(jié)果會(huì)內(nèi)嵌在文本中顯示到屏幕。
另外,表達(dá)式還可以用在標(biāo)準(zhǔn)的HTML標(biāo)簽特性中:
表達(dá)式也可以使用在JSP標(biāo)簽特性中:
JSP引擎不會(huì)解析這些HTML 特性中的內(nèi)容,它會(huì)將其中的內(nèi)容當(dāng)作普通文本輸出到響應(yīng)中,所以可以在引用或者文本形式中包含EL表達(dá)式。
EL語(yǔ)法是弱類型,并且它包含許多內(nèi)建的隱式類型轉(zhuǎn)換。表達(dá)式主要的規(guī)則是執(zhí)行后要產(chǎn)生某個(gè)值。不能在表達(dá)式中聲明變量、執(zhí)行賦值語(yǔ)句或者不產(chǎn)生結(jié)果的操作。
EL中的保留關(guān)鍵字:
true、false、null、instanceof、empty、div、mod、and、or、not、eq、ne、lt、gt、le、ge
舉例:
關(guān)鍵字empty用于驗(yàn)證某些集合、Map或者數(shù)組是否含有值,或者某些字符串是否含有一個(gè)或多個(gè)字符。
${empty x}
eq、ne、lt、gt、le和ge運(yùn)算符分別是Java關(guān)系運(yùn)算符==,!=,,<=和>=,當(dāng)然你仍然可以使用傳統(tǒng)的關(guān)系運(yùn)算符。
EL表達(dá)式中第一個(gè)執(zhí)行的操作符是括號(hào)[]和點(diǎn)(.)解析操作符。如:
${mycollection["key"].memberName["anotherKey"]}
引擎首先將解析對(duì)象myCollection中映射到key的值。然后在該值中解析memberName方法、字段或者屬性。最后在該方法、字段或者屬性中再解析anotherKey所對(duì)應(yīng)的值。在這些操作符都執(zhí)行之后,下面開(kāi)始解析分組圓括號(hào)操作符()。
EL引擎執(zhí)行的最后一個(gè)操作符是分號(hào)(;)。該操作看上去與C中的逗號(hào)(,)相像,它允許在表達(dá)式中同時(shí)使用多個(gè)表達(dá)式,但只有最后一個(gè)表達(dá)式的值會(huì)被保留下來(lái)。如:
${x = y + 3; obj.callMethod(x); 'hello, world'}
該表達(dá)式最后執(zhí)行字符串字面量"hello, world"。該表達(dá)式的最終結(jié)果是最后一個(gè)分號(hào)之后的表達(dá)式"hello, world"。
EL中字符串字面量既可以使用雙引號(hào)也可以使用單引號(hào)。
在EL表達(dá)式中,只允許使用十進(jìn)制字面量,對(duì)于其他類型的字面量,EL表達(dá)式中沒(méi)有對(duì)應(yīng)的用法。
無(wú)論何時(shí)需要,都可以直接在EL表達(dá)式中創(chuàng)建集合。
字面量集合中的元素以逗號(hào)分隔開(kāi)。
{1,2,'three',4.00,x}
其中x可以是任何數(shù)據(jù)類型。
構(gòu)造列表的方法與構(gòu)造集合的方法基本一致,區(qū)別在于列表使用的是方括號(hào),而集合使用的是花括號(hào)。
[1,2,'three',[x,y],{'foo','bar'}]
列表中的元素將以逗號(hào)分隔。
HashMap集合字面量:
{'one':1,2:'two','key':x,'list':[1,2,3]}
EL除了使用公共訪問(wèn)方法訪問(wèn)屬性的標(biāo)準(zhǔn)語(yǔ)法,還提供了訪問(wèn)JavaBean中屬性的簡(jiǎn)化語(yǔ)法。假設(shè)現(xiàn)在有一個(gè)名為Shirt的類,它包含一個(gè)公開(kāi)字段size。現(xiàn)有一個(gè)名為shirt的變量,使用EL訪問(wèn)size字段:
${shirt.size}
當(dāng)使用這種方法時(shí),EL引擎看到該語(yǔ)法,它將尋找shirt中的屬性而不是字段。所以需要對(duì)Shirt類進(jìn)行修改,使用標(biāo)準(zhǔn)JavaBean訪問(wèn)和設(shè)置方法getSize和setSize將size封裝為私有字段。表達(dá)式shirt.size就變成了shirt.getSize()的快捷方式。
還可以使用[]操作符訪問(wèn)屬性:
${shirt["size"]}
在EL早期版本,只可以訪問(wèn)JavaBean屬性,不可以調(diào)用對(duì)象方法,不過(guò)在EL2.1添加了在JSP中調(diào)用對(duì)象方法的能力。因此,可以通過(guò)${shirt.getSize()}訪問(wèn)Shirt的size屬性。
在EL中,函數(shù)是映射到類中靜態(tài)方法的一個(gè)特殊工具。函數(shù)調(diào)用的語(yǔ)法如下所示:[ns]是命名空間,[fn]是函數(shù)名,從[a1]到[an]都是參數(shù)
${[ns]:[fn]([a1[,a2[,a3[,...]]]])}
JSTL函數(shù)庫(kù)的命名空間為fn;不過(guò)也可以在taglib指令中使用任何其他命名空間。
與Java訪問(wèn)靜態(tài)字段和方法的方式相同:在EL中使用完全限定的類名,接著是點(diǎn)操作符,再接著是字段或者方法名。如:
${java.lang.Integer.MAX_VALUE}
除非使用的類已經(jīng)使用JSP page指令導(dǎo)入,否則必須使用完全限定的類型。在JSP中,如同Java一樣,所有在java.lang包中的類都已經(jīng)被隱式地導(dǎo)入。
在大多數(shù)情況下,lambda表達(dá)式是一個(gè)參數(shù)名字的列表,緊接著是某種類型的操作符,最后是函數(shù)體。EL中的lambda表達(dá)式語(yǔ)法幾乎與Java8中的一樣。
EL的lambda表達(dá)式體中包含的則是另一個(gè)EL表達(dá)式。
訪問(wèn)Map值的方式:
${map["username"]}
${map.username}
列表訪問(wèn)方式:
${list[0]}
${list{'0'}}
empty操作符使用:
${empty set}
總結(jié)
以上是生活随笔為你收集整理的java web高级编程 百度网盘_[有书共享]JavaWeb高级编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深入解析C++编程中的静态成员函数
- 下一篇: C++中的内联函数inline总结