JSTL (JSP Standard Tag Library ,JSP標準標籤庫)
JSTL標籤庫分爲5類:JSTL核心標籤庫、JSTL函數標籤庫、數據庫標籤庫、I18N格式化標籤庫、XML標籤庫。
JSTL的核心標籤庫主要包括:表達式操作、流程控制、迭代操作和URL操作。以下是JSTL常用標籤的用法總結:
一、表達式操作
1、<c:out>
作用:用於顯示數據的內容。
語法1:沒有本體內容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
語法2:有本體內容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>
屬性說明:
value:需要顯示出來的值。
default:如果value的值爲null時,則顯示default指定的值。
escapeXml:是否轉換特殊字符,默認爲true。即默認會將<、>、’、” 和 & 轉換爲 <、>、'、"和&。如果設爲false,則不進行轉換。
2、<c:set>
作用:用於將變量的值存儲在JSP範圍中或JavaBean的屬性中。
語法1:將value的值存儲在範圍爲scope的varName變量中
<c:set value="value" var="varName" [scope="{page|request|session|application}"] />
語法2:將本體內容的數據存儲在範圍爲scope的varName變量中
<c:set var="varName" [scope="{page|request|session|application}"] >
...本體內容
</c:set>
語法3:將value的值存儲在target對象的property屬性中
<c:set value="value" target="target" property="propertyName" />
語法4:將本體內容的數據存儲在target對象的property屬性中
<c:set target="target" property="propertyName">
...本體內容
</c:set>
屬性說明:
value:要被存儲的值。
var:欲存入的變量名稱。
scope:var變量的JSP範圍。默認爲page範圍。
target:爲一JavaBean或Map對象。
如果“target”是一個Map,“property”指定的是該Map的一個鍵;如果“target”是一個bean,“property”指定的 是該bean的一個成員字段。
如果“target”表達式爲null,容器會拋出一個異常。
如果“target”表達式不是一個Map或bean,容器會拋出一個異常。
如果“target”表達式是一個bean,但是這個bean沒有與“property”匹配的成員字段,容器會拋出一個異常。
property:指定的target對象的屬性。
3、<c:remove>
作用:移除變量。
語法:<c:remove var="varName" [scope="{page|request|session|application}"] />
屬性說明:
var:要移除的變量。
scope:var變量所在的JSP範圍,默認爲page範圍。
4、<c:catch>
作用:用於處理產生錯誤的異常情況,並將錯誤信息存儲起來。
語法: <c:catch [var="varName"] >
...欲抓取錯誤的部分
</c:catch>
屬性說明:
var:將錯誤信息存儲在指定的變量中,可以通過該變量獲取錯誤信息。
二、流程控制
1、<c:if>
作用:類似if判斷語句,用於表達式判斷。
語法1:沒有本體內容
<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>
屬性說明:
test:當該屬性中的表達式運算結果爲true,則會執行本體內容,爲false則不執行,該標籤必須要有test屬性。
var:存儲test的運算結果,爲true或false。
scope:var變量的JSP範圍。
2、<c:choose>、<c:when>、<c:otherwise>
作用:這三個標籤必須組合使用,用於流程控制。
範例:
<c:choose>
<c:when test="${condition1}">
condition1爲true
</c:when>
<c:when test="${ condition2}">
condition2爲true
</c:when>
<c:otherwise>
condition1和condition2都爲false
</c:otherwise>
</c:choose>
範例說明:當condition1爲true時,會顯示“condition1爲true”;當condition1爲false且condition2爲true時,會顯示“condition2爲true”,如果兩者都爲false,則會顯示“condition1和condition2都爲false”。
注意:若condition1和condition2的運算結果都爲true時,此時只會顯示"condition1爲true"。
限制說明:
a、<c:when>和<c:otherwise>標籤必須在<c:choose>和</c:choose>之間使用。
b、在同一個<c:choose>中,<c:otherwise>必須是最後一個標籤,且只能有一個<c:otherwise>標籤。<c:when>可以有多個。
c、在同一個<c:choose>中,當所有<c:when>的test都爲false時,才執行<c:otherwise>的本體內容。
三、迭代操作
1、<c:forEach>
作用:爲循環控制,它可以將集合(Collection)中的成員循序瀏覽一遍。運作方式爲當條件符合時,就會持續重複執行<c:forEach>的本體內容。
語法1:迭代一個集合對象中的所有成員
<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] />
...本體內容
</c:forEach>
語法2:迭代指定次數
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
...本體內容
</c:forEach>
屬性說明:
items:被迭代的集合對象。
var:存放當前指到的集合對象中的成員。
varStatus:存放當前指到的成員的相關信息。(index:當前指到的成員的索引;count:當前總共指到成員的總數;first:當前指到的成員 是否爲第一個成員;last:當前指到的成員是否爲最後一個成員)。
begin:迭代開始的位置,默認爲0。
end:迭代結束的位置,默認爲最後。
step:每次迭代的間隔數,默認爲1。
範例:
<%
int atts[] = {1,2,3,4,5,6,7,8,9,10};
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item" begin="0" end="9" step="1" >
${item}</br>
</c:forEach>
此標籤也可以用於普通的循環控制,與for循環一樣。如:
<c:forEach begin="1" end="10" var="item" >
${item}</br>
</c:forEach>
2、<c:forTokens>
作用:用指定分隔符分隔一字符串,並迭代分隔後的數組。
語法: <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"] >
本體內容
</c:forTokens>
屬性說明:
items:被分隔並迭代的字符串。
delims:用來分隔字符串的字符。
var:存放當前指到的成員。
varStatus:存放當前指到的成員的相關信息。(index:當前指到的成員的索引;count:當前總共指到成員的總數;first:當前指到的成員 是否爲第一個成員;last:當前指到的成員是否爲最後一個成員)。
begin:迭代開始的位置,默認爲0。
end:迭代結束的位置,默認爲最後。
step:每次迭代的間隔數,默認爲1。
範例1:
<c:forTokens items="A,B,C,D,E" delims="," var="item" >
${item}
</c:forTokens>
用“,”號分隔字符串,並迭代輸出分隔後的字符串數組,輸出結果爲“ABCDE”。
範例2:
<c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >
${item}
</c:forTokens>
delims中指定了三個分隔符“,”、“;”和“-”,可見我們一次可以設定所有想當做分隔字符串用的字符。輸出結果依然爲“ABCDE”。
四、URL操作
1、<c:import>
作用:將其他靜態或動態文件包含到本身JSP網頁中。不但可以包含同一個web application下的文件,還可以包含其他web application或其他網站的文件。
語法:
<c:import url="url" [var="varName"] [scope="{page|request|session|application}"] >
[<c:param name="paramName" value="paramValue"/>]
</c:import>
屬性說明:
url:要包含至本身JSP網頁的其他文件的URL。必選
var:將包含進來的其他文件以字符串的形式存放到指定的變量中。可選
scope:var變量的作用範圍。可選
<c:param>:可選子標籤,用於向包含進來的其他網頁文件傳遞參數。
範例:
<c:import url="http://java.sun.com" >
<c:param name="test" value="1234" />
</c:import>
說明:當<c:import>標籤中未指定var變量時,會直接將包含進來的其他網頁文件內容顯示出來,如果指定了var變量,則會將內容存放到var變量中,不顯示。
2、<c:url>
作用:生成一個URL。
語法:
<c:url value="url" [context="expression"] [var="name"] [scope="scope"]>
[<c:param name="expression" value="expression"/>]
</c:url>
範例1:
<a href="<c:url value=index.jsp'/>">index page</a>
在<a>超鏈接標籤中生成一個URL,指向index.jsp。
範例2:
<c:url value="index.jsp">
<c:param name="keyword" value="${searchTerm}"/>
<c:param name="month" value="02/2003"/>
</c:url>
生成一個URL,並傳遞參數,生成的結果爲index.jsp?keyword=*&month=02/2003,*代表傳遞的searchTerm的值。
3、<c:redirect>
作用:可以將客戶端的請求從一個JSP網頁導向到其他文件。
語法:
<c:redirect url="url">
[<param name="paramName" value="paramValue">]
</c:redirect>
將請求導向URl指向的其他文件。
五、I18N格式化標籤庫
使用I18N格式化標籤之前,需先插入以下指令:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
1、<fmt:formatNumber>
作用:將數字格式化成數字、貨幣、百分比
語法:
<fmt:formatNumber value="value" [var="varName"] [type="{number|curreny|percent}"] [maxFractionDigits="3"] [groupingUsed="{true|false}"]/>
屬性說明:
value:需要進行格式化的值
var:值的另一個變量聲明
maxFractionDigits:保留的小數點個數
2、<fmt:parseNumber>
作用:將字符串型的數字、貨幣、百分比格式化成數字
語法:
<fmt:parseNumber value="¥6789.36" [var="result"] [type="{number|curreny|percent}"] >
屬性說明:
value:需要進行格式化的值
var:值的另一個變量聲明
3、<fmt:formatDate>
作用:格式化時間和日期
4、<fmt:parseDate>
作用:將字符串形式的時間和日期轉換成日期時間類型。
5、<fmt:setTimeZone>
作用:在JSP 網頁中設置默認時區。
6、<fmt:timeZone>
作用:在JSP網頁中爲該標籤體內的代碼段設置時區。
7、<fmt:setLocale>
作用:在JSP 網頁中設置語言地區。
8、<fmt:requestEncoding>
作用:在JSP 網頁中設置請求所採用的編碼方式,等價於JSP中的request. setCharacterEncoding(String encoding)。
9、<fmt:setBundle>
作用:設置默認的消息資源。
10、<fmt:message>
作用:在指定的消息資源中按關鍵字取出相應的消息內容。
11、<fmt:param>
作用:在從消息資源中取出消息內容時,爲消息內容設置動態參數。
12、<fmt:bundle>
作用:爲該標籤體內的代碼段設置一個消息資源。
二、常見錯誤
應用部署運行的時候出現JSP異常, 發生在使用JSTL庫的時候: According to TLD or attribute directive in tag file, attribute value does not accept any expressions, 可能是因爲使用了JSP2.0版本, 同時又沒有使用JSTL core庫的備用版本(RT庫), 以下有兩種處理方法:
1. 如果不想使用web-app_2_4.xsd 和jstl1.1 那麼可以按照下面兩種方式修改
1). 修改web.xml.
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
改爲2.3版本的
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
2). 使用JSTL core RT庫
JSTL core庫的有兩種taglib僞指令, 其中RT庫即是依賴於JSP傳統的請求時屬性值, 而不是依賴於EL來實現(稱爲EL庫.JSP2.0將支持EL)
JSP中使用<%@ taglib uri=http://java.sun.com/jstl/core prefix="c"%>在2.3版本都可以,在2.4就不行了, 這是版本不兼容引起的,稍後將介紹servlet的版本。
只要將
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
改爲
<%@ taglib uri=http://java.sun.com/jstl/core_rt prefix="c"%>
2:如果要使用jstl1.1(推薦) 則按照一下修改,很簡單的。
jstl存在1.0和1.1的差異問題,用EL建議需要在1.1的版本下,
使用jstl1.1 只需要將
1.0的爲
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
換成:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
三、EL表達式
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@ page import="com.cos.User,java.util.*" %>
- <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <body>
- <%
- Map<User,String[]> map = new HashMap<User,String[]>();
- String temp[] = new String[2];
- User user1 = new User();
- user1.setName("zhangsan");
- user1.setAge(20);
- temp[0] = "1";
- temp[1] = "111111";
- map.put(user1, temp);
- User user2 = new User();
- user2.setName("lisi");
- user2.setAge(22);
- temp = new String[2];
- temp[0] = "2";
- temp[1] = "2222222";
- map.put(user2, temp);
- request.setAttribute("m",map);
- %>
- <c:forEach items="${m}" var="user">
- <tr>
- <td>${user.key.name}</td>
- <td>${user.key.age}</td>
- <td>${user.value[0]}</td>
- <td>${user.value[1]}</td>
- </tr>
- <br>
- </c:forEach>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@ page import="com.cos.User,java.util.*" %>
- <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <body>
- <%
- request.setAttribute("m",null);
- request.setAttribute("mm","bbb");
- %>
- <c:out value="${m}" default="nnnnnn"/><br>
- <c:out value="${mm}" default="nnnnnnlllllll"/><br>
- <c:set value="hello word." var="cset" scope="page"/>
- ${cset}<br>
- <c:if test="true" var="t">
- is true
- </c:if>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@ page import="com.cos.User,java.util.*" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
- <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <body>
- <fmt:formatNumber value="6789.3581" var="result" type="currency" maxFractionDigits="3" groupingUsed="true"/>
- 人民幣6789.3581格式化的結果爲(保留3位小數):
- <c:out value="${result}"/><br><br>
- <fmt:formatNumber value="3.1415926" var="result" maxFractionDigits="2" groupingUsed="false"/>
- 3.1415926保留兩位小數格式化的結果爲:
- <c:out value="${result}"/><br><br>
- <fmt:formatNumber value="0.653789" type="percent" var="result" maxFractionDigits="2" groupingUsed="false"/>
- 0.653789按百分比式化的結果爲:
- <c:out value="${result}"/><br><br>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%@ page import="com.cos.User,java.util.*" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
- <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <body>
- <fmt:parseNumber value="¥6789.36" var="result" type="currency"/>
- "¥6789.36"轉換爲數字的結果爲:<c:out value="${result}"/><br>
- <fmt:parseNumber value="3.1415926圓周率" var="result"/>
- "3.1415926圓周率"轉換爲數字的結果爲:<c:out value="${result}"/><br>
- <fmt:parseNumber value="78.90%" type="percent" var="result"/>
- "78.90%"轉換爲數字的結果爲:<c:out value="${result}"/><br>
- </body>
- </html>