Jstl之核心標簽庫與格式標簽庫使用
JSTL(JSP Standard Tag Library。JSP標準標簽庫)是一個不斷完好的開放源碼的JSP標簽庫。是由apache的jakarta小組來維護的。JSTL僅僅能運行在支持JSP1.2和Servlet2.3規範的容器上,如tomcat 4.x。在JSP 2.0中也是作為標準支持的。
JSTL 1.0 公布於 2002 年 6 月,由四個定制標記庫(core、format、xml 和 sql)和一對通用標記庫驗證器(ScriptFreeTLV 和 PermittedTaglibsTLV)組成。core 標記庫提供了定制操作,通過限制了作用域的變量管理數據,以及運行頁面內容的叠代和條件操作。它還提供了用來生成和操作 URL 的標記。顧名思義,format 標記庫定義了用來格式化數據(尤其是數字和日期)的操作。它還支持使用本地化資源束進行 JSP 頁面的國際化。xml 庫包括一些標記,這些標記用來操作通過 XML 表示的數據,而 sql 庫定義了用來查詢關系數據庫的操作。
一、JSTL 庫安裝
假設要使用JSTL,則必須將jstl.jar和 standard.jar文件放到classpath中,假設你還須要使用XML processing及Database access (SQL)標簽。還要將相關JAR文件放到classpath中,這些JAR文件全部存在於下載回來的zip文件裏。
Apache Tomcat安裝JSTL 庫過程例如以下:
下載standard.jar和jstl.jar。這裏能夠下download.csdn.net/detail/evankaka/8871459,我已打包好的
standard.jar和jstl.jar文件復制到/WEB-INF/lib/下。
使用不論什麽庫,你必須在每一個JSP文件裏的頭部包括<taglib>標簽。
standard.jar的作用
JSP 標準標簽庫,和jstl.jar 一起使用,在1.0的版本號中,但在jstl-1.2.jar 就不在須要了。
假設你想在項目中使用JSTL和EL表達式。那麽你必須要引入這個standard.jar文件。即使你沒有引入,那MyEclipse工具自帶的類庫也會幫你倒入。其它工具不會。
jstl.jar下載地址:
http://repo2.maven.org/maven2/javax/servlet/jstl/
standard.jar下載地址:
http://repo2.maven.org/maven2/taglibs/standard/
假設是在Maven中能夠這麽寫:
<!-- standard.jar --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency>
二、核心標簽
核心標簽是最經常使用的JSTL標簽。引用核心標簽庫的語法例如以下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
標簽 | 描寫敘述 |
---|---|
<c:out> | 用於在JSP中顯示數據,就像<%= ... > |
<c:set> | 用於保存數據 |
<c:remove> | 用於刪除數據 |
<c:catch> | 用來處理產生錯誤的異常狀況,而且將錯誤信息儲存起來 |
<c:if> | 與我們在一般程序中用的if一樣 |
<c:choose> | 本身僅僅當做<c:when>和<c:otherwise>的父標簽 |
<c:when> | <c:choose>的子標簽,用來推斷條件是否成立 |
<c:otherwise> | <c:choose>的子標簽。接在<c:when>標簽後,當<c:when>標簽推斷為false時被運行 |
<c:import> | 檢索一個絕對或相對 URL,然後將其內容暴露給頁面 |
<c:forEach> | 基礎叠代標簽。接受多種集合類型 |
<c:forTokens> | 依據指定的分隔符來分隔內容並叠代輸出 |
<c:param> | 用來給包括或重定向的頁面傳遞參數 |
<c:redirect> | 重定向至一個新的URL. |
<c:url> | 使用可選的查詢參數來創造一個URL |
- <c:if>使用
<c:if> 標簽必須要有test屬性,當test中的表達式結果為true時。則會運行本體內容;假設為false。則不會運行。
比如:${requestScope.username = = ‘admin‘},假設requestScope.username等admin時。結果為true;若它的內容不等於admin時,則為false。
接下來看下列的範例:
<c:if test="${requestScope.username = = ‘admin‘ }">
ADMIN您好!! //body部分
</c:if> 假設名稱等於admin。則會顯示"ADMIN您好!! "的動作,假設相反。則不會運行<c:if>的body部分。所以不會顯示"ADMIN您好!! //body部分"。另外<c:if>的本體內容除了能放純文字,還能夠放不論什麽JSP程序代碼(Scriptlet)、JSP 標簽或者HTML碼。
除了test屬性之外,<c:if>還有另外兩個屬性var和scope。當我們運行<c:if>的時候。能夠將這次推斷後的結果存放到屬性var裏。scope則是設定var的屬性範圍。
哪些情況才會用到var和scope這兩個屬性呢?比如:當表達式過長時,我們會希望拆開處理。或是之後還須使用此結果時,也能夠用它先將結果臨時保留,以便日後使用。
樣例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-9"> </head> <body> <% String amind="Admin"; request.setAttribute("amind",amind); %> <c:if test="${requestScope.amind==‘Admin‘}" var="condition" scope="request"> 您好Admin先生 </c:if> </body> </html>
運行結果:
- <c:choose>使用
<c:choose>用於條件選擇,他和<c:when><c:otherwise>一起使用,他們僅僅能組合在一起使用<c:when>代表了<c:choose>的一個條件分支,他必須以<c:choose>作為他的父標簽
他必須在<c:otherwise>之前出現,僅僅要遵尋這兩個規則,使用起來非常easy,以下給出代碼:
<c:choose> <c:when test="expression"> body content </c:when> <c:when test="expression"> body content </c:when> ... <c:otherwise> body content </c:otherwise> </c:choose>如:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <jsp:useBean id="user" class="com.mucfc.User"/> <jsp:setProperty property="name" name="user" value="arthur"/> <jsp:setProperty property="age" name="user" value="12"/> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> <body> <c:choose> <c:when test="${user.name==‘arthur‘}"> 歡迎朋友:${user.name} </c:when> <c:otherwise> 登錄失敗 </c:otherwise> </c:choose> <body> </html>
運行結果:
- <c:forEach>
<c:foreach>相似於for和foreach循環
<c:forEach>標簽用於通用數據循環,它有以下屬性
屬 性 | 描 述 | 是否必須 | 缺省值 |
items | 進行循環的項目 | 否 | 無 |
begin | 開始條件 | 否 | 0 |
end | 結束條件 | 否 | 集合中的最後一個項目 |
step | 步長 | 否 | 1 |
var | 代表當前項目的變量名 | 否 | 無 |
varStatus | 顯示循環狀態的變量 | 否 | 無 |
<c:forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach><c:forEach>標簽的items屬性支持Java平臺所提供的全部標準集合類型。
此外。您能夠使用該操作來叠代數組(包括基本類型數組)中的元素。
它所支持的集合類型以及叠代的元素例如以下所看到的:
java.util.Collection:調用iterator()來獲得的元素。
ava.util.Map:通過java.util.Map.Entry所獲得的實例。
java.util.Iterator:叠代器元素。
java.util.Enumeration:枚舉元素。
Object實例數組:數組元素。
基本類型值數組:經過包裝的數組元素。
用逗號定界的String:切割後的子字符串。
javax.servlet.jsp.jstl.sql.Result:SQL查詢所獲得的行。
如能夠寫:
<%List<String> list=new ArrayList<String>(); list.add("nqwe"); list.add("ftyu"); list.add("vfg"); request.setAttribute("list",list); %> <c:forEach var="str" items="${list}" varStatus="status"> ${status.count}:<c:out value="${str}"/><br> </c:forEach>
整數
<c:forEach var="i" begin="1" end="10" step="1"> <c:out value="${i}" />, </c:forEach><p>計算x的平方
<table> <tr><th>Value</th> <th>Square</th></tr> <c:forEach var="x" begin="0" end="10" step="2"> <tr><td><c:out value="${x}"/></td> <td><c:out value="${x * x}"/></td></tr> </c:forEach> </table> <p>字符串"47,52,53,55,46,22,16,2" 分隔.
<table border="1"> <c:forTokens items="47,52,53,55,46,22,16,2" delims="," var="dailyPrice"> <tr><td><c:out value="${dailyPrice}"/></td></tr> </c:forTokens> </table><p>使用步長
<table> <tr><th>second</th> <th>second</th></tr> <c:forEach var="seconds" begin="0" end="${ pageContext.session.maxInactiveInterval}" step="60"> <tr><td><c:out value="${seconds}"/></td> <td><c:out value="${seconds}"/></td></tr> </c:forEach> </table> <p>對數組進行循環
<% int ai[] = {10, 20, 30, 40, 50}; pageContext.setAttribute("ary", ai); %> <c:forEach var="i" items="${ary}"> <c:out value="${i}"/>* </c:forEach><p> <% Cookie c=new Cookie("cookie1","one"); response.addCookie(c); %> <% Cookie cookies[]=request.getCookies(); Cookie sCookie=null; String sname=null; String name=null; if(cookies==null) // 假設沒有不論什麽cookie out.print("none any cookie"); else { //out.print(cookies.length + "<br>"); for(int i=0;i<cookies.length; i++) // 循環列出全部可用的Cookie { sCookie=cookies[i]; sname=sCookie.getName(); name = sCookie.getValue(); out.println(sname + "->" + name + "<br>"); } } %> <table border="1" align="center"> <tr><th>Cookie Name</th> <th>Cookie Value</th></tr> <c:forEach var="cook" items="${pageContext.request.cookies}"> <tr><td><c:out value="${cook.name }"/></td> <td><c:out value="${cook.value}"/></td></tr> </c:forEach> </table> <p>字符串數組循環
<% String as[] = { "A first string", "La deuxieme string", "Ella troisiemo stringo" }; request.setAttribute("stringArray", as); %><p> <c:forEach var="string" items="${stringArray}"> <c:out value="${string}"/><br> </c:forEach>枚舉
<% Hashtable hashtable1 = new Hashtable(); pageContext.setAttribute("numberMap", hashtable1); hashtable1.put(new Integer(1), "uno"); hashtable1.put(new Integer(2), "dos"); hashtable1.put(new Integer(3), "tres"); hashtable1.put(new Integer(4), "cuatro"); hashtable1.put(new Integer(5), "cinco"); hashtable1.put(new Integer(6), "seis"); hashtable1.put(new Integer(7), "siete"); hashtable1.put(new Integer(8), "ocho"); hashtable1.put(new Integer(9), "nueve"); hashtable1.put(new Integer(10), "diez"); java.util.Enumeration enumeration = hashtable1.keys(); pageContext.setAttribute ("enumeration", enumeration); %> <c:forEach var="item" items="${enumeration}" begin="2" end="10" step="2"> <c:out value="${item}"/><br> </c:forEach><p>map
<c:forEach var="prop" items="${numberMap}" begin="1" end="5"> <c:out value="${prop.key}"/> = <c:out value="${prop.value }"/><br> <c:out value="${prop[key]}"/> </c:forEach>
- <c:set>使用
<c:set>標記是JSTL的setProperty動作的友好版本號。標簽是實用的,由於它的表達式求值,並使用結果的JavaBean或java.util.Map對象設置一個值。
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>將本體內容的數據儲存至範圍為scope的varName變量之中:
<c:set var="varName" [scope="{ page|request|session|application }"]> … 本體內容 </c:set>
將value的值儲存至target對象的屬性中:
<c:set value="value" target="target" property="propertyName" />
將本體內容的數據儲存至target對象的屬性中:
<c:set target="target" property="propertyName"> … 本體內容 </c:set>
它有例如以下屬性屬性描寫敘述是否必須缺省值:
名 稱 | 說 明 | EL | 類型 | 必須 | 默認值 |
value | 要被儲存的值 | Y | Object | 否 | 無 |
var | 欲存入的變量名稱 | N | String | 否 | 無 |
scope | var變量的JSP範圍 | N | String | 否 | pagescope |
target | 為一JavaBean或java.util.Map對象 | Y | Object | 否 | 無 |
property | 指定target對象的屬性 | Y | String | 否 | 無 |
能夠看個樣例:
<c:set var="num" scope="session" value="${4000*2}"/> <c:out value="${num}"/><br> <c:set target="${user}" property="name" value="linbingwen" /> <c:out value="${user.name}"/>
結果:
- <c:remove>使用
remove標簽一般和set標簽配套使用,兩者是相相應的,remove標簽用於刪除某個變量或者屬性,使用格式例如以下:
<c:remove var=”varName” [scope=”page|request|session|application”] />
Remove標簽中使用的各屬性說明例如以下:
1. scope : 設定這個須要刪除的變量的所在範圍.
2. var : 須要刪除的變量或者對象屬性的名稱.
假設沒有scope屬性,即採用默認值,就相當於調用PageContext.removeAttribute(varName)方法,假設指定了這個變量所在的範圍,那麽系統會調用PageContext.removeAttribute(varName,scope)方法.
- <c:catch>使用
catch標簽的功能和java中的try{…}catch{…}語句的功能非常相似,它用於捕獲嵌入到當中間語句拋出的異常,這個標簽的使用格式例如以下:
<c:catch var=”varName”> 相關操作語句 </c:catch> --假設操作語句中出現異常,則catch會將異常保存在 varName變量中.
- <c:forTokens>使用
這個標簽的作用和Java中的StringTokenizer類的作用非常相似,通過items屬性來指定一個特定的字符串,然後通過delims屬性指定一種分隔符(能夠同一時候指定多個),通過指定的分隔符把items屬性指定的字符串進行分組,與forEach標簽一樣,forTokens標簽也能夠指定begin和end以及step屬性值.
使用格式例如以下:
<c:forTokens items=”stringOfTokens” delims=”delimiters” var=”varName” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]> Body content </c:forTokens>