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

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

什麼是JSTL

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

JSTL做爲最基本的標籤庫,提供了一系列的JSP標籤,實現了基本的功能:集合的遍歷、數據的輸出、字符串的處理、數據的格式化等等!web

爲何要使用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

 

 

  • 簡單使用一下
<%
	    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

 

 

  • 該標籤有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}
  • 效果:

 

 

  • 固然了,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"/>
  • 效果:

 

 

使用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}
  • 效果:

 

 

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對象被刪除了!":"我還在呢!"}
  • 效果:

 

 

c:catch

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

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

<%--建立出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}
  • 效果:

 

 

c:if

 

 

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

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

  • 根據傳遞過來的參數的不一樣顯示不一樣的頁面!


 

<%--若是帶過來的名字是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>
  • 注意地址欄的參數!

 

 

 

 

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>
  • 效果:

 

 

 

 

c:forEach

 

 

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>
  • 效果:

 

 

  • 遍歷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>

 

 

  • 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>
  • 效果:

 

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>
  • 效果圖:

 

 

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" />
  • 咱們一看,是沒有樣式的

 

 

  • 打印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>
  • 效果:

 

 

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標籤使用,就十分實用了!

 

 

  • 咱們配合param標籤來使用一下吧
<c:url value="2.jsp" var="url">
	    <c:param name="name" value="中國!">
	    </c:param>
	</c:url>
	
	<a href="${url}">我通過了URL地址重寫!</a>
  • 效果:

 

 

c:redirect

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

 

 

  • 簡單使用一下,重定向到2.jsp,帶了一個參數
<c:redirect url="2.jsp" >
	    <c:param name="name" value="zhongfucheng">
	    </c:param>
	</c:redirect>
  • 在2.jsp中獲取到參數

 

fmt標籤庫

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

fn方法庫

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

若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y

相關文章
相關標籤/搜索