javaserver pages standard tag librarysnowlin.cmu.edu.tw/webdev/part_ix_jstl.pdf ·...
TRANSCRIPT
-
Web Development Part IX JSP 標準標籤庫-JSTL i
JavaServer Pages Standard Tag Library
目 錄
JSTL 簡介 .................................................................................................................................. 1 核心標籤庫(Core Tag Library).................................................................................................. 1
運算式操作(General Expression Tags) ............................................................................. 2 流程控制(Conditional Tags).............................................................................................. 5 迭代操作(Iterator Tags) ..................................................................................................... 7 URL 操作(Import Tags) ................................................................................................... 10
I18N 格式標籤庫(I18N-Capable Formatting Tags) ................................................................ 14 國際化格式標籤 .............................................................................................................. 14 訊息格式標籤 .................................................................................................................. 15 數字日期格式化標籤 ...................................................................................................... 19
SQL 標籤庫(SQL Tags)........................................................................................................... 25 設定資料庫連線 .............................................................................................................. 25 SQL 存取指令 ................................................................................................................. 26
函式標籤庫(Function Tags)..................................................................................................... 31
-
Web Development Part IX JSP 標準標籤庫-JSTL 1
JSTL 簡介
JavaServer Pages Standard Tag Library (1.1) – JSP 標準標籤函式庫,應用於基本輸出、輸入、流程控制、迴圈、XML 文件剖析、資料庫查詢及國際化文字格式標準化(UTF)等。主要分為以下五大類
JSTL Prefix URI Example 核心標籤庫 (Core Tag Library)
c http://java.sun.com/jsp/jstl/core
I18N 格式標籤庫(I18N-capable-formatting Tag Library)
fmt http://java.sun.com/jsp/jstl/fmt
SQL 標籤庫 (SQL Tag Library)
sql http://java.sun.com/jsp/jstl/sql
XML 標籤庫 (XML Tag Library)
xml http://java.sun.com/jsp/jstl/xml
函式標籤庫 (Functions Tag Library)
fn http://java.sun.com/jsp/jstl/functions
安裝 JSTL1.1 JSTL 官方網站為 http://java.sun.com/products/jsp/jstl/ 必須在支援 Servlet 2.4 及 JSP2.0 以上版本的 Container 使用。 下載網址:http://jakarta.apache.org/taglibs/index.html 解壓縮目錄下之子目錄\standard\javadoc 中即 API 套件說明文件。 將子目錄\standard\lib 下之 jstl.jar 及 standard.jar 檔複製到伺服器站台下
WEB-INF\lib 中,或放在伺服器的共用程式資料夾(如 Tomcat 的\commom\lib),即可在 JSP 中使用 JSTL。
將子目錄\standard\tld 下之 tld 檔複製到 WEB-INF 目錄下以便日後使用。 將子目錄\standard 下的 standard-examples.war 檔案複製到伺服器路徑下(如
Tomcat 的 webapps),會自動部署 standard-examples 站台,可在該站台下瀏覽JSTL 範例程式檔案。
核心標籤庫(Core Tag Library)
核心標籤庫主要功能如下 功能分類 標籤名稱 運算式操作 out, set, remove, catch 流程控制 if, choose…when…otherwise 迭代操作 forEach, forTokens
-
Web Development Part IX JSP 標準標籤庫-JSTL 2
URL 操作 import, url, redirect 使用核心標籤庫時使用指令,並設定 prefix 和 uri 值如下
運算式操作(General Expression Tags)
- 顯示資料的內容
Syntax 1: with body
Syntax 2: without body
Default value
屬性說明 名稱 說明 EL 型態 是否必須 預設值 value 要被顯示出來的值 Y Object 是 無 default 預設值 Y Object 否 無 escapeXml 是否轉換特殊字元如: ‘ “ &
Entity < > ' " &
- 將變數儲存至 JSP 範圍中或 JavaBean 的屬性中 Syntax 1: 將 value 的值儲存到範圍為 scope 的 varName 變數中
Syntax 2: 將本體內容的資料儲存至範圍為 scope 的 varName 變數之中
……statement body
Syntax 3: 將 value 的值儲存至 target 物件的屬性中
-
Web Development Part IX JSP 標準標籤庫-JSTL 3
Syntax 4: 將本體內容的資料儲存至 target 物件的屬性之中
……statement body
屬性說明 名稱 說明 EL 型態 是否必須 預設值 value 要被儲存的值 Y Object 否 無 var 欲存入的變數名稱 N String 否 無 scope var 變數的 JSP 範圍 N String 否 page target 為一 JavaBean 或 java.util.Map 物件 Y Object 否 無 property 指定 target 物件的屬性 Y String 否 無
- 移除變數
Syntax:
屬性說明 名稱 說明 EL 型態 是否必須 預設值 var 欲移除的變數名稱 N String 是 無 scope var 變數的 JSP 範圍 N String 否 page
scope屬性可有可無,但若不設定scope,則會刪除所有範圍中(Page, Request, Session, Application)被 var 定義的名稱所有資料。
- 處理產生錯誤的例外狀況並儲存錯誤訊息
Syntax:
……欲擷取之錯誤部份
屬性說明 名稱 說明 EL 型態 是否必須 預設值 var 儲存錯誤訊息的變數名稱 N String 無 無
當錯誤發生在…之間時只會忽略這段程式,整個網頁並不會中止。
Example: JSTLLogin.htm 程式檔
JSTL 登入表單
請輸入資料登入網站
-
Web Development Part IX JSP 標準標籤庫-JSTL 4
使用者名稱:
使用者密碼:
JSTLLogin.jsp 程式檔
JSTL Test Page
Working with c:out
The browser is:
Working with c:set and c:remove
${3+5}
pageScope.number:
requestScope.number:
sessionScope.number:
-
Web Development Part IX JSP 標準標籤庫-JSTL 5
Data"/>
applicationScope.number:
After removing sessionScope.number:
Working with c:catch for Error Message
${err_Message}
流程控制(Conditional Tags)
- 與一般在程式中用的 if 一樣。
Syntax 1: without body
Syntax 2: with body
……statement body
屬性說明 名稱 說明 EL 型態 是否必須 預設值 test 如果運算式的結果為 true 則執行本體內
容,false 則相反 Y boolean 是 無
var 儲存 test 運算後的結果,即 true 或 false N String 無 無 scope var 變數的 JSP 範圍 N String 否 page
一般 testCondition 運算式用來比對表單傳來的資訊,例如${param.User==’admin’},如果筆對正確,則 varName 傳回 true;否則傳回
false。 , , - choose 為 when 和 otherwise 的父標籤,
-
Web Development Part IX JSP 標準標籤庫-JSTL 6
用法如同 if…then…else 一般。
Syntax:
condition1 為 true
condition2 為 true
……
conditionN 為 true
前述之 condition 均為 false
屬性說明 名稱 說明 EL 型態 是否必須 預設值 test 如果運算式的結果為 true 則執行本
體內容,false 則相反 Y boolean 是 無
比須在和之間,且在同一個中,則必須在之前。
Example JSTLCondition.htm 程式碼
JSTL 登入判斷
請輸入資料登入網站
使用者名稱:
使用者密碼:
JSTLCondition.jsp 程式碼
-
Web Development Part IX JSP 標準標籤庫-JSTL 7
JSTL Condition Tag Test Page
執行結果: ${condition}
password 1: 1234
password 2: 5678
Incorrect Password
迭代操作(Iterator Tags)
- 為迴圈控制,將集合(Collection)中的成員循序瀏覽過一遍,當設定條件符合時會持續重覆執行標籤範圍內的本體內容。
Syntax 1: 迭代一集合物件之所有成員
……Statement Body
Syntax 2: 迭代指定的次數
……Statement Body
屬性 名稱 說明 EL 型態 是否必須 預設值 var 存放現在指到的成員 N String 否 無 items 被迭代的的集合物件 Y Array, Collection,
Iterator, String,
Enumeration, Map
否 無
-
Web Development Part IX JSP 標準標籤庫-JSTL 8
varStatus 存放現在指到的相關
成員資訊 N String 否 無
begin 開始的位置 Y int 否 0 end 結束的位置 Y int 否 最後一個成員step 每次迭代的間隔數 Y int 否 1
有 begin 屬性時,begin 必須大於等於 0;有 end 屬性時,必須大於 begin;有step 屬性時,step 必須大於等於 1。
如果需要在循序瀏覽一個集合物件時將內容印出來,就必須有 items 屬性,否則表示空集合(即 items 視為 null);當 begin 大於或等於 items 大小時則迭代不算。
- 用來瀏覽一字串中所有的成員,字串成員由定義符號(delimiters)所分隔。
Syntax:
……Statement Body
屬性 名稱 說明 EL 型態 是否必須 預設值 var 存放現在指到的成員 N String 否 無 items 被迭代的的集合物件 Y Array, Collection,
Iterator, String,
Enumeration, Map
是 無
delims 定義分割字串的字元 N String 是 無 varStatus 存放現在指到的相關
成員資訊 N String 否 無
begin 開始的位置 Y int 否 0 end 結束的位置 Y int 否 最後一個成員step 每次迭代的間隔數 Y int 否 1
有 begin 屬性時,begin 必須大於等於 0;有 end 屬性時,必須大於 begin;有step 屬性時,step 必須大於等於 1。
如果需要在循序瀏覽一個集合物件時將內容印出來,就必須有 items 屬性,否則表示空集合(即 items 視為 null);當 begin 大於或等於 items 大小時則迭代不算。
Example: JSTLIterate.jsp
-
Web Development Part IX JSP 標準標籤庫-JSTL 9
JSTL Test - forEach tags
Omit begin, end, step
${item}
Use begin, end, step
${item}
Use begin, end, step without items
${item}
Consider varStatus
-
index: ${s.index} |
count: ${s.count} |
first: ${s.first} |
last: ${s.last}
After delimition:
-
Web Development Part IX JSP 標準標籤庫-JSTL 10
${item}
URL 操作(Import Tags)
- 可以把其他靜態或動態文件包含至本身 JSP 網頁。只能包含和自己同一個 web application 下的文件;而則可以包含不同 web application 或其他網站的文件。
Syntax 1: 使用 String 型態存入
……Statement Body
Syntax 2: 使用 Reader 型態存入
……Statement Body
屬性 名稱 說明 EL 型態 是否必須 預設值url 欲包含文件之網址 Y String 是 無 var 儲存備包含的文件內容(以 String 型態
存入) N String 否 無
scope var 變數的 JSP 範圍 N String 否 Page context 在相同 Container 下欲包含之網址文件
名稱,其他 Web 站台必須以/開頭。 Y String 否 無
charEncoding 被包含文件的編碼格式 N String 否 無 varReader 儲存被包含文件的內容(以 Reader 型
態存入) N String 否 無
url 為必要屬性,可以用相對位址寫出網頁檔名,如 url=”images/Data.htm”,表示 Data.htm 網頁在此 JSP 檔所在目錄底下之 images 子目錄下;如果該路徑對應位置為站台之根目錄,則路徑前記得加上/,如 url=”/images/Data.htm”
如使用絕對位址,則列出網址,如 url=”http://java.sun.com” 也支援 FTP 協定,例如要把把某 FTP 站台下的 Data.txt 文件內容顯
示出來,則為 url=”ftp://ftp.xyz.edu.tw/Data.txt” 如果所欲顯示的文件在同一個伺服器上另一個Web站台上時,必須加上context
-
Web Development Part IX JSP 標準標籤庫-JSTL 11
屬性,如另一站台名稱為 others,則 但此時該站台必須在伺服器文件中被定義過。例如 Tomcat 的 server.xml 檔案中,定義一個名為 others 的 Web 站台如下 : :
當 var 屬性存在時,會把欲包含文件之內容以字串型態涵蓋進來存在 varName中,但不輸出在網頁上,且由 scope 設定其範圍,在需要的時候(例如版權宣告、歡迎語句等)再以變數型態輸出,如。
- 主要是用來產生一個 URL。
Syntax 1: without statement body
Syntax 2: with statement body
標籤變數
屬性 名稱 說明 EL 型態 是否必須 預設值url 欲執行之網址 Y String 是 無 var 儲存備包含的文件內容(以 String 型態
存入) N String 否 無
scope var 變數的 JSP 範圍 N String 否 Page context 在相同 Container 下欲包含之網址文件
名稱,其他 Web 站台必須以/開頭。 Y String 否 無
標籤的屬性規則與一樣。一般常搭配…超連結標籤使用;或者直接顯示某站台的影像圖片,如
- 可以將用戶端的請求從一個 JSP 網頁導向到其他文件,使用此標籤之網頁將不會顯現出來。
Syntax 1: without statement body
Syntax 2: with statement body
-
Web Development Part IX JSP 標準標籤庫-JSTL 12
標籤變數
屬性 名稱 說明 EL 型態 是否必須 預設值url 欲執行之網址 Y String 是 無 context 在相同 Container 下欲包含之網址文件
名稱,其他 Web 站台必須以/開頭。 Y String 否 無
標籤的 url 屬性規則與一樣。 Example:
JSTLURLTest.jsp 程式碼
JSTL URL Tags Test
Importing......
Following message is imported from JSTLImported.jsp
Following message is set in current page but retrieved from imported page and
trasmitted back
${OutputParam}
JSTL Reference Documentation
-
Web Development Part IX JSP 標準標籤庫-JSTL 13
Click here for redirect page:
JSTLRedirect.jsp
JSTLImported.jsp 程式碼
JSTL Imported Page
${InputSetData}
JSTLRedirect.jsp 程式碼
JSTL Redirect Page
-
Web Development Part IX JSP 標準標籤庫-JSTL 14
I18N 格式標籤庫(I18N-Capable Formatting Tags)
JSTL 中最重要的功能就是國際化格式(i18n)的支援,此功能可以對一個特定的語言請求作出適合的回應,例如台灣的使用者發出請求時,回應繁體的結果。
它使用 J2SE 的 ResourceBundle,根據不同的地區選擇適合的ResourceBundle。
用來設置地區,比如
-
Web Development Part IX JSP 標準標籤庫-JSTL 15
- 設定請求的字串編碼
Syntax:
屬性 名稱 說明 EL 型態 是否必須 預設值value 字串編碼 Y String 是 無
若未設定編碼,則表示交由 JSP 自行決定。 Example:
JSTL for Local Area Information
Using fmt:setLocale
JAPANESE(JAPAN):
SPANISH:
FRENCH(CANADA):
CHINESE(TAIWAN):
CHINESE(CHINA):
訊息格式標籤
此標籤主要的功能為抓取系統設定資源,做到多國化訊息。 建立系統設定資源檔(.properties),例如 MyResource.properties,並將檔案放
置在 WEB-INF/classes 目錄下,檔案內容格式為 key = value,如:
str1 = Hello
str2 = World - 從指定的資源中把特定的關鍵字之值取出
-
Web Development Part IX JSP 標準標籤庫-JSTL 16
Syntax 1: without param tags
Syntax 2: with param tags
標籤
Syntax 3: with statement body including key and param tags
key = ...... 索引鍵
(標籤)
屬性 名稱 說明 EL 型態 是否必須 預設值 key 索引鍵 Y String 否 無 bundle 指定使用的資料來源 Y LocalizationContext 否 無 var 儲存國際化訊息 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
假如沒有設定 key 屬性,會自動從本體內容中尋找關鍵字,再找出對應的結果顯示在網頁中。如設定 key 屬性,則可配合前述之 properties資源檔案指定對應的值,如 key=”str1”,則字串 Hello 會顯示在網頁上。
如果有 var 屬性時,會把資料儲存在 varName 中而不會顯示在網頁上,如要顯示則必須搭配標籤使用。
- 為資料來源中抓取之資料動態設定參數,如日期、使用者名稱等。 Syntax 1: 經由 value 屬性設定參數值
Syntax 2: 經由本體內容設定參數值
……Statement Body
屬性 名稱 說明 EL 型態 是否必須 預設值value 增加的變數 Y String 是 無
-
Web Development Part IX JSP 標準標籤庫-JSTL 17
如果沒有 value 屬性,就會預設去抓取本體內容作為要給予的參數。 若要顯示中文字時,在資源檔(.properties)中的中文部份必須為 Unicode,否則
將無法顯示出來。 - 設定本體內容的資料來源。
Syntax:
……Statement Body (如)
屬性 名稱 說明 EL 型態 是否必須 預設值basename 要使用的資源名稱,如.properties 檔名 Y String 是 無 prefix 前置關鍵字 Y String 否 無
basename 的值不可以有任何檔案類型(即不可有.class, .properties 等副檔名) 假如資源檔(.properties)中的 key 名稱有共同的前置字串,則可以 prefix 設定。
例如以下之資源檔內容
requestinfo.label.method = Method:
requestinfo.label.protocol = Protocol:
則可定義 prefix=”requestinfo.lable.”,而對應之索引 key 值可簡化如
- 設定預設的資料來源,或設定到屬性範圍中。
Syntax:
屬性 名稱 說明 EL 型態 是否必須 預設值basename 要使用的資源名稱,如.properties 檔名 Y String 是 無 var 儲存資源名稱 Y String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
basename 設定要使用的資料來源,和用法相同。 如果沒有設定 var 時,則設定好的資料來源將會變成預設的資料來源,讓在同
一網頁或同一屬性範圍中的可直接預設使用此資料來源。例如
如果設定 var 時,會把此資料來源存入 varName 中,當要使
用時,必須使用 bundle 這個屬性來指定。例如
-
Web Development Part IX JSP 標準標籤庫-JSTL 18
一般和都可以搭配使用。以上例而言,當有多種各國語言的資料來源時,可以將檔名取成
MyResource_zh_TW.properties、MyResource_en.properties 和
MyResource.propesies 等。例如將區域設定為 zh_TW,則使
用或時,將會預設讀取
MyResource_zh_TW.properties 資源檔;如果設定的區域沒有符合的檔名,
那麼將會使用 MyResource.properties 當作資料來源。
Example:
建立資源檔-JSTLi18nResource_en_US.properties
str=Hi!{0}
today is {1,date,long}
time is {2,time,full}
number is{3,number,#.#}
此資源檔表示索引鍵值 str 會呈現四種動態變數-字串、date、time 及number。
{0}表示第一個變數位置為一般字串,{1,date,long}表示 date 的顯示格式,除 long 之外,date 亦可顯示為 short、medium、full 等。同理,{2,time,full}
與{3,number}亦類似。相關規定可參閱 Java J2SDK1.4.2 API 中的java.text.MessageFormat。
建立資源檔-JSTLi18nResource_zh_TW.properties 原始碼(檔名 JSTLi18n.properties)
str=中文!{0}
今天日期為:{1,date,long}
時間為:{2,time,full}
數字為:{3,number,#.#}
在 DOS 模式利用 Sun J2SDK 提供的 native2ascii 工具將資源檔中之中文碼轉換成 Unicode native2ascii -encoding Big5
JSTLi18n.properties
JSTLi18nResource_zh_TW.properties
轉碼後(檔名 JSTLi18nResource_zh_TW.properties)
str=\u4e2d\u6587!{0}
\u4eca\u5929\u65e5\u671f\u70ba\uff1a{1,date,long}
\u6642\u9593\u70ba\uff1a{2,time,full}
\u6578\u5b57\u70ba\uff1a{3,number,#.#}環境設定 將上述兩個資源檔放置在站台下 WEB-INF\classes 目錄下 至網際網路選項選單內選取”一般”頁籤下的”語言”選項,新增兩種語言-
中文(台灣)[zh-tw]與英文(美國)[en-us],系統會視排在第一位者之語系選取資源檔。
程式檔-JSTLi18nInfo.jsp
-
Web Development Part IX JSP 標準標籤庫-JSTL 19
JSTL for i18n Information
Using fmt:bundle, message, param
數字日期格式化標籤
- 會依據設定的區域將數字改為適當的格式 Syntax 1: 無本體內容
-
Web Development Part IX JSP 標準標籤庫-JSTL 20
[scope=”{page|request|session|application}”] />
Syntax 2: 本體內容為欲格式化之數字
欲格式化之數字
屬性 名稱 說明 EL 型態 是否必須 預設值value 欲格式化的數字 Y String/Number 否 無 type 指定單位(數字、當地貨幣
或百分比) Y String 否 number
pattern 格式化數字的樣式 Y String 否 無 currencyCode ISO-4217 貨幣碼 Y String 否 無 currencySymbol 貨幣符號 Y String 否 無 groupingUsed 是否用逗號區隔數字 Y boolean 否 true maxIntegerDigits 整數部份最大顯示位數 Y int 否 無 minIntegerDigits 整數部份最小顯示位數 Y int 否 無 maxFractionDigits 小數部份最大顯示位數 Y int 否 無 minFractionDigits 小數部份最小顯示位數 Y int 否 無 var 儲存以格式化之數字 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
依據設定的區域顯示不同的格式化數字,例如 5000000.01 在臺灣為5,000,000.01,法國為 5 000 000,01,德國為 5.000.000,01
pattern 屬性亦提供了科學記號的功能,例如 2.0512E4 代表 2.0512x104,則
貨幣碼參考國際標準組織網址,例如台幣為 TWD,美金為 USD http://www.iso.org/iso/en/prods-services/popstds/currencycodeslist.html
如設定了 maxIntegerDigits 或 maxFractionDigits 時,相對於 value 超過的位
-
Web Development Part IX JSP 標準標籤庫-JSTL 21
數會被刪除。 如設定了 minIntegerDigits 或 minFractionDigits 時,相對於 value 不足的位數
會以 0 補齊。 - 將字串型態的數字貨幣或百分比轉為數字型態
Syntax 1: 無本體內容
Syntax 2: 本體內容為欲轉換之字串
欲轉換之字串
屬性 名稱 說明 EL 型態 是否必須 預設值value 欲格式化的字串 Y String/Number 否 無 type 指定單位(數字、當地貨幣
或百分比) Y String 否 number
pattern 格式化數字的樣式 Y String 否 無 parseLocale 用來取代預設的地區設定 Y String/java.util.Locale 否 無 integerOnly 是否只顯示整數 Y boolean 否 false Var 儲存以格式化之數字 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
當欲格式化的字串為貨幣金額時,則 type 要選擇 currency,會只輸出金額。 關於 pattern 屬性的設定,可參考 J2SE 的 API 中 java.text.DecimalFormat 類
別說明。例如輸入字串為 25%,可用 pattern 轉成數字 0.25
- 格式化日期時間
Syntax:
-
Web Development Part IX JSP 標準標籤庫-JSTL 22
[pattern=”customPattern”]
[dateStyle=”{default|short|medium|long|full}”]
[timeStyle=”{default|short|medium|long|full}”]
[timeZone=”timeZone”]
[var=”varName”]
[scope=”{page|request|session|application}”] />
屬性 名稱 說明 EL 型態 是否必須 預設值value 欲格式化的日期時間 Y Java.util.Date 否 無 Type 顯示的部份(日期、時間或
兩者皆顯示) Y String 否 date
pattern 格式化日期時間的樣式 Y String 否 無 dateStyle 設定日期部分的顯示方式 Y String 否 defaulttimeStyle 設定時間部分的顯示方式 Y String 否 defaulttimeZone 設定使用的時區 Y String/java.util.TimeZone 否 無 Var 儲存以格式化之數字 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
時間的格式可參考 Java API 文件 java.text.SimpleDateFormat 類別的說明。 - 將字串型態的時間或日期都轉為日期時間型態
Syntax 1: 無本體內容
Syntax 2: 本體內容為欲轉換之字串
-
Web Development Part IX JSP 標準標籤庫-JSTL 23
欲轉換之日期或時間型態的字串
屬性 名稱 說明 EL 型態 是否必須 預設值value 欲格式化的日期時間 Y java.util.Date 否 無 Type 顯示的部份(日期、時間或
兩者皆顯示) Y String 否 date
pattern 格式化日期時間的樣式 Y String 否 無 dateStyle 設定日期部分的顯示方式 Y String 否 defaulttimeStyle 設定時間部分的顯示方式 Y String 否 defaulttimeZone 設定使用的時區 Y String/java.util.TimeZone 否 無 parseLocale 用來取代預設的地區設定 Y String/java.util.Locale 否 無 var 儲存以格式化之數字 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
- 設定預設時區或是將時區儲存至屬性範圍中
Syntax:
屬性 名稱 說明 EL 型態 是否必須 預設值value 使用的時區 Y String/java.util.TimeZone 否 無 Var 儲存設定的時區 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
- 設定暫時的時區
Syntax:
屬性 名稱 說明 EL 型態 是否必須 預設值value 使用的時區 Y String/java.util.TimeZone 是 無
Example: JSTLi18nDataFormat.jsp
JSTL for i18n Data Format
-
Web Development Part IX JSP 標準標籤庫-JSTL 24
Using fmt:formatNumber
${number}
Using fmt:parseNumber
${money}
Using fmt:formatDate - PST timezone
${today}
Using fmt:parseDate
-
Web Development Part IX JSP 標準標籤庫-JSTL 25
SQL 標籤庫(SQL Tags)
JSTL 中提供與資料庫有關的標籤來查詢或修改資料庫內容,等於是在 MVC 架構的顯示層中直接存取資料庫,但並無 ConnectionPool 的功能,較適合小型的網站。其主要的功能如下:
功能分類 標籤名稱 設定資料庫連線 setDataSource SQL 存取指令 query, update, param, dateParam, transaction
使用核心標籤庫時使用指令,並設定 prefix 和 uri 值如下
設定資料庫連線
安裝驅動程式檔-在伺服器共用程式資料夾(以 Tomcat 為例,為 common\lib)配置MySQL 與 Oracle 資料庫 JDBC 連線檔案
MySQL 目前提供的驅動程式名字為 Connection/J,可從 MySQL 的網站下載(http://dev.mysql.com/downloads/connector/)。以版本 mysql-connector-java-3.1.10為例,將下載的 ZIP 檔解壓縮之後,在資料夾 mysql-connector-java-3.1.10 中可找到 mysql-connector-java-3.1.10-bin.jar 檔,所有驅動程式所需要的類別都在這檔案裡面,將這個檔案放在上述之路徑下。
在安裝 Oracle Database Server 或是 Client 的時候,安裝程式會一起安裝 Oracle的 JDBC 驅動程式,只要在 Oracle 安裝的目錄下就可以找到 Oracle 的 JDBC 驅動程式,不過也可以在 Oracle 的網站上下載 Oracle 的 JDBC 驅動程式。網址是: http://www.oracle.com/technology/products/oracle9i/index.html 以 Windows 為例,Oracle 的 JDBC 驅動程式為 classes12.jar 的 JAR 檔案,如果Oracle 安裝目錄為 C:\oracle,而 classes12.jar 檔案就放置在C:\oracle\ora92\jdbc\lib 的路徑下,將這個檔案放在上述之路徑下。
- 設定資料來源 Syntax 1: 直接連線至已存在的資料來源
-
Web Development Part IX JSP 標準標籤庫-JSTL 26
driver JDBC 驅動程式類別名稱
Y String 否 無
url 資料庫的 URL Y String 否 無 user 資料庫使用者名稱 Y String 否 無 password 資料庫使用者密碼 Y String 否 無 var 儲存資料來源 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
主要的資料庫如 Oracle, MySQL 的 JDBC 驅動程式的設定如下 MySQL – driver=”com.mysql.jdbc.Driver” Oracle – driver=”oracle.jdbc.driver.OracleDriver”
主要的資料庫如 Oracle, MySQL 的 URL 如下 令 MySQL 資料庫名稱為 TEST,連線位址為 localhost:3306,則
url=”jdbc:mysql://localhost:3306/TEST” 令 Oracle 資料庫名稱為 DBTEST,連線位址為 localhost:1521,則
url=”jdbc:oracle:thin:@localhost:1521:DBTEST” 令 Oracle 資料庫建立了服務名稱為 dbtest_localhost,則
url=” jdbc:oracle:oci:@dbtest_localhost” SQL 存取指令
- 查詢資料庫的資料 Syntax 1: 沒有本體內容
Syntax 2: 本體內容為查詢指令
……SQL Query Statement
屬性 名稱 說明 EL 型態 是否必須 預設值dataSource 資料來源 Y String/javax.sql.DataSource 否 無 sql SQL 語法 Y String 否 無 maxRows 設定最多可暫存的資
料筆數 Y String 否 無
startRows 設定資料第幾筆開始 Y String 否 0
-
Web Development Part IX JSP 標準標籤庫-JSTL 27
var 儲存資料來源 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
查詢的結果都會儲存在 var 所定義的變數字串中,共有以下五個數性: 屬性名稱 說明 rows 以欄位名稱當作索引的查詢結果 rowByIndex 以數字當作索引的查詢結果 columnNames 欄位名稱 rowCount 查詢到的資料筆數 limitedByMaxRows 取出最大資料筆數的限制
- 修改資料庫的資料 Syntax 1: 無本體內容
Syntax 2: 本體內容為 DML 修改指令
……SQL Insert, Delete, Update… Statement
屬性 名稱 說明 EL 型態 是否必須 預設值dataSource 資料來源 Y String/javax.sql.DataSource 否 無 sql SQL 之 DML 語法 Y String 否 無 maxRows 設定最多可暫存的資
料筆數 Y String 否 無
startRows 設定資料第幾筆開始 Y String 否 0 var 儲存資料來源 N String 否 無 scope var 變數的 JSP 範圍 N String 否 Page
Example: JSTLSQLQuery.jsp(使用表格為 Oracle 資料庫 scott/tiger 之 dept 與 emp)
JSTL: SQL action examples
SQL Query Example
-
Web Development Part IX JSP 標準標籤庫-JSTL 28
SELECT * FROM dept
SELECT * FROM dept
Rows Count: ${rs.rowCount}
${rs.columnNames[0]}
${rs.columnNames[1]}
${rs.columnNames[2]}
${row.deptno}
${row.dname}
${row.loc}
SELECT empno, ename, job, hiredate, sal, deptno FROM emp
SELECT empno, ename, job, hiredate, sal, deptno FROM emp
Rows Count: ${rs.rowCount}
${item}
-
Web Development Part IX JSP 標準標籤庫-JSTL 29
${item}
SQL UPDATE Example
INSERT INTO dept VALUES (60,'SHIPPING','SAN FRANCISCO')
INSERT INTO dept VALUES (60,'SHIPPING','SAN FRANCISCO')
UPDATE dept SET dname='HEADQURTER' WHERE deptno=50
UPDATE dept SET dname='HEADQURTER' WHERE deptno=50
DELETE FROM dept WHERE deptno=90
DELETE FROM dept WHERE deptno=90
SELECT * FROM dept
SELECT * FROM dept
Rows Count: ${rs.rowCount}
${item}
${row[0]}
${row[1]}
${row[2]}
-
Web Development Part IX JSP 標準標籤庫-JSTL 30
與 - 動態設定 SQL 語句變數 Syntax 1: 使用無本體內容之 param
Syntax 2: 使用有本體內容之 param
value
Syntax 3: 使用 dateParam
屬性 名稱 說明 EL 型態 是否必須 預設值 value Obeject 或 Date 型態之參數
(視 param 或 dateParam 而定)Y Object/java.util.date 是 無
type Date 的種類 Y String 否 timestamp Example: 依據上述之查詢語法,使用動態查詢方式為
:
SELECT * FROM dept
WHERE deptno>?
OR dname=?
:
例中之動態變數${param.deptno}與${param.dname}則是從網頁端傳入的參數,JSTL 會依對應之問號(?)出現的先後順序自動將參數分派。
- 提供存取資料時之交易安全機制
Syntax:
or
屬性
-
Web Development Part IX JSP 標準標籤庫-JSTL 31
名稱 說明 EL 型態 是否必須 預設值dataSource 資料來源 Y String/javax.sql.DataSource 否 無 isolation 交易互不干擾等級 Y String 否 無
同一時間查詢、修改資料的動作大量增加時,很容易就會發生資料不一致的問題。例如從某個帳戶轉帳到另一個帳戶,如果扣完錢以後伺服器突然掛掉,那
麼這筆錢從第一個帳戶扣款,但卻沒有轉到另一個帳戶,此時將會使這筆金錢
憑空消失。因此 JSTL 提供一些安全機制來保護這些交易的行為。 如果當的本體內容有錯誤發生時,將不會執行任何一個 SQL
語句,所以可以保障交易機制的安全性。 isolation 屬性主要在設定交易的安全等級,可以預防許多常見的錯誤。JDBC
支援了四種交易模式,而也提供此四種功能, 互不干擾等級 Dirty Reads? Nonrepeatable Reads? Phantom Reads? read_uncommitted - - - read_committed 預防 - - repeatable_read 預防 預防 - serializable 預防 預防 預防
實作架構如下
:
:
:
:
:
函式標籤庫(Function Tags)
函式標籤庫大部分都是用來處理字串用的,主要有 fn:contains() fn:join() fn:startWith() fn:endsWith()
fn:indexOf() fn:substring() fn:escapeXml() fn:trim()
fn:toUpperCase() fn:toLowerCase() fn:containsIgnoreCase()
fn:substringAfter() fn:split() fn:replace() fn:length()
使用核心標籤庫時使用指令,並設定 prefix 和 uri 值如下
-
Web Development Part IX JSP 標準標籤庫-JSTL 32
標籤使用方法 -
判斷字串 substring 是否在字串 string 之中,傳回 boolean
- 不管大小寫的情況下判斷字串 substring 是否在字串 string 之中,傳回 boolean
- 將字串 string 轉換為大寫字元,傳回 String
- 將字串 string 轉換為小寫字元,傳回 String
- 將字串 inputString 中的某些子字串 beforeString 取代為另一字串 afterString,
取代後的字串以 String 傳回
- 回傳字串 substring 在字串 string 中第一次出現的位置,傳回 int
- 判斷字串 string 是否以 prefix 字串作為開頭,傳回 boolean
- 判斷字串 string 是否以 suffix 字串作為結尾,傳回 boolean
- 擷取字串 string 中的某一子字串(從 beginIndex 取到 endIndex),傳回 String
- 擷取字串 string 中某子字串 substring 之前的字,傳回 String
- 擷取字串 string 中某子字串 substring 之後的字,傳回 String
- 將字串 string 以 delimiters 分離成字串陣列,傳回 String[]
- 去除字串的前後空白,傳回 String
- 將陣列 array 中全部的元素以指定字串 separator作為結合,回傳結合後的字串,傳回 String
- 轉換跳脫字元(如)為 Entity 碼(如<、>),傳回 String
- 回傳一集合物件或字串 input 的數量或字元數,傳回 int
Example: JSTLFnTest.jsp
-
Web Development Part IX JSP 標準標籤庫-JSTL 33
JSTL Functions
\${fn:contains(string, substring)}
Input String
Substring
Result
${s1}
castle
${fn:contains(s1, "castle")}
${s1}
CASTLE
${fn:contains(s1, "CASTLE")}
${s1}
null
${fn:contains(s1, undefined)}
${s1}
empty string
${fn:contains(s1, "")}
null
castle
-
Web Development Part IX JSP 標準標籤庫-JSTL 34
${fn:contains(undefined, "castle")}
null
empty string
${fn:contains(undefined, "")}
\${fn:containsIgnoreCase(string, substring)}
Input String
Substring
Result
${s1}
castle
${fn:containsIgnoreCase(s1, "castle")}
${s1}
CASTLE
${fn:containsIgnoreCase(s1, "CASTLE")}
${s1}
CaStLe
${fn:containsIgnoreCase(s1, "CaStLe")}
${s1}
null
${fn:containsIgnoreCase(s1, undefined)}
-
Web Development Part IX JSP 標準標籤庫-JSTL 35
${s1}
empty string
${fn:containsIgnoreCase(s1, "")}
null
castle
${fn:containsIgnoreCase(undefined, "castle")}
null
empty string
${fn:containsIgnoreCase(undefined, "")}
\${fn:indexOf(string, substring)}
Input String
Substring
Result
${s1}
castle
${fn:indexOf(s1, "castle")}
${s1}
cloud
${fn:indexOf(s1, "cloud")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 36
${s1}
null
${fn:indexOf(s1, undefined)}
${s1}
empty string
${fn:indexOf(s1, "")}
null
castle
${fn:indexOf(undefined, "castle")}
null
empty string
${fn:indexOf(undefined, "")}
\${fn:startsWith(string, prefix)}
Input String
Substring
Result
${s1}
castle
${fn:startsWith(s1, "castle")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 37
${s1}
There is
${fn:startsWith(s1, "There is")}
${s1}
null
${fn:startsWith(s1, undefined)}
${s1}
empty string
${fn:startsWith(s1, "")}
null
castle
${fn:startsWith(undefined, "castle")}
null
empty string
${fn:startsWith(undefined, "")}
\${fn:endsWith(string, suffix)}
Input String
Substring
Result
-
Web Development Part IX JSP 標準標籤庫-JSTL 38
${s1}
castle
${fn:endsWith(s1, "castle")}
${s1}
cloud
${fn:endsWith(s1, "cloud")}
${s1}
null
${fn:endsWith(s1, undefined)}
${s1}
empty string
${fn:endsWith(s1, "")}
null
castle
${fn:endsWith(undefined, "castle")}
null
empty string
${fn:endsWith(undefined, "")}
\${fn:substring(string, beginIndex, endIndex)}
-
Web Development Part IX JSP 標準標籤庫-JSTL 39
Input String
beginIndex
endIndex
Result
${zip}
6
-1
P.O. Box: ${fn:substring(zip, 6, -1)}
${s1}
11
17
${fn:substring(s1, 11, 17)}
${s1}
12
5
${fn:substring(s1, 12, 5)}
${s1}
23
-1
${fn:substring(s1, 23, -1)}
${s1}
23
999
${fn:substring(s1, 23, 999)}
${s1}
-1
-
Web Development Part IX JSP 標準標籤庫-JSTL 40
-1
${fn:substring(s1, -1, -1)}
${s1}
99
12
${fn:substring(s1, 99, 12)}
empty string
2
6
${fn:substring("", 2, 6)}
null
2
6
${fn:substring(undefined, 2, 6)}
\${fn:substringAfter(string, substring)}
Input String
substring
Result
${zip}
-
P.O. Box: ${fn:substringAfter(zip, "-")}
${s1}
There
-
Web Development Part IX JSP 標準標籤庫-JSTL 41
${fn:substringAfter(s1, "There")}
${s1}
on a
${fn:substringAfter(s1, "on a")}
${s1}
not found
${fn:substringAfter(s1, "not found")}
${s1}
null
${fn:substringAfter(s1, undefined)}
${s1}
empty string
${fn:substringAfter(s1, "")}
empty string
castle
${fn:substringAfter("", "castle")}
null
castle
${fn:substringAfter(undefined, "castle")}
null
empty string
${fn:substringAfter(undefined, "")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 42
\${fn:substringBefore(string, substring)}
Input String
substring
Result
${zip}
-
Zip without P.O. Box: ${fn:substringBefore(zip, "-")}
${s1}
on a
${fn:substringBefore(s1, "on a")}
${s1}
castle
${fn:substringBefore(s1, "castle")}
${s1}
null
${fn:substringBefore(s1, undefined)}
${s1}
empty string
${fn:substringBefore(s1, "")}
empty string
castle
${fn:substringBefore("", "castle")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 43
null
castle
${fn:substringBefore(undefined, "castle")}
null
empty string
${fn:substringBefore(undefined, "")}
\${fn:split(string, delimiters)}
\${fn:join(array, separator)}
Input Array
Separator
Result
${s1}
+
${fn:join(a1, " + ")}
${s1}
${fn:join(a1, " ")}
${s1}
empty string
${fn:join(a1, "")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 44
${s1}
null
${fn:join(a1, null)}
null
empty string
${fn:join(null, "")}
\${fn:escapeXml(string)}
Input String
Result
${s1}
${fn:escapeXml(s1)}
body of foo
${fn:escapeXml("body of foo")}
null
${fn:escapeXml(undefined)}
empty string
${fn:escapeXml("")}
-
Web Development Part IX JSP 標準標籤庫-JSTL 45