JSP核心之JSTL
一、核心標簽庫
使用 JSTL 的核心標簽庫单芜,需要在頁面中通過 taglib 指令首先將標簽庫導入洲鸠。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
(1)c:set
用于進行變量定義馋缅,并將變量存放到指定域屬性空間萤悴;為 Bean 的屬性賦值;設置 Map的 key 與 value 等居灯。該標簽在實際開發(fā)中并不常用内狗。
<1>將變量放到request域屬性空間:
<c:set value="張三" var="name" scope="request"/>
name = ${requestScope.name}<br>
屬性表示的含義:
- value:變量的值
- var:變量名
- scope:將變量存放的域屬性空間柳沙,取值為page拌倍、request、session数初、application泡孩。默認為page范圍
<2>為Bean的屬性賦值
<jsp:useBean id="student" class="com.hcx.beans.Student" scope="session"/>
<c:set value="李四" property="name" target="${sessionScope.student}"/>
<c:set value="24" property="age" target="${sessionScope.student}"/>
屬性表示的含義:
- target:指定的Bean對象
- property:指定對象的指定屬性
- value:為指定對象的指定屬性所賦的值
<3>為Map的key與value賦值
<%
Map<String,String> map = new HashMap();
pageContext.setAttribute("map",map);
%>
<c:set value="男" property="gender" target="${map}"/>
<c:set value="12345678974" property="mobile" target="${map}"/>
屬性表示的含義:
- target:指定的 map
- property:指定 map 的指定的 key
- value:為指定 map 的指定的 key 所賦的值
(2)c:remove
從域屬性空間中刪除指定變量仑鸥。該標簽不常用变屁。
<1>刪除指定域空間中的指定變量
<c:set var="some" value="pag_some" scope="page"/>
<c:set var="some" value="req_some" scope="request"/>
<c:set var="some" value="ses_some" scope="session"/>
<c:set var="some" value="app_some" scope="application"/>
<c:remove var="some" scope="request"/>
some pag = ${pageScope.some}<br>
some req = ${requestScope.some}<br>
some ses = ${sessionScope.some}<br>
some app = ${applicationScope.some}<br>
屬性表示的含義:
- var:指定要刪除的變量名
- scope:指定要刪除哪個域屬性空間中的指定變量粟关。不指定該屬性,則刪除所有域屬性空間中的該變量澎灸。
<2>刪除所有域空間中的指定變量
<c:remove var="some" />
some pag = ${pageScope.some}<br>
some req = ${requestScope.some}<br>
some ses = ${sessionScope.some}<br>
some app = ${applicationScope.some}<br>
(3)c:out
用于在頁面上輸出 EL 表達式的值击孩。該標簽不常用。
EL 表達式不用<c:out/>標簽创泄,就可以直接在頁面上輸出括蝠,那么使用這個<c:out/>標簽有什么更強的作用呢忌警?
<1>escapeXml="false" 解析HTML標簽
<c:set var="city" value="<h2>北京</h2>"/>
city1 = <c:out value="${city}" /><br>
city2 = <c:out value="${city}" escapeXml="flase"/><br>
city3 = ${city}<br>
屬性表示的含義:
- value:指定要輸出的 EL 表達式
- escapeXml:是否忽略 HTML 標簽。若為 true箕速,則不解析 HTML 標簽朋譬,將按原樣輸出徙赢,為默認值。若為 false窑业,則解析 HTML 標簽枕屉。EL 表達式本身也是解析 HTML 標簽的搀擂,無法忽略,不能將 HTML 標簽按照原樣輸出秸架。
<2>default="默認值"
country1 = <c:out value="${country}" default="中國" /><br>
country2 = ${country}<br>
屬性表示的含義:
- default:指定默認值东抹。若要輸出的變量不存在,或其值為 Null食茎,則輸出默認值馏谨。而對于EL 表達式惧互,對于不存在或值為 Null 的變量,其不進行輸出拨与。
(4)c:catch
當有異常發(fā)生時买喧,用于捕獲異常匆赃。相當于 try-catch 中的 catch 代碼塊。該標簽不常用钱床。該標簽只有一個屬性 var,是捕獲到的異常對象事期。
<c:catch var="ex">
<!--Student類中沒有score屬性-->
double score = ${student.score};
</c:catch>
<br>
ex = ${ex.message}<br>
(5)c:if
用于實現(xiàn)對于條件的判斷兽泣。
<c:set var="user" value="admin" />
<c:if test="${user == 'admin'}">
<a href="">進入管理頁面</a>
</c:if>
<br>
系統(tǒng)首頁
屬性表示的含義:
- test:判斷的條件唠倦。若為 true,則執(zhí)行標簽體冈止,否則不執(zhí)行候齿。
- var:存儲 test 的判斷結果。不常用掂器。
- scope:存儲 test 判斷結果的變量的存放范圍俱箱。不常用狞谱。
(6)c:choose
實現(xiàn)多分支判斷。類似于 switch-case 語句峡懈。一個<c:choose/>標簽中可以包含多個<c:when/>與一個<c:otherwise/>与斤。
下面的例子實現(xiàn)對于頁面上“首頁”“上一頁”“下一頁”“末頁”導航按鈕的顯示功能:
- 總共一頁的情況:四外按鈕都是普通文本撩穿,沒有超鏈接。
- 當前頁是第一頁的情況:首頁雾狈、上一頁是普通文本善榛;下一頁呻畸、末頁是超鏈接伤为。
- 當前頁是最后一頁的情況:首頁、上一頁是超鏈接叙甸;下一頁位衩、末頁是普通文本。
- 其它情況光戈,即當前頁為中間頁的情況:四個按鈕均是超鏈接。
(7)c:forEach
用于循環(huán)遍歷數(shù)組晌杰、List肋演、Set烂琴、Map 集合奸绷。在實際應用中使用非常頻繁。
<1>常規(guī)用法
a.遍歷Object[]
<%
Object[] citys = {"北京","上海","廣州"};
pageContext.setAttribute("citys",citys);
%>
<c:forEach items="${citys}" var="city">
${city}<br>
</c:forEach>
b.遍歷List
<%
List<String> names = new ArrayList();
names.add("張三");
names.add("李四");
names.add("王五");
pageContext.setAttribute("names",names);
%>
<c:forEach items="${names}" var="name">
${name}<br>
</c:forEach>
c.遍歷Set
<%
Set<String> schools = new HashSet();
schools.add("清華大學");
schools.add("北京大學");
schools.add("中國人民大學");
pageContext.setAttribute("schools",schools);
%>
<c:forEach items="${schools}" var="school">
${school}<br>
</c:forEach>
d.遍歷Map
<%
Map<String,Object> map = new HashMap();
map.put("name","張三");
map.put("age","23");
map.put("score",93.5);
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="entry">
${entry.key} = ${entry.value}<br>
</c:forEach>
<2>指定遍歷的起始索引及步長
對于數(shù)組及 List,可以指定遍歷的起始索引及步長铅碍。
a.指定遍歷起始
<%
Object[] countrys={"0中國","1美國","2德國","3英國","4法國","5日本","6韓國"};
pageContext.setAttribute("countrys",countrys);
%>
<c:forEach items="${countrys}" var="country" begin="1" end="5">
${country}<br>
</c:forEach>
運行結果:
1美國
2德國
3英國
4法國
5日本
b.指定遍歷起始及步長
<%
Object[] countrys={"0中國","1美國","2德國","3英國","4法國","5日本","6韓國"};
pageContext.setAttribute("countrys",countrys);
%>
<c:forEach items="${countrys}" var="country" begin="1" end="5" step="2">
${country}<br>
</c:forEach>
運行結果:
1美國
3英國
5日本
屬性表示的含義:
- begin:指定遍歷開始索引胞谈。從 0 開始計數(shù)憨愉。
- end:指定遍歷結束索引配紫,遍歷結果包含這個索引。
- step:指定遍歷時的步長
<3>獲取當前遍歷對象的相關信息
<forEach/>標簽中有一個屬性 varStatus,該屬性指定的變量是一個引用型變量括细。該引用中記錄了當前遍歷對象的相關信息奋单。該引用常用的方法如下:
- int getIndex():獲取當前對象的索引猫十。從 0 開始計數(shù)。
- int getCount():獲取當前對象的序號贷笛。從 1 開始計數(shù)乏苦。
- boolean isFirst():判斷當前對象是否是第一個對象汇荐。
- boolean isLast():判斷當前對象是否是最后一個對象。
a.添加序號
<br>--------獲取當前遍歷對象的相關信息---------<br>
<%
List<Student> students = new ArrayList();
students.add(new Student("張三",23));
students.add(new Student("李四",24));
students.add(new Student("王五",25));
students.add(new Student("趙六",26));
students.add(new Student("田七",27));
students.add(new Student("劉八",28));
pageContext.setAttribute("students",students);
%>
<table border="1">
<tr>
<th>序號</th>
<th>姓名</th>
<th>年齡</th>
</tr>
<c:forEach items="${students}" var="student" varStatus="curObj"
<tr>
<td>${curObj.count}</td>
<td>${student.name}</td>
<td>${student.age}</td>
</tr>
</c:forEach>
</table>
b.隔行變色
在前面頁面中添加一段 CSS 代碼:使用類選擇器旬蟋,名稱為 odd 的類使用一種背景顏色倾贰;名稱為 even 的類使用另一種背景顏色稠腊。
<head>
<title>My JSP 'index.jsp' starting page</title>
<style type="text/css">
<!--類選擇器:奇數(shù)-->
.odd{
background-color:#eeeeee
}
<!--類選擇器:偶數(shù)-->
.even{
background-color:#888888
}
</style>
</head>
再修改<forEach/>中的<tr>架忌,為每一行添加一個類名:奇數(shù)行添加 odd 類名叹放,偶數(shù)行添加 even 類名。
<table border="1">
<tr>
<th>序號</th>
<th>姓名</th>
<th>年齡</th>
</tr>
<c:forEach items="${students}" var="student" varStatus="curObj"
<tr class="${curObj.index%2==0?'even':'odd'}">
<td>${curObj.count}</td>
<td>${student.name}</td>
<td>${student.age}</td>
</tr>
</c:forEach>
</table>
運行結果:
二、格式化標簽庫
(1)fmt:formatDate
該標簽用于使用不同的模式格式化日期雹嗦。其常用屬性有:
- value:將要被格式化的數(shù)據(jù)
- pattern:格式化的模式合是。其與 SimpleDateFormat 的參數(shù)設置方式相同聪全。
- var:格式化后的字符串所要存放的變量。若不指定 var娃圆,則會將格式化過的結果直接顯示在頁面
- scope:變量存放的域屬性空間讼呢,取值為 page、request三痰、session散劫、application幕帆。默認為page 范圍
- type:其取值為 date失乾、time,或 both裸卫,表示給出的 value 是日期墓贿、時間蜓氨,還是兩者都包含穴吹。默認為 date
(2)fmt:parseDate
該標簽用于將指定字符串轉換為日期類型港令。常用的屬性有:
- value:將要被轉換的數(shù)據(jù)
- pattern:將要被轉換的數(shù)據(jù)的模式。其與 SimpleDateFormat 的參數(shù)設置方式相同咪惠。
- var:轉換后的日期類型數(shù)據(jù)所要存放的變量硝逢。若不指定 var绅喉,則會將轉換過的結果直接顯示在頁面
- scope:變量存放的域屬性空間柴罐,取值為 page革屠、request、session那婉、application详炬。默認為page 范圍
(3)fmt:formatNumber
該標簽用于按照指定格式對數(shù)字進行格式化呛谜。常用的屬性有:
若要使用 pattern 模式隐岛,則其中常用的符號的意義為:
(4)fmt:parseNumber
該標簽用于將指定字符串轉換為數(shù)值類型聚凹。常用的屬性有: