JSTL
什麼是jstl
jstl是java中的一個定製標籤庫集
爲什麼要使用JSTL
1.實現了jsp頁面中的代碼複用,重複使用功能相同的代碼
2.書寫jsp頁面時可讀性更強,以標籤對的形式出現和前端代碼更加相似
jstl的環境搭建
下載jstl的jar包,添加到web目錄下
jstl的使用
先使用<%@ page url="" prefic="c" %>引入你需要的標籤包
jstl的四大分類
核心標籤 格式化標籤 SQL標籤 XML標籤
EL表達式:與JSTL搭配使用,用於獲取程序中的變量
EL表達式的格式:用美元符號‘$’定界,內容包括在花括號'{}'中
${表達式}
例子: . 與 [] 通常情況下可以通用
"$ {users.sex}" <===> "${user["sex"]}"
特殊情況下不能通用:
1.包含特殊字符
${users.first-name} 這是錯誤的
${user["first-name"]} 這纔是正確的
2.通過變量動態取值:只能寫--->${users[param]}
EL的類型轉換(count爲字符串會自動轉換爲int):"${param.count+20}"
EL判斷對象是否爲空的方法:"${empty username}" 這個判空無論對象爲空還是內容爲空,都會返回true
JSTL標籤的使用
1.out標籤
<!-- 使用out標籤輸出常量-->
<c:out values="this is a const values"></c:out>
<!-- 使用out標籤輸出變量-->
<% session.setAttribute("name","Jessica") %>
<c:out values="${name}"></c:out>
<!-- 當變量不存在時,輸出default中的內容-->
<c:out values="${name2}" default="" ></c:out>
<!-- 當輸出的內容中存在需要轉義的特殊符號時-->
<c:out values="<out標籤>" escapeXml="false" ></c:out>
2.set標籤
<!--存值到scope中-01-->
<c:set values="todays" var="day" scope="session"></c:set>
<!--存值到scope中-02-->
<c:set var="day" scope="application">today</c:set>
<!--存值都javaBean中-->
<jsp:useBean id="對象名" class="包括包名具體類的地址">
<c:set target="${對象名}" property="屬性名" values="變量值" ></c:set>
<c:set target="${對象名}" property="屬性名" >變量值</c:set>
3.remove標籤
<c:set values="todays" var="day" scope="session"></c:set>
<c:remove var="day" />
4.catch標籤
catch標籤中可以包含那些容易出錯的JSTL標籤
<!-- 將錯誤信息存到變量error中-->
<c:catch var="error">
<c:set target="aa" property="bb" values="cc"></c:set>
</c:catch>
<c:out values="${error}"></c:out>
5.if標籤
同程序中的if作用相同,用來實現分支條件控制
1.test屬性用於存放判斷的條件,一般使用EL表達式來編寫
2.var指定名稱用來存放判斷的結果類型爲true或false
3.scope用來存放var屬性存放的範圍
<input type="text" value="${param.score}"/>
<c:if test="${param.scope>=90}" var="result" scope="">
<c:out value=恭喜你的成績大於90""></c:out>
</c:if>
<c:out values="${result}"></c:out>
6.choose when otherwise標籤 類似switch..case
通常這三個標籤被放在一起配合使用
c:choose標籤嵌套在c:when和c:otherwise的外面,作爲他們的父標籤使用
其中choose和when也可以一起組合使用
<!-- choose、when、otherwise -->
<input type="text" value="${param.score}"/>
<c:choose>
<c:when test="${param.score>=90 && param.score<=100}">
<c:out value="優秀"></c:out>
</c:when>
<c:when test="${param.score>=80 && param.score<90}">
<c:out value="良好"></c:out>
</c:when>
<c:when test="${param.score>=70 && param.score<80}">
<c:out value="中等"></c:out>
</c:when>
<c:when test="${param.score>=60 && param.score<70}">
<c:out value="及格"></c:out>
</c:when>
<c:when test="${param.score<60 && param.score>=0}">
<c:out value="不及格"></c:out>
</c:when>
<!-- otherwise可以不寫,相當於default-->
<c:otherwise>
<c:out value="您的輸入有問題"></c:out>
</c:otherwise>
</c:choose>
7.foreach標籤
根據循環條件遍歷集合(Collection)中的元素
var設定變量名用於存儲從集合中取出元素(必須無默認值)
items指定要遍歷的集合(必須無默認值)
begin,end用於知道遍歷的起始位置和終止位置(有默認)
step指定循環的步長(有默認)
varStatus通過index,count,first,last幾個狀態值,描述begin和end子集中的元素的狀態
<!-- forEach標籤的用法 -->
<%
List animals = new ArrayList();
animals.add("tiger");
animals.add("dog");
animals.add("elephant");
animals.add("lion");
animals.add("bird");
animals.add("fish");
animals.add("bear");
request.setAttribute("animals", animals);
%>
<!--全部遍歷-->
<c:forEach var="ani" items="${animals}">
<c:out value="${ani}"></c:out><br>
</c:forEach>
<c:out value="-------------------------"></c:out><br>
<!--部分遍歷-->
<c:forEach var="ani" items="${animals}" begin="2" end="4">
<c:out value="${ani}"></c:out><br>
</c:forEach>
<c:out value="-------------------------"></c:out><br>
<!--部分遍歷並指定步長-->
<c:forEach var="ani" items="${animals}" begin="2" end="4" step="2">
<c:out value="${ani}"></c:out><br>
</c:forEach>
<c:out value="-------------------------"></c:out><br>
<!--部分遍歷並描述狀態-->
<c:forEach var="ani" items="${animals}" begin="2" end="4" varStatus="a">
<c:out value="原集合中的索引值${a.index}"></c:out><br>
<c:out value="總共已迭代的次數${a.count}"></c:out><br>
<c:out value="判斷當前元素是否是子集中的第一個值${a.first}"></c:out><br>
<c:out value="判斷當前元素是否是子集中的最後一個值${a.last}"></c:out><br>
<c:out value="======"></c:out><br>
</c:forEach><br>
8.fortokens標籤,相當於split()
用於瀏覽字符串,並根據指定字符串進行截取
items指定被迭代的字符串
delims指定使用的分隔符
var指定用來存放遍歷到的成員
<c:forTokens items="010-88668543-1033" delims="-" var="num">
<c:out value="${num}"></c:out><br>
</c:forTokens>
8.import標籤的用法
可以把其他靜態或動態文件包含到當前jsp頁面中
同jsp:include的區別爲:只能包含同一個web應用中的文件
而c:import可以包含其他web應用中的文件,甚至是網咯上的資源
<!-- import標籤的用法 -->
<!-- 導入網絡上的絕對路徑 -->
<c:catch var="error09">
<c:import url="http://www.imooc.com"></c:import>
</c:catch>
<c:out value="${error09}"></c:out><br>
<!-- 導入相對路徑文件 -->
<c:catch var="error08">
<c:import url="tt.txt" charEncoding="gbk"></c:import>
</c:catch>
<c:out value="${error08}"></c:out><br>
<!--pageScope、requestScope、sessionScope和applicationScope都是EL 的隱含對象,由它們的名稱可以很容易猜出它們所代表的意思,例如:${sessionScope.username}是取出Session範圍的username 變量。-->
<!-- var及scope屬性的用法 -->
<c:catch var="error07">
<c:import url="tt.txt" var="tt" scope="session" charEncoding="gbk"></c:import>
</c:catch>
<c:out value="${error07}"></c:out><br>
<c:out value="import標籤存儲的tt字符串變量值爲:${sessionScope.tt}"></c:out><br>
9.redirect標籤
該標籤用來實現請求的重定向,同時可以在URL中加入指定的參數
url指定重定向頁面的地址
<c:redirect url="first.jsp">
<c:param name="username">admin</c:param>
<c:param name="password">123</c:param>
</c:redirect>
10.url標籤
value 表示url路徑值
var 將url路徑存儲在變量中
scope var變量的範圍
<c:set var="parturl"> aa</c:set>
<c:url value="http://localhost:8080/${parturl}" var="newUrl" scope="session"></c:url>
<a href="${newUrl}">型的url</a>
jstl函數
使用JSTL需要先引入
<%taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
fn:contains 判斷字符串是否包含另外一個字符串 <c:if test="${fn:contains(name, searchString)}">
fn:containsIgnoreCase 判斷字符串是否包含另外一個字符串(大小寫無關) <c:if test="${fn:containsIgnoreCase(name, searchString)}">
fn:endsWith 判斷字符串是否以另外字符串結束 <c:if test="${fn:endsWith(filename, ".txt")}">
fn:escapeXml 把一些字符轉成XML表示,例如<字符應該轉爲< ${fn:escapeXml(param:info)}
fn:indexOf 子字符串在母字符串中出現的位置 ${fn:indexOf(name, "-")}
fn:join 將數組中的數據聯合成一個新字符串,並使用指定字符格開 ${fn:join(array, ";")}