JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

Java3y發表於2019-02-21

什麼是JSTL

JSTL全稱為 JSP Standard Tag Library 即JSP標準標籤庫

JSTL作為最基本的標籤庫,提供了一系列的JSP標籤,實現了基本的功能:集合的遍歷、資料的輸出、字串的處理、資料的格式化等等!

為什麼要使用JSTL

  • EL表示式不夠完美,需要JSTL的支援!在JSP中,我們前面已經用到了EL表示式,體會到了EL表示式的強大功能:**使用EL表示式可以很方便地引用一些JavaBean以及其屬性,不會丟擲NullPointerException之類的錯誤!**但是,EL表示式非常有限,它不能遍歷集合,做邏輯的控制。這時,就需要JSTL的支援了
  • **Scriptlet的可讀性,維護性,重用性都十分差!**JSTL與HTML程式碼十分類似,遵循著XML標籤語法,使用JSTL讓JSP頁面顯得整潔,可讀性非常好,重用性非常高,可以完成複雜的功能!
  • 在JSP中不推薦使用scriptlet輸出,推薦使用JSP標籤。

使用JSTL標籤庫步驟:

  1. 匯入jstl.jar和standard.jar開發包
  2. 在JSP頁面中用tablib指令引入需要用到的JSTL標籤

core標籤庫

  • core標籤庫是JSTL的核心標籤庫,實現了最基本的功能:流程控制、迭代輸出等操作
  • core標籤庫的字首一般是c

c:out

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 簡單使用一下

	<%
	    session.setAttribute("name", "zhongfucheng");
	%>
	
	//<c:out/>標籤支援標籤體,default屬性上的資料可以寫在標籤體中
	//<c:out value="${name}" escapeXml="true">您要的資料找不著</c:out>

	<c:out value="${name}" default="您要的資料找不著" escapeXml="true"/>

	

複製程式碼
  • 我們發現上面的程式碼實現的效果和EL表示式是一樣的,**它出色的地方就多了兩個屬性,default和escapeXml屬性。**如果我們用到這兩個屬性,我們就使用該標籤,如果沒有用到這兩個屬性就用EL表示式就可以了。

c:set

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 該標籤有5個屬性,用起來有稍微有些複雜了!現在要記住的就是:var屬性操作的是Integer、Double、Float、String等型別的資料,target屬性操作的是JavaBean或Map物件的資料,scope代表的是Web域,value是值,property是物件的屬性

使用var屬性

  • 既然var屬性只能操作Integer、Double、String等型別,那麼存在var屬性就一定沒有property屬性(property代表的是物件的成員屬性,Integer、String這些型別哪來的成員變數呀)

  • 下面的程式碼流程是這樣的:建立了一個name的變數,設定的值為zhongfucheng,範圍是page


	<c:set var="name" value="fucheng" scope="page"/>
	
	${name}

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 當然了,set標籤也支援標籤體,value的值可以寫在標籤體裡邊

	<c:set var="name" scope="page">
	    zhongfucheng
	</c:set>

複製程式碼
  • 使用var屬性和scope屬性實現計數器


	<%--由於下面變數需要做加法運算,所以要定義出來,不然伺服器是不知道我的變數是Integer型別的--%>
	<%
	    Integer sessionCount = 0;
	    Integer applicationCount = 0;
	%>
	<c:set var="sessionCount" value="${sessionCount+1}" scope="session"/>
	
	<c:set var="applicationCount" value="${applicationCount+1}" scope="application"/>

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

使用target屬性

  • 使用target屬性與之配對的是property屬性,target屬性只能操作JavaBean或Map物件,property就是對應的成員變數或key了。
  • 既然target屬性操作的是JavaBean或Map物件,那麼一定是通過EL表示式來獲取到物件了。taget屬性如果獲取不到資料會丟擲異常!使用target屬性就一定沒有scope屬性(scope屬性代表的是儲存範圍,target的值都是獲取來的,難道你還能改變人家的範圍?)

	<%--建立出JavaBean物件,設定為session範圍的屬性--%>
	<jsp:useBean id="person" class="domain.Person" scope="session"/>
	
	<%--獲取到person物件,設定age屬性的值為32--%>
	<c:set target="${person}" property="age" value="32"/>
	
	${person.age}

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

c:remove

remove標籤就相當簡單了,只有var和scope屬性,代表的是刪除域範圍的屬性

  • 下面簡單來測試一下吧:

	<%--建立出JavaBean物件,設定為session範圍的屬性--%>
	<jsp:useBean id="person" class="domain.Person" scope="session"/>
	
	<%--獲取到person物件,設定age屬性的值為32--%>
	<c:set target="${person}" property="age" value="32"/>
	
	${person.age}
	<br>
	
	<%--刪除session屬性--%>
	<c:remove var="person" scope="session"></c:remove>
	${person.age==null?"存在session的person物件被刪除了!":"我還在呢!"}


複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

c:catch

該標籤主要用來處理程式中產生的異常。

catch標籤也十分簡單,只有一個var屬性,var屬性封裝了異常的資訊!


	<%--建立出JavaBean物件,設定為session範圍的屬性--%>
	<jsp:useBean id="person" class="domain.Person" scope="session"/>
	
	<c:catch var="message">
	
	    <%--target屬性只能是EL表示式,現在我是字串,獲取不到物件,肯定會丟擲異常的!--%>
	    <c:set target="person" property="age" value="32"/>
	
	</c:catch>
	
	${message}

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

c:if

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

JSTL提供了if標籤完成分支語句的實現,test屬性是不可或缺的

var和scope屬性我看來好像沒什麼用的(儲存執行結果有什麼用?)

  • 根據傳遞過來的引數的不同顯示不同的頁面!

	<%--如果帶過來的名字是zhongfucheng,那麼可以登陸--%>
	<c:if test="${param.name=='zhongfucheng'}">
	    使用者名稱:<input type="text" name="username"><br>
	    密碼:<input type="password" name="password"><br>
	    <input type="submit" value="登陸">
	</c:if>
	
	<%--如果帶過來的名字是ouzicheng,那麼就是註冊--%>
	<c:if test="${param.name=='ouzicheng'}">
	    使用者名稱:<input type="text" name="username"><br>
	    密碼:<input type="password" name="password"><br>
	    <input type="submit" value="註冊">
	</c:if>

複製程式碼
  • 注意位址列的引數!

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:choose

if標籤沒有else的功能,如果需要類似於java中的if else流程就需要使用choose標籤。

choose標籤需要聯合when和otherwise標籤一起使用!


	<c:choose>
	    <c:when test="${param.name=='zhongfucheng'}">
	        你好啊,zhongfucheng
	    </c:when>
	    <c:when test="${param.name=='ouzicheng'}">
	        你好啊,ouzicheng
	    </c:when>
	    <c:otherwise>
	        你是誰啊?別隨便過來!
	    </c:otherwise>
	</c:choose>

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:forEach

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

forEach為迴圈標籤,相當於Java中的while和for

  • 之前我們在使用EL表示式獲取到集合的資料,遍歷集合都是用scriptlet程式碼迴圈,現在我們學了forEach標籤就可以捨棄scriptlet程式碼了。

  • 向Session中設定屬性,屬性的型別是List集合


	<%
	    List list = new ArrayList<>();
	    list.add("zhongfucheng");
	    list.add("ouzicheng");
	    list.add("xiaoming");
	
	    session.setAttribute("list", list);
	%>

複製程式碼
  • 遍歷session屬性中的List集合,items:即將要迭代的集合。var:當前迭代到的元素

	<c:forEach  var="list" items="${list}" >
	    ${list}<br>
	</c:forEach>

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 遍歷Map物件有稍微地不一樣,我們來看一下,var屬性儲存的不是每個迭代的物件,而是Map.Entry。


	<%
	    Map map = new HashMap();
	    map.put("1", "zhongfucheng");
	    map.put("2", "xiaohong");
	    map.put("3", "xiaoming");
	
	    session.setAttribute("map",map);
	%>
	
	<c:forEach  var="me" items="${map}" >
	
	    ${me.key}  ${me.value}<br>
	
	</c:forEach>

複製程式碼

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • begin預設從0開始、end預設為集合的最後一個元素、step預設為1

  • varStatus代表著當前物件被迭代的資訊,它有以下的屬性

    • index【返回當前是第幾個物件,從0開始計數】
    • count【已經遍歷多少個物件了,從1開始計數】
    • first【是否是第一個】
    • last【是否是最後一個】
    • current【當前被迭代的物件】
    • begin【開始的位置】
    • end【最後的位置】
    • step【步長】

	<c:forEach  var="list" items="${list}" varStatus="varStatus" >
	
	    ${list}您的下標是:${varStatus.index}<br>
	
	</c:forEach>

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:forTokens

該標籤類似於String類的split()和for迴圈的一種集合

它與forEach標籤非常相似,都有begin、end、step、items、var、varStatus屬性,不同的是forTokens標籤的items屬性裡面是字串,這個字串會被delims屬性的內容分割成多個字串!


	<c:forTokens items="zhongfucheng,ouzicheng,xiaoming,xiaohong" var="name" delims="," >
	    ${name}
	</c:forTokens>

複製程式碼
  • 效果圖:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:import

import標籤類似於JSP行為<jsp:include/>和JSP指令<%include>

import標籤的屬性:

  1. url【指定要包含的路徑,Internet所有的url都可以】
  2. context【訪問同一個web容器的其他資源,以"/"開頭】
  3. var【儲存匯入的檔案的內容,以String型別儲存】
  4. socpe【儲存的範圍,預設是page】
  5. charEncoding【字元編碼】
  6. varReader【儲存匯入檔案的內容,以Reader型別儲存】

當然了,import標籤功能更加更大!強大在哪裡呢?import標籤可以引入Internet網頁上的內容,也就是說,csdn也可以引入進來!

  • 我們來用一下把!

	<c:import url="http://www.csdn.net" charEncoding="UTF-8" />

複製程式碼
  • 我們一看,是沒有樣式的

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 列印csdn的原始碼

	<c:import url="http://www.csdn.net" charEncoding="UTF-8" var="net"/>
	
	CSDN的原始碼是:<br><br><br><br><br>
	<c:out value="${net}" escapeXml="true"></c:out>

複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:param

  • 在JSP頁面進行URL的相關操作時,經常要在URL地址後面附加一些引數。<c:param>標籤可以巢狀在<c:import>、<c:url>或<c:redirect>標籤內,為這些標籤所使用的URL地址附加引數。

  • <c:param>標籤在為一個URL地址附加引數時,將自動對引數值進行URL編碼,例如,如果傳遞的引數值為“中國”,則將其轉換為“%d6%d0%b9%fa”後再附加到URL地址後面,這也就是使用<c:param>標籤的最大好處


c:url

url標籤十分實用!在瀏覽器禁用Cookie的時候,我們之前學Servlet時解決辦法是:response.encodeURL()。url標籤也可以實現這樣的功能,再配合param標籤使用,就十分實用了!

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 我們配合param標籤來使用一下吧

	<c:url value="2.jsp" var="url">
	    <c:param name="name" value="中國!">
	    </c:param>
	</c:url>
	
	<a href="${url}">我經過了URL地址重寫!</a>


複製程式碼
  • 效果:

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


c:redirect

redirect標籤用於實現Redirect功能,當然了,此標籤也能夠配合param標籤使用!

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】

  • 簡單使用一下,重定向到2.jsp,帶了一個引數

	<c:redirect url="2.jsp" >
	    <c:param name="name" value="zhongfucheng">
	    </c:param>
	</c:redirect>

複製程式碼
  • 在2.jsp中獲取到引數

JSP第五篇【JSTL的介紹、core標籤庫、fn方法庫、fmt標籤庫】


fmt標籤庫

fmt標籤庫也叫做國際化標籤庫。這裡就不詳細說明了,等我講到Web 國際化的時候才講吧!

fn方法庫

fn方法庫也叫做EL函式庫、fn標籤庫。這個在講解EL表示式的時候有詳細的說明,可轉移到我EL表示式的博文中

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

相關文章