什麼是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標籤庫步驟:
- 匯入jstl.jar和standard.jar開發包
- 在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
該標籤主要用來處理程式中產生的異常。
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}
複製程式碼
- 效果:
c:if
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>
複製程式碼
- 注意位址列的引數!
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標籤的屬性:
- url【指定要包含的路徑,Internet所有的url都可以】
- context【訪問同一個web容器的其他資源,以"/"開頭】
- var【儲存匯入的檔案的內容,以String型別儲存】
- socpe【儲存的範圍,預設是page】
- charEncoding【字元編碼】
- 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