我們可以使用jstl(jsp standard tag library)來替換jsp中用來實作頁面邏輯的scriptlet,讓網頁上使用與html類似的标簽,這會使得網頁設計變得更加簡單,可以随時調整頁面而不用費心的修改scriptlet。
jstl提供的标簽庫可以分為五個大類。
核心标簽庫
提供條件判斷、屬性通路、url處理及錯誤處理等标簽。
格式标簽庫
提供數字、日期等的格式化功能,以及區域(locale)、資訊、編碼處理等國際化功能的标簽。
sql标簽庫
提供基本的資料庫查詢、更新、設定資料源等功能的标簽。
xml标簽庫
提供xml剖析、流程控制、轉換等功能的标簽。
5.函數标簽庫
提供用于字元串處理的自定義el函數标簽庫
jstl是另一個标準規範,本身并不在jsp的規範當中,是以必須另外下載下傳實作。
jstl下載下傳
版本: standard 1.1.2
配置
解壓下載下傳檔案jakarta-taglibs-standard-1.1.2.zip,将lib目錄下的jstl.jar和standard.jar複制到項目的web-inf/lib目錄下。
使用
在jsp檔案中使用taglib元素指定元素定義前置名稱與uri引用。
<code><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %></code>
前置标簽設定了這個标簽庫在此jsp網頁中的名稱空間,以避免與其他标簽庫的标簽名稱發生沖突,慣例上使用jstl核心标簽庫時,會使用c作為前置名稱。uri則告知容器,如何引用jstl标簽庫實作。
一個執行個體如下:
<code><c:if></code>标簽中的test屬性中可以設定el表達式或jsp操作數(<code><%= %></code>),如果表達式的結果為true,則會将<code><c:if></code>主體輸出。
<code><c:when></code>和<code><c:otherwise></code>必須放在<code><c:choose></code>之中。<code><c:choose></code>中可以有多個<code><c:when></code>标簽,此時會從上往下進行測試,如果有個<code><c:when></code>的test運算結果為true,就輸出其主體内容,之後的<code><c:when></code>就不會做測試,如果若有的<code><c:when></code>經測試都不成立,則會輸出<code><c:otherwise></code>的内容。
用于通過循環來産生一連串的輸出。<code><c:foreach></code>标簽的items屬性可以是數組或collection對象,每次回循序讀取數組或collection對象中的一個元素,并制定給var屬性所設定的變量,之後就可以在<code><c:foreach></code>标簽主體中,使用var屬性所設定的變量來取得該元素。例如:
用于将某個字元串拆分為數個字元(token)。例如:
如果要在發生異常的頁面直接捕捉異常對象,可以使用将可能發生異常的網頁段落包起來。如果異常發生了,這個異常對象會設定給var屬性所指定的名稱,這樣才有機會使用這個異常對象。例如:
之前學過了兩種包括其他jsp網頁至目前網頁的方法,一個是include訓示元素,另一個時<code><jsp:include></code>标簽。用法如下:
include訓示元素:
<code><jsp:include></code>标簽:
在jstl中,有個<code><c:import></code>标簽,可以視作是<code><jsp:include></code>标簽的加強版,它可以在運作時動态導入另一個網頁,也可以搭配<code><c:param></code>在導入另一網頁時帶有參數,例如:
除了可以導入目前web應用程式中的網頁之外,該标簽還可以導入非目前web應用程式中的網頁。例如:
其中charencoding用來指定要導入的網頁的編碼,如果要被導入的網頁編碼與目前的網頁編碼不同,就必須使用charencoding屬性加以指定,導入的網頁才不至于産生亂碼。
<code><c:redirect></code>标簽的作用如同sendredirect()方法,如果重定向時需要參數,也可以通過<code><c:param></code>來設定。
jsp的<code><jsp:setproperty></code>功能有限,隻能用來設定javabean的屬性,如果隻是要在page、request、session、application等範圍内設定一個屬性,或者想要設定map對象的鍵與值,則可以使用<code><c:set></code>标簽。
例如,使用者登入後再session範圍内設定一個“login”屬性,代表使用者已經登入,則可以按如下編寫:
這段标簽的作用相當于
也可以使用el來設定value,例如:
<code><c:set></code>标簽也可以将value的設定改為主體的方式,在所要設定的屬性值冗長時,采用主體的方式會比較容易編寫,例如:
<code><c:set></code>标簽不設定scope時,就會從page、request、session、application的範圍尋找屬性名稱,如果在某個範圍内找到屬性名稱,則在該範圍設定屬性。如果所有範圍都沒有找到屬性名稱,則會在page範圍内添加屬性。如果要移除某個屬性,則可以使用<code><c:remove></code>标簽。例如:
<code><c:set></code>标簽也可以直接用來設定javabean或map對象的鍵值,此時必須使用target屬性進行設定,例如:
<code><c:out></code>标簽可以用來輸出指定的文字。例如:
以上代碼與直接寫<code>${param.message}</code>的差別在于,<code><c:out></code>标簽會自動将角括号、單引号、雙引号等字元用替代字元替換,這個功能是<code><c:out></code>标簽的escapexml屬性來控制的,預設為true;如果設定為false,就不會做字元的替換。還可以使用default屬性設定el運算結果為null時的預設顯示值。
response的encodeurl()方法可以用來做url重寫,在使用者關閉cookie功能時,仍可以繼續利用url重寫來維持使用session進行會話管理。
也可以使用jstl的<code><c:url></code>,它會在使用者關閉cookie的功能時,自動用session id做url重寫。
如果要在url上攜帶參數,則可以搭配<code><c:param></code>标簽,參數将被編碼後附加在url上,例如,就以下這個片段而言,最後的url将成為<code>some.jsp?name=chu+xing</code>。