JSP、EL表達(dá)式梁呈、JSTL標(biāo)簽庫干貨(建議收藏)

隱式獲取

${key} : 將會以pageContext??request??session??application順序讀取,域的范圍是從小到大

關(guān)于集合的展示 ??

<%

List list = new ArrayList();

? ? list.add("one");

? ? list.add("two");

? ? list.add("three");

? ? pageContext.setAttribute("aList",list);

? ? Map map = new HashMap();

? ? map.put("color","red");

? ? map.put("shape","square");

? ? pageContext.setAttribute("aMap",map);

%>

${aList}<br/> <!--直接輸出數(shù)組-->

${aList[0]}<br/> <!--按下標(biāo)讀取數(shù)組-->

${aList[2]}<br/> <!--按下標(biāo)讀取數(shù)組-->

${aMap}<br/> <!--直接輸出映射-->

${aMap.shape}<br/> <!--按鍵讀取映射-->

下面是在網(wǎng)頁中輸出的結(jié)果 ??

[one, two, three]

one

three

{color=red, shape=square}

square

對象的展示

測試??

<%

class Student{

? ? ? ? private final String name = "Tom";

? ? ? ? private final String sex = "boy";

? ? ? ? @Override

? ? ? ? public String toString() {

? ? ? ? ? ? return name+" is a "+sex;

? ? ? ? }

}

Student student = new Student();

pageContext.setAttribute("aStudent",student);

%>

${aStudent}<br/>

下面是在網(wǎng)頁中輸出的結(jié)果 ??

Tom is a boy

可以看出來EL對于對象的展示其實就是調(diào)用了toString()方法缰趋,包括集合也一樣捧杉。如果這個對象沒有重寫toString()方法,那么機(jī)會調(diào)用父類toString()方法。比如父類是Object秘血,那么就會輸出hashcode味抖。

對象的字段(屬性)的獲取

獲取方式: ${object.field} 即可獲取對象的字段(屬性)

測試代碼??

com.java.webtest.Student

package com.java.webtest;

public class Student {

? ? private String name = "Jack";

? ? public String getName() {

? ? ? ? return name;

? ? }

}

myTest.jsp

<%@ page import="com.java.webtest.Student" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

? ? <title>myTest</title>

</head>

<body>

? ? <%

? ? ? ? Student s1 = new Student();

? ? ? ? pageContext.setAttribute("s1",s1);

? ? %>

? ? name = ${s1.name}<br/>

</body>

</html>

運行結(jié)果

name = Jack

?? EL表達(dá)式獲取對象字段(屬性)是通過反射機(jī)制。${s1.name} 底層邏輯是將首字母"n"大寫再在前面拼接一個"get"灰粮,然后反射獲取"getName"方法仔涩。所以對象必須提供字段的get方法,才能使用EL表達(dá)式 ${object.field} 粘舟,如果不寫就會報錯熔脂,或者你讓get方法返回一個和相應(yīng)字段無關(guān)的東西來證明確實是調(diào)用了get方法得到值的。

EL的運算

運算類型 描述

算術(shù)型 加+ 減- 乘* 除/柑肴、 div 取余% 霞揉、mod

邏輯型 and、&&晰骑、or适秩、||、!硕舆、not

關(guān)系型 ==秽荞、eq、!=抚官、ne扬跋、<、lt凌节、>钦听、gt、<=倍奢、le彪见、>=、ge

empty 判斷一個值是否為null或者為empty娱挨,如${empty ""} 返回值為true

三目運算 expression ? valueA : valueB 若expression為true返回valueA否則返回valueB

做一個測試 ??

<%

? ? class Person{

? ? ? ? private int id;

? ? ? ? private String sex;

? ? ? ? public Person(int id,String sex){ this.id = id; this.sex = sex; }

? ? ? ? @Override

? ? ? ? public boolean equals(Object o) { return id == ((Person) o).id; }

? ? }

? ? Person p1 = new Person(777,"boy");

? ? Person p2 = new Person(777,"girl");

? ? Person p3 = new Person(666,"boy");

? ? pageContext.setAttribute("p1",p1);

? ? pageContext.setAttribute("p2",p2);

? ? pageContext.setAttribute("p3",p3);

%>

1 + 2 = ${1 + 2}<br/>

1 - 2 = ${1 - 2}<br/>

3 * 3 = ${3 * 3}<br/>

10 / 3 = ${10 / 3}<br/>

10 div 3 = ${10 div 3}<br/>

10 % 3 = ${10 % 3}<br/>

10 mod 3 = ${10 mod 3}<br/>

true and false -> ${true and false}<br/>

true && false ->${true && false}<br/>

true or false -> ${true or false}<br/>

true || false -> ${true || false}<br/>

not true -> ${not true}<br/>

!true -> ${!true}<br/>

666 == 666 -> ${666 == 666}<br/>

p1 == p2 -> ${p1 == p2}<br/>

p1 == p3 -> ${p1 == p3}<br/>

"ABCDEFG" == "abcdefg" -> ${"ABCDEFG" == "abcdefg"}<br/>

"ABCDEFG" == "ABCDEFG" -> ${"ABCDEFG" == "ABCDEFG"}<br/>

"ABCDEFG" eq "abcdefg" -> ${"ABCDEFG" eq "abcdefg"}<br/>

"ABCDEFG" eq "ABCDEFG" -> ${"ABCDEFG" eq "ABCDEFG"}<br/>

"ABCDEFG" != "abcdefg" -> ${"ABCDEFG" != "abcdefg"}<br/>

"ABCDEFG" != "ABCDEFG" -> ${"ABCDEFG" != "ABCDEFG"}<br/>

"ABCDEFG" ne "abcdefg" -> ${"ABCDEFG" ne "abcdefg"}<br/>

"ABCDEFG" ne "ABCDEFG" -> ${"ABCDEFG" ne "ABCDEFG"}<br/>

10 < 3 -> ${10 < 3}<br/>

10 lt 3 -> ${10 lt 3}<br/>

10 > 3 -> ${10 > 3}<br/>

10 gt 3 -> ${10 gt 3}<br/>

10 <= 3 -> ${10 <= 3}<br/>

10 le 3 -> ${10 le 3}<br/>

10 >= 3 -> ${10 >= 3}<br/>

10 ge 3 -> ${10 ge 3}<br/>

empty "" -> ${empty ""}<br/>

empty null -> ${empty null}<br/>

empty 666 -> ${empty 666}<br/>

55 > 60 ? "you pass!" : "you fail..." -> ${55 > 60 ? "you pass!" : "you fail..."}<br/>

頁面的輸出結(jié)果??

1 + 2 = 3

1 - 2 = -1

3 * 3 = 9

10 / 3 = 3.3333333333333335

10 div 3 = 3.3333333333333335

10 % 3 = 1

10 mod 3 = 1

true and false -> false

true && false ->false

true or false -> true

true || false -> true

not true -> false

!true -> false

666 == 666 -> true

p1 == p2 -> true

p1 == p3 -> false

"ABCDEFG" == "abcdefg" -> false

"ABCDEFG" == "ABCDEFG" -> true

"ABCDEFG" eq "abcdefg" -> false

"ABCDEFG" eq "ABCDEFG" -> true

"ABCDEFG" != "abcdefg" -> true

"ABCDEFG" != "ABCDEFG" -> false

"ABCDEFG" ne "abcdefg" -> true

"ABCDEFG" ne "ABCDEFG" -> false

10 < 3 -> false

10 lt 3 -> false

10 > 3 -> true

10 gt 3 -> true

10 <= 3 -> false

10 le 3 -> false

10 >= 3 -> true

10 ge 3 -> true

empty "" -> true

empty null -> true

empty 666 -> false

55 > 60 ? "you pass!" : "you fail..." -> you fail...

我認(rèn)為應(yīng)該特別注意兩點

兩個整數(shù)相除的結(jié)果并不是整數(shù)

p1 == p2 -> true 和 "ABCDEFG" == "ABCDEFG" -> true余指。顯然不同于Java,EL表達(dá)式重載了 == ,對象之間使用 == 比較的時候酵镜,并不是比較對象的引用變量(也就是對象地址或指針)碉碉,而是使用了 equals(Object o) 方法。!= 比較對象也是同理淮韭,可以自己測試一下垢粮。

JSTL標(biāo)簽庫

JSTL(Java server pages standarded tag library)是一個JSP標(biāo)準(zhǔn)標(biāo)簽庫,它封裝了JSP應(yīng)用的通用核心功能靠粪。JSTL支持通用的蜡吧、結(jié)構(gòu)化的任務(wù),比如迭代占键,條件判斷昔善,XML文檔操作,國際化標(biāo)簽畔乙,SQL標(biāo)簽君仆。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標(biāo)簽牲距。下文將闡述部分常用的JSTL標(biāo)簽返咱。EL和JSTL核心標(biāo)簽庫通常搭配使用效果最佳

使用前的準(zhǔn)備

導(dǎo)入相應(yīng)的jar包:standard.jar 和 jstl.jar

JSP頁面引入標(biāo)簽庫

<%@ taglib pre?x="前綴" uri="功能范圍路徑" %>

功能范圍 prefix uri

core c http://java.sun.com/jsp/jstl/core

i18n fmt http://java.sun.com/jsp/jstl/fmt_rt

sql sql http://java.sun.com/jsp/jstl/sql

xml x http://java.sun.com/jsp/jstl/xml

functions fn http://java.sun.com/jsp/jstl/function

?? 如果在后面使用中出現(xiàn) 500錯誤頁面,其中包含類似這樣的信息:atrribute [value] does not accpet any expressions牍鞠,有可能是uri的問題咖摹,可能需要換一個uri。uri不同版本功能有差別所以會導(dǎo)致一些錯誤难述。

標(biāo)簽使用語法

<prefix:tag attribute="value" ... >

...

</prefix:tag>

重要標(biāo)簽

?? 免責(zé)聲明:以下標(biāo)簽屬性總結(jié)并不全面萤晴,只講比較常用的屬性;并且由于uri不同屬性不同龄广。具體內(nèi)容請查看你導(dǎo)入的standard.jar

<c:tag>標(biāo)簽

使用標(biāo)簽前不要忘記導(dǎo)入標(biāo)簽硫眯,不過IDEA也會自動導(dǎo)入蕴侧。核心標(biāo)簽按照功能可以分為??

表達(dá)式操作: out择同、set、remove净宵、catch

流程控制: if敲才、choose、when择葡、otherwise

迭代操作: forEach紧武、forTokens

URL操作: import、param敏储、url阻星、redirect

<c:set>標(biāo)簽

屬性 缺省 說明

value - 向域中存入的變量值

var - 向域中存入的變量名

scope page 指定存儲在4個域中的哪一個

target - Java對象

property - Java對象的字段(屬性)。因為使用的是反射技術(shù),與前面EL表達(dá)式獲取字段值同理:該字段必須有set方法

<c:out>標(biāo)簽

屬性 缺省 說明

value - 需要顯示出來的值

default - 如果value的值為null妥箕,則顯示default的值

escapeXml true 是否轉(zhuǎn)義xml字符滥酥。有些字符如&lt在xml中被認(rèn)為是<,若要它的字面意思畦幢,就需要使用轉(zhuǎn)移

案例 ??

com.java.testclass.Person

package com.java.testclass;

public class Person {

? ? private String name;

? ? private int age;

? ? public Person(String name, int age) {

? ? ? ? this.name = name;

? ? ? ? this.age = age;

? ? }

? ? @Override

? ? public String toString() {

? ? ? ? return name+" is "+age+" years old.";

? ? }

? ? public String getName() {

? ? ? ? return name;

? ? }

? ? public void setName(String name) {

? ? ? ? this.name = name;

? ? }

? ? public int getAge() {

? ? ? ? return age;

? ? }

? ? public void setAge(int age) {

? ? ? ? this.age = age;

? ? }

}

JSTL-test.jsp

<%@ page import="com.java.testclass.Person" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>

<html>

<head>

? ? <title>JSTL-test</title>

</head>

<body>

<%

? ? pageContext.setAttribute("person1",new Person("Tom",18));

? ? pageContext.setAttribute("person2",null);

%>

<h6>********** set & out Test **********</h6>

<%--向域中存值--%>

<c:set var="fruit" value="apple"></c:set>

<c:set var="fruit" value="banana" scope="session"></c:set>

<%--設(shè)置Java對象的字段--%>

<c:set value="David" target="${person1}" property="name"></c:set>

<c:set target="${person1}" property="age">18</c:set><br>

<%--輸出--%>

<c:out value="${fruit} is fruit." default="fruit is null!"></c:out><br>

person1 : ${person1}<br>

person2 : <c:out value="${person2}" default="person2 is null!"></c:out><br>

<c:out value="&lt==when escapeXml is true==&gt"></c:out><br>

<c:out value="&lt==when escapeXml is false==&gt" escapeXml="false"></c:out><br>

</body>

</html>

結(jié)果

********** set & out Test **********

apple is fruit.

person1 : David is 18 years old.

person2 : person2 is null!

&lt==when escapeXml is true==&gt

<==when escapeXml is false==>

<c:if>標(biāo)簽

屬性 缺省 說明

test - if 的條件表達(dá)式

var - 定義一個變量存儲if 條件表達(dá)式的結(jié)果

scope page var變量的JSP范圍

<c:choose>標(biāo)簽

屬性 缺省 說明

test 無 如果表達(dá)式的結(jié)果為true坎吻,則執(zhí)行體內(nèi)容,false則相反

<c:choose>

? ? <c:when test="boolean表達(dá)式">

? ? </c:when>

? ? <c:otherwise>

? ? </c:otherwise>

</c:choose>

<c:forEach>標(biāo)簽

用于遍歷集合元素

屬性 缺省 說明

var - 遍歷用的循環(huán)變量

items - 被遍歷的集合對象

varStatus - 存放本輪循環(huán)變量的相關(guān)參數(shù)

begin 0 遍歷起點下標(biāo)

end 最后元素下標(biāo) 遍歷終點下標(biāo)

step 1 每次迭代的間隔數(shù)

直接看例子 ??

<%

? ? int[] arr = {100,200,300,400,500,600,700,800,900,1000};

? ? pageContext.setAttribute("arr",arr);

%>

<h6>********** process control Test **********</h6>

foreach arr

<c:forEach items="${arr}" var="it" begin="1" end="7" step="2" varStatus="status">

? ? <c:if test="${status.count==1}">

? ? ? ? from ${status.begin} to ${status.end} by step = ${status.step}<br>

? ? </c:if>

? ? arr[${status.index}] = ${it} , count = ${status.count}<br>

</c:forEach>

結(jié)果

********** process control Test **********

foreach arr from 1 to 7 by step = 2

arr[1] = 200 , count = 1

arr[3] = 400 , count = 2

arr[5] = 600 , count = 3

arr[7] = 800 , count = 4

從結(jié)果count屬性并不是與index屬性關(guān)聯(lián)的值宇葱,index是數(shù)組的下標(biāo)瘦真,count僅作為循環(huán)的計數(shù)器。

<fmt:tag>標(biāo)簽

<fmt:formatDate>標(biāo)簽

該標(biāo)簽用于格式化輸出Date類型變量黍瞧,比較常用

屬性 缺省 說明

value - 用于指定被格式化對象

pattern - 格式化的模式诸尽,與SimpleDateFormat的參數(shù)設(shè)置一樣

var - 指定產(chǎn)生的格式化字符串所存放的變量,若不指定則直接輸出在頁面中

scope page 指定var變量的存儲域

type date 說明value對象包含時間或包含日期還是兩者兼具雷逆。取值為date/time/both

<fmt:parseDate>標(biāo)簽

<fmt:formatDate>的逆向過程弦讽,用于將指定字符串轉(zhuǎn)化為日期類型

屬性 說明

value 用于指定被轉(zhuǎn)化的字符串

pattern 指定解析字符串的格式

var 指定生成的時間對象所存放的變量

請看測試代碼 ??

<%

? ? pageContext.setAttribute("now",new Date());

%>

<h6>******************** fmt Test ********************</h6>

before formatting : ${now}. <br>

<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" var="parse_date"></fmt:formatDate>

after formatting? : ${parse_date}. <br>

<fmt:parseDate value="${parse_date}" var="gotten_date" pattern="yyyy-MM-dd"></fmt:parseDate>

date get from string : ${gotten_date}. <br>

結(jié)果

******************** fmt Test ********************

before formatting : Sat Mar 13 23:03:16 CST 2021.

after formatting : 2021-03-13.

date get from string : Sat Mar 13 00:00:00 CST 2021

? 注意第一個日期與第三個日期的差別,這是由于第一次轉(zhuǎn)換的時候丟失了時間信息

<fmt:formatNumber>標(biāo)簽

USB Microphone https://www.soft-voice.com/

Wooden Speakers? https://www.zeshuiplatform.com/

亞馬遜測評 www.yisuping.cn

深圳網(wǎng)站建設(shè)www.sz886.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膀哲,一起剝皮案震驚了整個濱河市往产,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌某宪,老刑警劉巖仿村,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兴喂,居然都是意外死亡蔼囊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門衣迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏鼓,“玉大人,你說我怎么就攤上這事壶谒≡平茫” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵汗菜,是天一觀的道長让禀。 經(jīng)常有香客問我,道長陨界,這世上最難降的妖魔是什么巡揍? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮菌瘪,結(jié)果婚禮上腮敌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好糜工,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布斗这。 她就那樣靜靜地躺著,像睡著了一般啤斗。 火紅的嫁衣襯著肌膚如雪表箭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天钮莲,我揣著相機(jī)與錄音免钻,去河邊找鬼。 笑死崔拥,一個胖子當(dāng)著我的面吹牛极舔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播链瓦,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼拆魏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慈俯?” 一聲冷哼從身側(cè)響起渤刃,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贴膘,沒想到半個月后卖子,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡刑峡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年洋闽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突梦。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡诫舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宫患,到底是詐尸還是另有隱情刊懈,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布撮奏,位于F島的核電站俏讹,受9級特大地震影響当宴,放射性物質(zhì)發(fā)生泄漏畜吊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一户矢、第九天 我趴在偏房一處隱蔽的房頂上張望玲献。 院中可真熱鬧,春花似錦、人聲如沸捌年。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礼预。三九已至眠砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間托酸,已是汗流浹背褒颈。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留励堡,地道東北人谷丸。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像应结,于是被迫代替她去往敵國和親刨疼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容