JSTL的核心標籤庫標籤共13個,使用這些標籤可以完成JSP頁面的基本功能,減小編碼工做。
html
從功能上能夠分爲4類:表達式控制標籤、流程控制標籤、循環標籤、URL操做標籤。
(1)表達式控制標籤:out標籤、set標籤、remove標籤、catch標籤。
(2)流程控制標籤:if標籤、choose標籤、when標籤、otherwise標籤。
(3)循環標籤:forEach標籤、forTokens標籤。
(4)URL操做標籤:import標籤、url標籤、redirect標籤、param標籤。
在JSP頁面引入核心標籤庫的代碼爲:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
或者
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
如下將對幾個主要的經常使用的標籤用法做一個彙總:參考網友的一些文章
out標籤、set標籤、remove標籤、catch標籤。
if標籤、choose標籤、when標籤、
forEach標籤、
其餘的標籤不做彙總!
<c:out>標籤主要是用來輸出數據對象(字符串、表達式)的內容或結果。
使用Java腳本輸出時常使用的方式爲: <% out.println(「字符串」)%> 或者 <%=表達式%> ,
爲了不暴露邏輯代碼會盡可能減小頁面中的Java腳本,使用<c:out>標籤就能夠實現以上功能。
1 <c:out value=」字符串」>
2 <c:out value=」EL表達式」>
JSTL的使用是和EL表達式分不開的,EL表達式雖然能夠直接將結果返回給頁面,但有時獲得的結果爲空,<c:out>有特定的結果處理功能,EL的單獨使用會下降程序的易讀性,建議把EL的結果輸入放入<c:out>標籤中。
<c:out>標籤的使用有兩種語法格式:
【語法1】:<c:out value=」要顯示的數據對象」 [escapeXml=」true|false」] [default=」默認值」]/>
【語法2】:<c:out value=」要顯示的數據對象」 [escapeXml=」true|false」]>默認值</c:out>
這兩種方式沒有本質的區別,只是格式上的差異。[escapeXml=」true|false」] [default=」默認值」]
這些使用[]屬性表示是否是必須的。
首先在頁面頭引入
<%--引入JSTL核心標籤庫 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
如今要改引用,能打印出空值,不然${null}報錯
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<!--引入fn函數庫-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page language="java" import="java.util.*"%>
代碼:
<ul>
<%-- 直接輸出一個字符--%>
<li>(1)<c:out value="jstl的out標籤的使用"/></li>
<li>(2)<c:out value="<a href='http://www.cnblogs.com/'>點擊</a>"></c:out></li>
<%--escapeXml="false"表示value值中的html標籤不進行轉義,而是直接輸出 --%>
<li>(3)
<c:out value="<a href='http://www.cnblogs.com/'>點擊</a>" escapeXml="false"/>
</li>
<%--(4)字符串中有轉義字符,但在默認狀況下沒有轉換。 --%>
<li>(4)<c:out value="<未使用字符轉義>" /></li>
<%--(5)使用了轉義字符<和>分別轉換成<和>符號。 --%>
<li>(5)<c:out value="<使用字符轉義>" escapeXml="false"></c:out></li>
<%--(6)設定了默認值,從EL表達式${null}獲得空值,因此直接輸出設定的默認值。 --%>
<li>(6)<c:out value="${data}">使用了默認值</c:out></li>
<%--(7)未設定默認值,輸出結果爲空。 --%>
<li>(7)<c:out value="${null}"></c:out></li>
<%--(8)設定了默認值,從EL表達式${null}獲得空值,因此直接輸出設定的默認值。 --%>
<li>(8)<c:out value="${null}" default="默認值"/></li>
<%--(9)未設定默認值,輸出結果爲空。 --%>
<li>(9)<c:out value="${null}"/></li>
</ul>
<c:set>標籤用於把某一個對象存在指定的域範圍內,或者將某一個對象存儲到Map或者JavaBean對象中。
<c:set>標籤的編寫共有4種語法格式。
語法1:存值,把一個值放在指定的域範圍內。
<c:set value=」值1」 var=」name1」 [scope=」page|request|session|application」]/>
含義:把一個變量名爲name1值爲「值1」的變量存儲在指定的scope範圍內。
語法2:
<c:set var=」name2」 [scope=」page|request|session|application」]>
值2
</c:set>
含義:把一個變量名爲name2,值爲值2的變量存儲在指定的scope範圍內。
語法3:
<c:set value=」值3」 target=」JavaBean對象」 property=」屬性名」/>
含義:把一個值爲「值3」賦值給指定的JavaBean的屬性名。至關與setter()方法。
語法4:
<c:set target=」JavaBean對象」 property=」屬性名」>
值4
</c:set>
含義:把一個值4賦值給指定的JavaBean的屬性名。
從功能上分語法1和語法二、語法3和語法4的效果是同樣的,只是把value值放置的位置不一樣,至於使用那個根據我的的喜好,語法1和語法2是向scope範圍內存儲一個值,語法3和語法4是給指定的JavaBean賦值。
要引入javaBean 包中的類 元素
<%@ page import="com.dd.Person.*" %>
而後實例化
<% Person person=new Person();>
//經過jsp:標籤實體化 javaBean
<jsp:useBean id="person" class="com.dd.Person" />
<c:set target="${person}" property="user" value="pp" />
以上二句,配套
代碼:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>JSTL: --表達式控制標籤「set」標籤的使用</title>
</head>
<body>
<h3>代碼給出了給指定scope範圍賦值的示例。</h3>
<ul>
<%--經過<c:set>標籤將data1的值放入page範圍中。--%>
<li>把一個值放入page域中:
<c:set var="data1" value="xdp" scope="page" />
</li>
<%--使用EL表達式從pageScope獲得data1的值。--%>
<li>從page域中獲得值:${pageScope.data1}</li>
<%--經過<c:set>標籤將data2的值放入request範圍中。--%>
<li>把一個值放入request域中:
<c:set var="data2" value="getreq" scope="request" />
</li>
<%--使用EL表達式從request獲得data2的值。--%>
<li>從request域中獲得值:${requestScope.data2}</li>
<%--經過<c:set>標籤將data2的值放入session範圍中。--%>
<li>把一個值放入session域中:
<c:set var="data3" value="getreq" scope="session" />
</li>
<%--使用EL表達式從session獲得data3的值。--%>
<li>從request域中獲得值:${sessionScope.data3}</li>
<%--不指定範圍使用EL自動查找獲得值 --%>
<li>未指定scope的範圍,會從不一樣的範圍內查找獲得相應的值: ${data1},${data2},${data3}
</li>
</ul>
<hr/>
<h3>使用Java腳本實現以上功能</h3>
<ul>
<li>把一個值放入page域中。
<%pageContext.setAttribute("data3","xdp");%>
</li>
<li>從page域中獲得值:
<%out.println(pageContext.getAttribute("data3"));%>
</li>
<li>把一個值放入request域中。
<%request.setAttribute("data2","gacl");%>
</li>
<li>從request域中獲得值:
<%out.println(request.getAttribute("data2"));%>
</li>
<li>把一個值放入session域中。
<%session.setAttribute("name1","uy");%>
</li>
<li>從session中域獲得值:
<%out.println(session.getAttribute("name1"));%>
</li>
<%--out.println()方法與<%=%>表達式輸出功能同樣 --%>
<%-- 但使用表達式輸出(<%=%>)明顯要比使用out.println()輸出更好。 --%>
<li>
<%=session.getAttribute("name1") %>
</li>
<li>未指定scope的範圍,會從不一樣的範圍內查找獲得相應的值:
<%=pageContext.findAttribute("data1")%>、
<%=pageContext.findAttribute("data2")%>、
<%=pageContext.findAttribute("name1")%>、
<%=pageContext.findAttribute("name2")%>
</li>
</ul>
<hr/>
<h3>操做JavaBean,設置JavaBean的屬性值</h3>
<%--設置JavaBean的屬性值,等同與setter方法,Target指向實例化後的對象,property指向要插入值的參數名。
注意:使用target時必定要指向實例化後的JavaBean對象,也就是要跟配套使用,
也能夠java腳本實例化,但這就失去了是用標籤的本質意義。
使用Java腳本實例化:--%>
<jsp:useBean id="person" class="com.dd.Person" />
<%--@page import="com.dd.Person.*" --%>
<%-- Person person=new Person();--%>
<c:set target="${person}" property="user" value="pp" />
<h4>從Bean中得到的name值爲:<c:out value="${person.user}"></c:out></h4>
<h3>操做Map</h3>
<%
Map map = new HashMap();
request.setAttribute("map",map);
%>
<%--將data對象的值存儲到map集合中 --%>
<c:set property="data" value="gacl" target="${map}" /> ${map.data}
</body>
<c:remove>標籤主要用來從指定的JSP範圍內移除指定的變量。
<c:remove var=」變量名」 [scope=」page|request|session|application」]/>
其中var屬性是必須的,scope能夠以省略。
<c:set var="name" scope="session">fdas</c:set>
<%--使用remove標籤移除age變量 --%>
<c:remove var="name"/>
<c:out value="${sessionScope.name}"/>
<c:catch>標籤用於捕獲嵌套在標籤體中的內容拋出的異常。
其語法格式以下:<c:catch [var="varName"]>容易產生異常的代碼</c:catch>
var屬性用於標識<c:catch>標籤捕獲的異常對象,它將保存在page這個Web域中。
<%--把容易產生異常的代碼放在<c:catch></c:catch>中,
自定義一個變量error1用於存儲異常信息 --%>
<c:catch var="error1">
<%--實現了一段異常代碼,向一個不存在的JavaBean中插入一個值--%>
<c:set target="person" property="hao"></c:set>
</c:catch>
<%--用EL表達式獲得error1的值,並使用<c:out>標籤輸出 --%>
異常:<c:out value="${error1}" /><br />
異常 errorInfo.getMessage:<c:out value="${error1.message}" /><br />
<c:if>標籤和程序中的if語句做用相同,用來實現條件控制。
【語法1】:沒有標籤體內容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
【語法2】:有標籤體內容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
標籤體內容
</c:if>
【參數說明】:
(1)test屬性用於存放判斷的條件,通常使用EL表達式來編寫。
(2)var屬性用來存放判斷的結果,類型爲true或false。
(3)scopes屬性用來指定var屬性存放的範圍。
<hr />
<form action="tag.jsp" method="post">
<input type="text" name="uname" value="${param.uname}" />
<input type="submit" value="登陸" />
</form>
<%--使用if標籤進行判斷並把檢驗後的結果賦給adminchock,存儲在默認的page範圍中。 --%>
<c:if test="${param.uname=='admin'}" var="adminchock">
<%--能夠把adminchock的屬性範圍設置爲session,這樣就能夠在其餘的頁面中獲得adminchock 的值,
使用<c:if text=」${adminchock}」><c:if>判斷,實現不一樣的權限。
${param.uname}最後發現,須要查一下:
EL表達式中的${param.name} 等價於 request.getParamter("name"),
這兩種方法通常用於服務器從頁面或者客戶端獲取的內容
--%>
<c:out value="管理員歡迎您!"/>
</c:if>
<%--使用EL表達式獲得adminchock的值,若是輸入的用戶名爲admin將顯示true。 --%>
${adminchock}
<c:choose>、<c:when>和<c:otherwise>這3個標籤一般狀況下是一塊兒使用的,<c:choose>標籤做爲<c:when>和<c:otherwise>標籤的父標籤來使用。
使用<c:choose>,<c:when>和<c:otherwise>三個標籤,能夠構造相似 「if-else if-else」 的複雜條件判斷結構。
<c:choose>
<c:when test="條件1">
//業務邏輯1
<c:when>
<c:when test="條件2">
//業務邏輯2
<c:when>
<c:when test="條件n">
//業務邏輯n
<c:when>
<c:otherwise>
//業務邏輯
</c:otherwise>
</c:choose>
<%--經過set標籤設定score的值爲85 --%>
<c:set var="score" value="85"/>
<c:choose>
<%--使用<c:when>進行條件判斷。
若是大於等於90,輸出「您的成績爲優秀」;
若是大於等於70小於90,輸出「您的成績爲良好」;
大於等於60小於70,輸出「您的成績爲及格」;
其餘(otherwise)輸出「對不起,您沒能經過考試」。
--%>
<c:when test="${score>=90}">
你的成績爲優秀!
</c:when>
<c:when test="${score>70 && score<90}">
您的成績爲良好!
</c:when>
<c:when test="${score>60 && score<70}">
您的成績爲及格
</c:when>
<c:otherwise>
對不起,您沒有經過考試!
</c:otherwise>
</c:choose>
該標籤根據循環條件遍歷集合(Collection)中的元素。
<c:forEach
var=」name」
items=」Collection」
varStatus=」StatusName」
begin=」begin」
end=」end」
step=」step」>
本體內容
</c:forEach>
【參數解析】:
(1)var設定變量名用於存儲從集合中取出元素。
(2)items指定要遍歷的集合。
(3)varStatus設定變量名,該變量用於存放集合中元素的信息。
(4)begin、end用於指定遍歷的起始位置和終止位置(可選)。
(5)step指定循環的步長。
其中varStatus有4個狀態屬性,以下表所示:
要在頁面引入
<%@page import="java.util.*"%>
<h4/>
<c:out="foreach實例"/>
<%
List<String> list=new ArrayList<>();
list.add('ss');
list.add('ss');
list.add('ss');
list.add('ss');
list.add('ss');
request.setAttribute("list",list);
%>
<br/>
<c:out value="不指定begin和end的迭代:"/>
<%--不使用begin和end的迭代,從集合的第一個元素開始,遍歷到最後一個元素。 --%>
<c:forEach var="fa" items="${list}">
<c:out value="${fa}"/>
</c:forEach>
<c:out value="指定begin和end的迭代:"/>
<%--
指定begin的值爲一、end的值爲三、step的值爲2,
從第二個開始首先獲得晶晶,每兩個遍歷一次,
則下一個顯示的結果爲瑩瑩,end爲3則遍歷結束。
--%>
<c:forEach var="fa" items="${list}" begin="1" end="3" step="2">
<c:out value="${fa}"/>
</c:forEach>
<B><c:out value="輸出整個迭代的信息:" /></B><br>
<%--指定varStatus的屬性名爲s,並取出存儲的狀態信息 --%>
<c:forEach var="fa" items="${list}" begin="3" end="4"
VarStatus="s" step="1">
<c:out value="${fa}">四種屬性</c:out>
所在位置,即索引:<c:out value="${s.index}" /><br>
總共已迭代的次數:<c:out value="${s.count}" /><br>
是否爲第一個位置:<c:out value="${s.first}" /><br>
是否爲最後一個位置:<c:out value="${s.last}" /><br>
</c:forEach>