天天看點

[Servlet&JSP] JSTL的使用JSTL簡介流程處理标簽網頁導入、重定向标簽屬性處理與輸出标簽URL處理标簽

我們可以使用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>&lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;</code>

前置标簽設定了這個标簽庫在此jsp網頁中的名稱空間,以避免與其他标簽庫的标簽名稱發生沖突,慣例上使用jstl核心标簽庫時,會使用c作為前置名稱。uri則告知容器,如何引用jstl标簽庫實作。

一個執行個體如下:

<code>&lt;c:if&gt;</code>标簽中的test屬性中可以設定el表達式或jsp操作數(<code>&lt;%= %&gt;</code>),如果表達式的結果為true,則會将<code>&lt;c:if&gt;</code>主體輸出。

<code>&lt;c:when&gt;</code>和<code>&lt;c:otherwise&gt;</code>必須放在<code>&lt;c:choose&gt;</code>之中。<code>&lt;c:choose&gt;</code>中可以有多個<code>&lt;c:when&gt;</code>标簽,此時會從上往下進行測試,如果有個<code>&lt;c:when&gt;</code>的test運算結果為true,就輸出其主體内容,之後的<code>&lt;c:when&gt;</code>就不會做測試,如果若有的<code>&lt;c:when&gt;</code>經測試都不成立,則會輸出<code>&lt;c:otherwise&gt;</code>的内容。

用于通過循環來産生一連串的輸出。<code>&lt;c:foreach&gt;</code>标簽的items屬性可以是數組或collection對象,每次回循序讀取數組或collection對象中的一個元素,并制定給var屬性所設定的變量,之後就可以在<code>&lt;c:foreach&gt;</code>标簽主體中,使用var屬性所設定的變量來取得該元素。例如:

用于将某個字元串拆分為數個字元(token)。例如:

如果要在發生異常的頁面直接捕捉異常對象,可以使用将可能發生異常的網頁段落包起來。如果異常發生了,這個異常對象會設定給var屬性所指定的名稱,這樣才有機會使用這個異常對象。例如:

之前學過了兩種包括其他jsp網頁至目前網頁的方法,一個是include訓示元素,另一個時<code>&lt;jsp:include&gt;</code>标簽。用法如下:

include訓示元素:

<code>&lt;jsp:include&gt;</code>标簽:

在jstl中,有個<code>&lt;c:import&gt;</code>标簽,可以視作是<code>&lt;jsp:include&gt;</code>标簽的加強版,它可以在運作時動态導入另一個網頁,也可以搭配<code>&lt;c:param&gt;</code>在導入另一網頁時帶有參數,例如:

除了可以導入目前web應用程式中的網頁之外,該标簽還可以導入非目前web應用程式中的網頁。例如:

其中charencoding用來指定要導入的網頁的編碼,如果要被導入的網頁編碼與目前的網頁編碼不同,就必須使用charencoding屬性加以指定,導入的網頁才不至于産生亂碼。

<code>&lt;c:redirect&gt;</code>标簽的作用如同sendredirect()方法,如果重定向時需要參數,也可以通過<code>&lt;c:param&gt;</code>來設定。

jsp的<code>&lt;jsp:setproperty&gt;</code>功能有限,隻能用來設定javabean的屬性,如果隻是要在page、request、session、application等範圍内設定一個屬性,或者想要設定map對象的鍵與值,則可以使用<code>&lt;c:set&gt;</code>标簽。

例如,使用者登入後再session範圍内設定一個“login”屬性,代表使用者已經登入,則可以按如下編寫:

這段标簽的作用相當于

也可以使用el來設定value,例如:

<code>&lt;c:set&gt;</code>标簽也可以将value的設定改為主體的方式,在所要設定的屬性值冗長時,采用主體的方式會比較容易編寫,例如:

<code>&lt;c:set&gt;</code>标簽不設定scope時,就會從page、request、session、application的範圍尋找屬性名稱,如果在某個範圍内找到屬性名稱,則在該範圍設定屬性。如果所有範圍都沒有找到屬性名稱,則會在page範圍内添加屬性。如果要移除某個屬性,則可以使用<code>&lt;c:remove&gt;</code>标簽。例如:

<code>&lt;c:set&gt;</code>标簽也可以直接用來設定javabean或map對象的鍵值,此時必須使用target屬性進行設定,例如:

<code>&lt;c:out&gt;</code>标簽可以用來輸出指定的文字。例如:

以上代碼與直接寫<code>${param.message}</code>的差別在于,<code>&lt;c:out&gt;</code>标簽會自動将角括号、單引号、雙引号等字元用替代字元替換,這個功能是<code>&lt;c:out&gt;</code>标簽的escapexml屬性來控制的,預設為true;如果設定為false,就不會做字元的替換。還可以使用default屬性設定el運算結果為null時的預設顯示值。

response的encodeurl()方法可以用來做url重寫,在使用者關閉cookie功能時,仍可以繼續利用url重寫來維持使用session進行會話管理。

也可以使用jstl的<code>&lt;c:url&gt;</code>,它會在使用者關閉cookie的功能時,自動用session id做url重寫。

如果要在url上攜帶參數,則可以搭配<code>&lt;c:param&gt;</code>标簽,參數将被編碼後附加在url上,例如,就以下這個片段而言,最後的url将成為<code>some.jsp?name=chu+xing</code>。