1. 程式人生 > >Jstl之核心標簽庫與格式標簽庫使用

Jstl之核心標簽庫與格式標簽庫使用

文字 設置 創建 each str2 有時 相對 ram 定向

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>標簽的語法定義例如以下所看到的。
<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對象設置一個值。

將value的值儲存至範圍為scope的varName變量之中
<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要被儲存的值YObject
var欲存入的變量名稱NString
scopevar變量的JSP範圍NStringpagescope
target為一JavaBean或java.util.Map對象YObject
property指定target對象的屬性YString
假設指定了target屬性, 那麽property屬性也必須指定。
能夠看個樣例:

<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>