JSP常用標簽——JSTL標簽和EL表達式


一、JSTL簡介

1、什么是JSTL

JSTL是Java中的一個定制標記庫集。(這個標記庫集不需要自己編寫,可以直接使用)

2、為什么要使用JSTL

  • 實現了JSP頁面中的代碼復用(基於標簽庫原理,重復率較高的代碼塊支持復用,提高效率)
  • 書寫JSP頁面時可讀性更強(長得很像xml,方便前端查看和參與開發)

用事實告訴你為什么使用JSTL:

實現:

但是,使用JSTL效果如下:

3、JSTL環境搭建

JSTL的下載:

下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

下載文件:jakarta-taglibs-standard-1.1.2.zip————2004-10-25 20:57 933K

解壓文件后,在lib文件夾會獲得兩個jar包: standard.jar和jstl.jar

需要把這兩個jar包導入到項目中,注意:

載入外來包,我們不介意采取:右擊項目——Build Path方式,因為這樣只是引入了一個jar包的link進來,如果把項目挪動位置或者把jar包刪除了,則報錯。所以我們推薦直接把要載入的文件復制到:項目——WebRoot\WEB-INF\lib里面,不要忘了把jar包選中——右鍵——Build Path----Add to Build Path。這樣做可以讓jar包隨着項目走,綁在了一起。

二、EL表達式配合使用JSTL

1、JSTL小程序

如果要使用JSTL,要先導入JSTL的標簽庫,如果要進行頁面的輸出的話,需要使用<c:out>輸出標簽。<c:out>是屬於JSTL核心標簽的一個。

導入核心標簽庫:

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

Ps:在uri中之所以能找到該http,是因為導入了上面兩個jar,否則是找不到的。prefix="c",里面的名字可以自定義,一般為“c”。

<c:out value="輸出內容"></c:out>

具體如下:

2、JSTL標簽的四大分類及JSTL函數

JSTL標簽中Value中的值其實可以輸出變量和常量。其中常量可以直接輸出,變量需要通過EL表達式去獲取。

3、EL表達式

什么是EL表達式?

全名是Expression Language,常常配合jstl標簽庫使用,使得JSP頁面更直觀,寫法更簡單。

比如:普通寫法:

EL表達式寫法:

EL表達式的格式:

用美元符號“$”定界,內容包括在花括號“{}”中,即${表達式}

注意“.”和“[]”運算符:

但是:以下兩種情況,兩者不通用。

4、EL變量

如:<c:out value="${temp}"></c:out>

如果沒有做范圍的限定,會依據默認從小到大開始搜索,如果還是找不到,則輸出空字符串。

5、EL自動類型轉換

普通情況:

如果是用EL表達式:

6、EL隱式對象

7、EL運算符

對empty舉例:

<% String username="null"; request.setAttribute("username", username); %>
<c:out value="${empty username}"></c:out>

Ps:如果username為null或者"",則返回true;如果username為"有內容",則返回false。

el表達式中empty運算符對字符串為Null,及空字符串都返回 TRUE。

三、JSTL核心標簽的使用

1、out標簽(表達式控制標簽)

out標簽的作用:

2、set標簽(表達式控制標簽)

set的標簽的作用:

  • 存值到scope中(page,request,session,application);
    • 可以將值以變量形式存放在指定范圍內,有兩種方式:

  • 存值到JavaBean的屬性中。 
    • 需要配合target屬性指定對象並通過property屬性指定要賦值給對象的哪個屬性。

Person類:

將Person類實例化

實例化話后的變量名叫person。那實例化后如何通過set標簽向person中賦值。

變量的賦值需要配合target屬性指定對象並通過property屬性指定要賦值給對象的哪個屬性。

3、remove標簽(表達式控制標簽)

remove標簽的用法:

  • 只能remove掉某個變量(不能remove某個類對象的某個屬性);
  • var屬性是必選;
  • scope屬性是可選。

比如:

此時運行結果就輸出不了firstName的值了。

4、catch標簽(表達式控制標簽)

catch標簽的用法:

  • catch標簽中可以包含那些容易出錯的JSTL標簽(邏輯)

輸出結果:

5、if標簽(流程控制標簽)

if標簽的用法:

  • 同程序中的if作用相同,用來實現分支條件控制。
    • test屬性用於存放判斷的條件,一般使用EL表達式來編寫。
    • var指定名稱用來存放判斷的結果類型為true或false
    • scope用來存放var屬性存放的范圍。

比如:根據用戶輸入的成績進行等級判斷

運行結果:

用戶什么都沒輸入的時候,默認進來是false

輸入90:

輸入80:

6、choose、when、otherwise(流程控制標簽)

 choose、when、otherwise 標簽的作用:

  • 通常這三個標簽被放在一起配合使用
  • <c:choose>標簽嵌套在<c:when>和<c:otherwise>標簽的外面作為他們的父標簽來使用。 
  • 其中choose和when標簽也可以一起組合使用。

綜上所述通常有以下兩種語法結構:

比如:

<!-- choose、when、otherwise -->
<c:choose>
<c:when test="${param.score<=100 && param.score>=60 }">
<c:out value="及格"></c:out>
</c:when>
<c:when test="${param.score<60 && param.score>=0 }">
<c:out value="不及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="請檢查你的輸入!"></c:out>
</c:otherwise>
</c:choose>

ps:用法類似於switch——case——default。

比如:

7、forEach(循環控制標簽)

forEach標簽的作用:

常用用法1-全部遍歷:

例子:

常用用法2-部分遍歷:(begin end)

index值是從0開始的。

例子:

常用用法3-部分遍歷中指定步長(step)

例子:

<!-- 用法三:部分遍歷並帶步長 -->
<c:forEach var="fruit" items="${fruits}" begin="1" end="3" step="2">
<c:out value="${fruit}"></c:out><br>
</c:forEach>

Ps:step默認值:1。

常用用法4-部分遍歷時輸出元素的狀態(varStatus)

例子:

<!-- 用法四:部分遍歷並帶狀態 -->
<c:forEach var="fruit" items="${fruits}" begin="1" end="3" varStatus="fru">
<c:out value="${fruit}——四個屬性:"></c:out><br>
<c:out value="index屬性:${fru.index}"></c:out><br>
<c:out value="count屬性:${fru.count}"></c:out><br>
<c:out value="first屬性:${fru.first}"></c:out><br>
<c:out value="last屬性:${fru.last}"></c:out><br>
<c:out value="----------"></c:out><br>
</c:forEach>

PS:index從0開始;count從1開始;first是否第一個(boolean);last是否最后一個(boolean)。

8、forTokens(循環控制標簽)

forTokens標簽的用法:

例子:

輸出:

注:forTokens還有如下屬性,與forEach的屬性相同。

9、import(URL操作標簽)

import標簽的用法:

impor各屬性含義:

例子:

 1 <!-- import標簽用法 -->
 2 <!-- 導入網絡上的絕對路徑 -->
 3 <c:catch var="error0">
 4 <c:import url="http://www.imooc.com"></c:import>
 5 </c:catch>
 6 <c:out value="${error0}"></c:out>
 7 <hr>
 8 <!-- 導入相對路徑文件 -->
 9 <c:catch var="error1">
10 <c:import url="Test.txt" charEncoding="gbk"></c:import>
11 </c:catch>
12 <c:out value="${error1}"></c:out>

Ps:由於可能網絡中斷導致拋出異常,所以常常把import標簽放在catch標簽里。

 1 <!-- var及scope用法 -->
 2 <c:catch var="error2">
 3 <c:import url="Test.txt" var="test" scope="session" charEncoding="gbk"></c:import>
 4 </c:catch>
 5 <c:out value="${error2}"></c:out><br>
 6 <c:out value="import標簽存儲的test字符串變量值:${sessionScope.test}"></c:out>
 7 
 8 <!-- context屬性用法 -->
 9 <c:catch var="error3">
10 <c:import url="/index1.jsp" context="/Test1"></c:import>
11 </c:catch>
12 <c:out value="${error3}"></c:out><br>

Ps1:如果沒定義var,則可以直接輸出;如果定義了var,則用c:out標簽輸出。
Ps2:第一步:改eclipse中tomcat的部署路徑,如果是灰掉的,停掉tomcat,然后clean,就可以改為第二項了(如果想在webapps生成,記得在Deploy path選擇webapps)。第二步:改conf/context.xml中加上crossContext="true"。如:<Context crossContext="true"></Context>

注意:

10、redirect標簽(URL操作標簽詳解)

redirect標簽的用法:

注意:重定向的話瀏覽器的url都變為重定向的url,而import只是載入,瀏覽器url不變。

例子:

重定向把參數值都帶到URL中去了:

獲取值:

11、url標簽(URL操作標簽)

<!-- url標簽用法 -->
<c:if test="${1<2}">
<c:set var="partUrl">temp.jsp</c:set>
</c:if>
<c:url value="http://localhost:8080/Test/${partUrl}" var="newUrl" scope="session"></c:url>
<a href="${newUrl}">New URL</a>

四、JSTL函數的使用

 

1、contains函數、startsWith、endsWith

contains函數表示加入的字符串是否包含字串,返回一個boolean類型的值。

 

 

 1 <!-- JSTL函數使用 -->
 2 <c:out value="“Hello World”字符串中是否包含“Hello”?${fn:contains('Hello World','Hello')}"></c:out>
 3 <hr>
 4 <c:out value="“Hello World”字符串中是否包含“ABCD”?${fn:contains('Hello World','ABCD')}"></c:out>
 5 <hr>
 6 <c:out value="“Hello World”字符串中是否包含“hello”(忽略大小寫)?${fn:containsIgnoreCase('Hello World','hello')}"></c:out>
 7 <hr>
 8 <c:out value="“Hello”是否在“Hello World”字符串開頭?${fn:startsWith('Hello World','Hello')}"></c:out>
 9 <hr>
10 <c:out value="“world”是否在“Hello World”字符串尾部?${fn:endsWith('Hello World','world')}"></c:out>

Ps1:配合使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

2、escapeXml、indexOf

 1 <!-- 不會輸出<book>標簽 -->
 2 <book></book>
 3 <hr>
 4 <!-- 可輸出標簽但會出現轉義問題 -->
 5 <c:out value="${fn:escapeXml('<book>書</book>')}"></c:out>
 6 <hr>
 7 <!-- 可輸出標簽且不會出現轉義問題 -->
 8 <c:out value="<book>書</book>"></c:out>
 9 <hr>
10 <!-- indexOf函數用法 -->
11 <c:out value="“Hello World”字符串“llo”出現的index值:${fn:indexOf('Hello World','llo')}"></c:out>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM