Java Server Pages Standard Tag Libray(JSTL):JSP 標準標籤庫,是一個定製標籤類庫的集合,用於解決一些常見的問題,例如迭代一個映射或者集合、條件測試、XML 處理,甚至數據庫和訪問數據庫操做等。java
咱們如今只討論 JSTL 中最重要的標籤,迭代集合以及格式化數字和日期幾個標籤。數據庫
核心標籤庫:apache
http://java.sun.com/jsp/jstl/core 數組
包含 Web 應用的常見工做,好比:循環、表達式賦值、基本輸入輸出等。session
格式化標籤庫:app
http://java.sun.com/jsp/jstl/fmt jsp
用來格式化顯示數據的工做,好比:對不一樣區域的日期格式化等。ide
爲了在 JSP 頁面使用 JSTL 類庫,必須如下列格式使用 taglib 指令:測試
<%@taglib uri="" prefix="" %>
例如:設計
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
前綴能夠是任意內容,遵循規範可使團隊中由不一樣人員編寫的代碼更加類似;因此,建議使用事先設計好的前綴。
此時須要導入兩個jar 包
從Apache的標準標籤庫中下載的二進包(jakarta-taglibs-standard-current.zip)。
官方下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下載 jakarta-taglibs-standard-1.1.2.zip 包並解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩個 jar 文件:standard.jar 和 jstl.jar 文件拷貝到項目的指定目錄下。
條件動做指令用於處理頁面的輸出結果依賴於某些輸入值的狀況,在 Java 中是利用 if、 if…else 和 switch 語句來進行處理的。在 JSTL 中也有 4 個標籤能夠執行條件式動做指令:if、 choose、when 和 otherwise。
if 標籤先對某個條件進行測試,若是該條件運算結果爲 true, 則處理它的主體內容,測試結果保存在一個 Boolean 對象中,並建立一個限域變量來引用 Boolean 對象。能夠利用 var 屬性設置限域變量名,利用 scope 屬性來指定其做用範圍。
<c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if>
if 標籤有以下屬性:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
test | 條件 | 是 | 無 |
var | 用於存儲條件結果的變量(限域變量名) | 否 | 無 |
scope | var屬性的做用域<br />可取值:page|request|session|application | 否 | page |
<% request.setAttribute("flag",true); request.setAttribute("num",1); %> <c:if test="${flag}"> <p>結果爲true<p> </c:if> <c:if test="${num > 0}"> <p>num的值比0大<p> </c:if>
注:<font color="red"> JSTL中沒有else標籤</font>,爲了模擬 else 的情景,須要使用兩個 if 標籤,而且這兩個標籤爲相反的條件。
choose 和 when 標籤的做用與 Java 中的 switch 和 case 關鍵字類似,用於在衆多選項中作出選擇。也就是說:他們爲相互排斥的條件式執行提供相關內容。
switch語句中有case,而choose標籤中對應有when,switch語句中有default,而choose標籤中有otherwise。
<c:choose> <c:when test="<boolean>"> ... </c:when> <c:when test="<boolean>"> ... </c:when> ... ... <c:otherwise> ... </c:otherwise> </c:choose>
<% request.setAttribute("score", 90); %> <c:choose> <c:when test="${score < 60 }"> <h3>你個小渣渣!</h3> </c:when> <c:when test="${score >= 60 && score < 80 }"> <h3>革命還沒有成功,同志仍需努力!</h3> </c:when> <c:otherwise> <h3>你很棒棒哦!</h3> </c:otherwise> </c:choose>
forEach 是將一個主體內容迭代屢次,或者迭代一個對象集合。能夠迭代的對象包括全部的 java.util.Collection 和 java.util.Map 接口的實現,以及對象或者基本類型的數組。他還可 以迭代 java.util.Iterator 和 java.util.Enumeration,但不能在多個動做指令中使用 Iterator 或者 Enumeration,由於 Iterator 或者 Enumeration 都不能重置(reset)。 各屬性含義以下:
<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> </c:forEach>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
items | 要被循環的數據 | 否 | 無 |
begin | 開始的元素(0=第一個元素,1=第二個元素) | 否 | 0 |
end | 最後一個元素(0=第一個元素,1=第二個元素) | 否 | Last element |
step | 每一次迭代的步長 | 否 | 1 |
var | 表明當前條目的變量名稱 | 否 | 無 |
varStatus | 表明循環狀態的變量名稱 | 否 | 無 |
forEach varStatus 屬性
1.遍歷主體內容屢次
<c:forEach begin="開始數" end="結束數" step="迭代數" var="限域變量名"> </c:forEach> 至關於java的for循環: for(int i = 0; i < 10; i++) { }
以下:
<!-- 遍歷主體內容屢次 --> <c:forEach begin="0" end="10" var="i" > 標題${i }<br> </c:forEach>
2.循環
<c:forEach items="被循環的集合" var="限域變量名" varStatus="當前成員對象的相關信息"> </c:forEach> 至關於java的foreach循環: for(String str : list) { }
以下:
<% List<String> list = new ArrayList<String>(); for (int i = 1; i <= 10; i++) { list.add("A:" + i); } pageContext.setAttribute("li", list); %> <!-- 循環集合 --> <c:forEach items="${li }" var="item"> ${item } </c:forEach> <hr> <table align="center" width="800" border="1" style="border-collapse: collapse;"> <tr> <th>名稱</th> <th>當前成員下標</th> <th>當前成員循環數</th> <th>是否第一次被循環</th> <th>是否最後一次被循環</th> </tr> <c:forEach items="${li }" var="item" varStatus="itemp"> <tr> <td>${item }</td> <td>${itemp.index }</td> <td>${itemp.count }</td> <td>${itemp.first }</td> <td>${itemp.last }</td> </tr> </c:forEach> </table> <!-- 循環對象集合 --> <% List<User> userList = new ArrayList<User>(); User user = new User(1,"zhangsan","123456"); User user2 = new User(2,"lisi","123321"); User user3 = new User(3,"wangwu","654321"); userList.add(user); userList.add(user2); userList.add(user3); // 將數據設置到做用域中 request.setAttribute("userList", userList); %> <c:if test="${!empty userList }"> <table align="center" width="800" border="1" style="border-collapse: collapse;"> <tr> <th>用戶編號</th> <th>用戶名稱</th> <th>用戶密碼</th> <th>用戶操做</th> </tr> <c:forEach items="${userList }" var="user"> <tr align="center"> <td>${user.userId }</td> <td>${user.uname }</td> <td>${user.upwd }</td> <td> <button>修改</button> <button>刪除</button> </td> </tr> </c:forEach> </table> </c:if> <!-- 遍歷Map --> <% Map<String,Object> map = new HashMap<String,Object>(); map.put("map1", "aaa"); map.put("map2", "bbb"); map.put("map3", "ccc"); pageContext.setAttribute("map", map); %> <c:forEach items="${map }" var="mymap"> 鍵:${mymap.key }-值:${mymap.value } <br> </c:forEach>
JSTL 提供了格式化和解析數字和日期的標籤,咱們討論裏面有:formatNumber、formatDate、parseNumber及parseDate。
formatNumber標籤用於格式化數字,百分比,貨幣。該標籤用指定的格式或精度來格式化數字。(將數值型數據轉換成指定格式的字符串類型。)
<fmt:formatNumber value="<string>" type="<string>" var="<string>" scope="<string>"/>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的數字 | 是 | 無 |
type | NUMBER,CURRENCY,或 PERCENT類型 | 否 | Number |
var | 存儲格式化數字的變量 | 否 | Print to page |
scope | var屬性的做用域 | 否 | page |
注意:
<fmt:formatNumber value="10" type="number" var="num" /> ${num } <br> <fmt:formatNumber value="10" type="percent" /> <br> <fmt:formatNumber value="10" type="currency" /> <br> <!-- 設置時區 --> <fmt:setLocale value="en_US"/> <fmt:formatNumber value="10" type="currency" /> <br>
formatDate標籤用於使用不一樣的方式格式化日期。(將Date型數據轉換成指定格式的字符串類型。)
<fmt:formatDate value="<string>" type="<string>" dateStyle="<string>" timeStyle="<string>" pattern="<string>" timeZone="<string>" var="<string>" scope="<string>"/>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的日期 | 是 | 無 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定義格式模式 | 否 | 無 |
timeZone | 顯示日期的時區 | 否 | 默認時區 |
var | 存儲格式化日期的變量名 | 否 | 顯示在頁面 |
scope | 存儲格式化日誌變量的範圍 | 否 | 頁面 |
標籤格式模式
代碼 | 描述 | 實例 |
---|---|---|
y | 不包含紀元的年份。若是不包含紀元的年份小於 10,則顯示不具備前導零的年份。 | 2002 |
M | 月份數字。一位數的月份沒有前導零。 | April & 04 |
d | 月中的某一天。一位數的日期沒有前導零。 | 20 |
h | 12 小時制的小時。一位數的小時數沒有前導零。 | 12 |
H | 24 小時制的小時。一位數的小時數沒有前導零。 | 0 |
m | 分鐘。一位數的分鐘數沒有前導零。 | 45 |
s | 秒。一位數的秒數沒有前導零。 | 52 |
<% request.setAttribute("myDate", new Date()); %> ${myDate } <br/> <fmt:formatDate value="${myDate }" /><br/> <fmt:formatDate value="${myDate }" type="date"/><br/> <fmt:formatDate value="${myDate }" type="time"/><br/> <fmt:formatDate value="${myDate }" type="both"/><br/> <fmt:formatDate value="${myDate }" type="both" dateStyle="full"/><br/> <fmt:formatDate value="${myDate }" type="both" dateStyle="long"/><br/> <fmt:formatDate value="${myDate }" type="both" dateStyle="short"/><br/> <fmt:formatDate value="${myDate }" type="both" timeStyle="full"/><br/> <fmt:formatDate value="${myDate }" type="both" timeStyle="long"/><br/> <fmt:formatDate value="${myDate }" pattern="HH:mm yyyy/MM/dd"/><br/>
parseNumber標籤用來解析數字,百分數,貨幣。(parseNumber 標籤能夠將數字、貨幣或百分比類型的字符串轉換成數值型。)
<fmt:parseNumber value="<string>" type="<string>" var="<string>" scope="<string>"/>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要解析的數字 | 否 | Body |
type | NUMBER,,CURRENCY,或 PERCENT | 否 | number |
var | 存儲待解析數字的變量 | 否 | Print to page |
scope | var屬性的做用域 | 否 | page |
<fmt:parseNumber value="100" /> <br> <fmt:parseNumber value="100" type="number" /> <br> <fmt:parseNumber value="100%" type="percent" /> <br> <fmt:parseNumber value="¥10.00" type="currency" /> <br>
parseDate標籤用於解析日期。(將指定格式的字符串轉換成Date類型。)
<fmt:parseDate value="<string>" type="<string>" dateStyle="<string>" timeStyle="<string>" pattern="<string>" var="<string>" scope="<string>"/>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的日期 | 是 | 無 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定義格式模式 | 否 | 無 |
var | 存儲格式化日期的變量名 | 否 | 顯示在頁面 |
scope | 存儲格式化日誌變量的範圍 | 否 | 頁面 |
<fmt:parseDate value="2020-01-06" type="date" /> <br> <fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" /> <br>