JSP標準標籤庫(JSTL)是一個JSP標籤集合,它封裝了JSP應用的通用核心功能。
JSTL支持通用的、結構化的任務,比如迭代,條件判斷,XML文檔操作,國際化標籤,SQL標籤。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標籤。
根據JSTL標籤所提供的功能,可以將其分爲5個類別。
- 核心標籤
- 格式化標籤
- SQL 標籤
- XML 標籤
- JSTL 函數
核心標籤
核心標籤是最常用的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:out>標籤
輸出常量或者域範圍中的變量(value屬性,使用EL表達式)
輸出默認值(default屬性)
默認HTML標籤不轉義(escapeXml)
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
value | true | Object | 指定要輸出的內容 |
escapeXml | true | Boolean | 指定是否將>、<、&、'、" 等特殊字符進行HTML編碼轉換後再進行輸出。默認值是true。 |
default | true | Object | 指定如果value屬性的值爲null時所輸出的默認值 |
<c:set>標籤
- 向4個域中存入值。(var value scope屬性)
- 設置Web域中的java.util.Map 類型的屬性對象或JavaBean類型的屬性對象的屬性(target property value屬性)
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
value | true | Object | 用於指定屬性 |
var | false | String | 用於指定要設置的Web域屬性的名稱 |
scope | false | String | 用於指定屬性所在的Web域 |
target | true | Object | 用於指定要設置屬性的對象,這個對象必須是 JavaBean對象或java.util.Map對象 |
property | true | String | 用於指定當前要爲對象設置的屬性名稱 |
<c:catch>標籤
- <c:catch>標籤用於捕獲嵌套在標籤中的內容拋出的異常,其語法格式如下:<c:catch [var="varName"]> nested actions </c:catch>
- var屬性用於標識<c:catch>標籤捕獲的異常對象,它將保存在page這個web域中。
<c:if>標籤
if標籤的test屬性必須是一個boolean類型的值,如果test的值爲true,那麼執行if標籤的內容,否則不執行。
<c:if test="${not empty a }">
<c:out value="${a }"/>
</c:if>
<c:choose>標籤
<c:choose>標籤用於指定多個條件選擇的組合邊界,它必須與<c:when>和<c:otherwise>標籤一起使用。使用<c:choose>,<c:when>,<c:otherwise>三個標籤,可以構造類似於"if-else if-else"的複雜條件判斷結構
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count“ /> pageContext(count,2)
<c:choose>
<c:when test="${count == 0}">
對不起,沒有符合您要求的記錄。
</c:when>
<c:otherwise>
符合您要求的記錄共有${count}條.
</c:otherwise>
</c:choose>
<c:forEach>標籤
<c:forEach>標籤用於對一個集合對象中的元素進行循環迭代操作,或者按指定的次數重複迭代執行標籤體中的內容
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
var | false | String | 指定將當前迭代到的元素保存到page這個域中的屬性名稱 |
varStatus | false | String | 記住用於保存迭代信息的對象 |
items | true | 任何支持的類型 | 將要迭代的集合對象 |
begin | true | int | 如果指定items屬性,就從集合中的第begin個元素開始進行迭代 ,begin的索引值從0開始編號,如果沒有指定items屬性,就從 begin指定的值開始迭代,直到end值時結束迭代 |
end | true | int | 與begin屬性類似 |
step | true | int | 指定迭代的步長,即迭代因子的迭代增量 |
<c:forEach>遍歷集合
遍歷數組或者集合:
var:代表遍歷的每一個元素
items:要迭代的集合對象
獲取遍歷的內容:${ xxx }
遍歷Map集合:
var:代表key與value的關係entry
items:要迭代的map集合
獲取遍歷的內容:${ xxx.key } ----${ xxx.value }
遍歷對象集合:
var:代表遍歷的每一個對象
items:要迭代的集合
獲取遍歷的內容: ${ xxx.對象的屬性 }
<c:forEach>迭代數據
從1遍歷到10:
var:定義變量
begin:從哪開始
end:到哪結束
step:迭代步長(相當於x+=step)
計算從1加到10的和:
定義變量sum,值爲0
通過forEach循環1到10,每循環一次加到另一個變量中
在循環中間定義變量,每次計算到該變量中
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach begin="1" end="10" step="1" var="i">
<c:set var="sum" value="${sum + i}" scope="page"></c:set>
</c:forEach>
${sum }
varStatus屬性:
記錄迭代相關的信息:
屬性 | 類型 | 意義 |
index | number | 現在指到成員的索引 |
count | number | 總共指到成員的總數 |
first | boolean | 現在指到的成員是否是第一個成員 |
last | boolean | 現在指到的成員是否是最後一個成員 |
遍歷10到100的偶數,每到第三個數,顯示紅色:
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count % 3 == 0}">
<font color="red">${i }</font>
</c:if>
<c:if test="${status.count % 3 != 0}">
<font color="blue">${i }</font>
</c:if>
</c:forEach>
<c:forTokens>標籤
用來切分字符串
名稱 | 說明 | EL | 類型 | 必須 | 默認值 |
var | 用來存放現在指到的成員 | N | String | 否 | 無 |
items | 被迭代的字符串 | Y | String | 是 | 無 |
delims | 定義用來分割字符串的字符 | N | String | 是 | 無 |
varStatus | 用來存放現在指到的相關成員信息 | N | String | 否 | 無 |
begin | 開始的位置 | Y | int | 否 | 0 |
end | 結束的位置 | Y | int | 否 | 最後一個成員 |
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set>
<c:forTokens items="${s}" delims="," var="e">
${e }
</c:forTokens>
語法格式:
<c:forTokens
items=要切分的字符串
delims=按着什麼格式切分
var=定義變量
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//body內容
</c:forTokens>
<c:import>標籤
名稱 | 說明 | EL | 類型 | 必須 | 默認值 |
url | 一文件被包含的地址 | Y | String | 是 | 無 |
context | 項目虛擬路徑 | Y | String | 否 | 無 |
var | 儲存被包含的文件的內容(以String類型存入) | Y | String | 否 | 無 |
scope | var變量的JSP範圍 | N | String | 否 | page |
charEncoding | 被包含文件的內容的編碼方式 | Y | String | 否 | 無 |
varReader | 儲存被包含的文件的內容(以Reader類型存入) | N | String | 否 | 無 |
<!-- 引入foreach.jsp 效果類似包含-->
<c:import url="/jstl/foreach.jsp" context="/day8"></c:import>
<hr/>
<!-- 引入不顯示,將內容保存另一個變量中 -->
<c:import url="/jstl/foreach.jsp" context="/day8" var="content" scope="page"></c:import>
${content }
<c:import url="http://java.sun.com" >
<c:param name="test" value="1234" />
</c:import>
<c:url>標籤
<c:url>標籤用於在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識以參數形式附加在URL地址後面。(類似於Session追蹤 尤其是當瀏覽器禁用cookie後,就是說實現了session追蹤的功能)
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
value | true | String | 指定要構造的URL |
var | false | String | 指定將構造出的URL結果保存到Web域中的屬性名稱 |
scope | false | String | 指定將構造出的URL結果保存在哪個域中 |
<c:redirect>標籤
<c:redirect>標籤用於實現請求重定向
屬性名 | 是否支持EL | 屬性類型 | 屬性描述 |
url | true | String | 指定要轉發或重定向到的目標資源的URL地址 |
context | true | String | 當要使用相對路徑重定向到同一個服務器下的其他WEB應用程序中的 資源時,context屬性指定其他WEB應用程序的名稱 |
注意:如果重定向第三方的網站時要使用絕對路徑(不能再使用Context)
<%
// 以前重定向
// response.sendRedirect("/day12/index.jsp");
%>
<c:redirect url="/index.jsp" context="/day12"></c:redirect>
格式化標籤
JSTL格式化標籤用來格式化並輸出文本、日期、時間、數字。引用格式化標籤庫的語法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
標籤 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化數字 |
<fmt:parseNumber> | 解析一個代表着數字,貨幣或百分比的字符串 |
<fmt:formatDate> | 使用指定的風格或模式格式化日期和時間 |
<fmt:parseDate> | 解析一個代表着日期或時間的字符串 |
<fmt:bundle> | 綁定資源 |
<fmt:setLocale> | 指定地區 |
<fmt:setBundle> | 綁定資源 |
<fmt:timeZone> | 指定時區 |
<fmt:setTimeZone> | 指定時區 |
<fmt:message> | 顯示資源配置文件信息 |
<fmt:requestEncoding> | 設置request的字符編碼 |
<fmt:formatNumber> 使用指定的格式或精度格式化數字
語法:
<fmt:formatNumber value="" type="currency" [pattern=""] [currencyCode=""] [currencySymbol=""] [groupingUsed=""] [maxIntegerDigits=""] [minIntegerDigits=""] [maxFractionDigits=""] [minFractionDigits=""] [var=""] [scope=""]>
<fmt:formatNumber value="" [type="currency|number|percent"] [pattern=""] [groupingUsed=""] [maxIntegerDigits=""] [minIntegerDigits=""] [maxFractionDigits=""] [minFractionDigits=""] [var=""] [scope=""]>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的數字 | 是 | 無 |
type | NUMBER,CURRENCY,或 PERCENT類型 | 否 | Number |
pattern | 指定一個自定義的格式化模式用與輸出 | 否 | 無 |
currencyCode | 貨幣碼(當type="currency"時) | 否 | 取決於默認區域 |
currencySymbol | 貨幣符號 (當 type="currency"時) | 否 | 取決於默認區域 |
groupingUsed | 是否對數字分組 (TRUE 或 FALSE) | 否 | true |
maxIntegerDigits | 整型數最大的位數 | 否 | 無 |
minIntegerDigits | 整型數最小的位數 | 否 | 無 |
maxFractionDigits | 小數點後最大的位數 | 否 | 無 |
minFractionDigits | 小數點後最小的位數 | 否 | 無 |
var | 存儲格式化數字的變量 | 否 | Print to page |
scope | var屬性的作用域 | 否 | page |
eg:
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="balance" value="120000.2394" />
<c:out value="${balance}" />
<p>Formatted Number (1):
<fmt:formatNumber value="${balance}" type="currency" />
</p>
<p>Formatted Number (2):
<fmt:formatNumber value="${balance}" type="number" maxIntegerDigits="3" />
</p>
<p>Formatted Number (3):
<fmt:formatNumber value="${balance}" type="number" maxFractionDigits="3" />
</p>
<p>Formatted Number (4):
<fmt:formatNumber value="${balance}" type="number" groupingUsed="false" />
</p>
<p>Formatted Number (5):
<fmt:formatNumber value="${balance}" type="percent" maxIntegerDigits="2" />
</p>
<p>Formatted Number (6):
<fmt:formatNumber value="${balance}" type="percent" maxFractionDigits="1" />
</p>
<p>Formatted Number (7):
<fmt:formatNumber value="${balance}" type="percent" minFractionDigits="3" />
</p>
<p>Formatted Number (8):
<fmt:formatNumber value="${balance}" type="number" pattern="##.###E00" />
</p>
<p>Currency in USA:
<fmt:setLocale value="en_US" />
<fmt:formatNumber value="${balance}" type="currency" />
</p>
</body>
</html>
//結果輸出爲:
120000.2394
Formatted Number (1): ¥120,000.24
Formatted Number (2): 000.239
Formatted Number (3): 120,000.239
Formatted Number (4): 120000.239
Formatted Number (5): 24%
Formatted Number (6): 12,000,023.9%
Formatted Number (7): 12,000,023.940%
Formatted Number (8): 12E04
Currency in USA: $120,000.24
<fmt:parseNumber> 解析一個代表着數字,貨幣或百分比的字符串
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要解析的數字 | 否 | Body |
type | NUMBER,,CURRENCY,或 PERCENT | 否 | number |
parseLocale | 解析數字時所用的區域 | 否 | 默認區域 |
integerOnly | 是否只解析整型數(true)或浮點數(false) | 否 | false |
pattern | 自定義解析模式 | 否 | 無 |
timeZone | 要顯示的日期的時區 | 否 | 默認時區 |
var | 存儲待解析數字的變量 | 否 | Print to page |
scope | var屬性的作用域 | 否 | page |
eg:
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="balance" value="125003.350" />
<fmt:parseNumber value="${balance}" var="i" type="number" />
<p>Parsed Number(1):<c:out value="${i}" /></p>
<fmt:parseNumber value="${balance}" var="i" type="number" integerOnly="true" />
<p>Parsed Number(2):<c:out value="${i}" />
</body>
</html>
//結果輸出爲:
Parsed Number(1):125003.35
Parsed Number(2):125003
<fmt:formatDate> 使用指定的風格或模式格式化日期和時間
語法:<fmt:formatDate value="" [type="date|time|both"]>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的日期 | 是 | 無 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定義格式模式 | 否 | 無 |
timeZone | 顯示日期的時區 | 否 | 默認時區 |
var | 存儲格式化日期的變量名 | 否 | 顯示在頁面 |
scope | 存儲格式化日誌變量的範圍 | 否 | 頁面 |
格式:
代碼 | 描述 | 實例 |
---|---|---|
G |
時代標誌 |
AD |
y |
不包含紀元的年份。如果不包含紀元的年份小於 10,則顯示不具有前導零的年份。 |
2002 |
M |
月份數字。一位數的月份沒有前導零。 |
April & 04 |
d |
月中的某一天。一位數的日期沒有前導零。 |
20 |
h |
12 小時制的小時。一位數的小時數沒有前導零。 |
12 |
H |
24 小時制的小時。一位數的小時數沒有前導零。 |
0 |
m |
分鐘。一位數的分鐘數沒有前導零。 |
45 |
s |
秒。一位數的秒數沒有前導零。 |
52 |
S |
毫秒 |
970 |
E |
周幾 |
Tuesday |
D |
一年中的第幾天 |
180 |
F |
一個月中的第幾個周幾 |
2 (一個月中的第二個星期三) |
w |
一年中的第幾周r |
27 |
W |
一個月中的第幾周 |
2 |
a |
a.m./p.m. 指示符 |
PM |
k |
小時(12 小時制的小時) |
24 |
K |
小時(24 小時制的小時) |
0 |
z |
時區 |
中部標準時間 |
' |
轉義文本 |
|
'' |
單引號 |
eg:
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="now" value="<%=new java.util.Date() %>" />
<p>Formatted Date (1):
<fmt:formatDate value="${now}" type="time" />
</p>
<p>Formatted Date (2):
<fmt:formatDate value="${now}" type="date" />
</p>
<p>Formatted Date (3):
<fmt:formatDate value="${now}" type="both" />
</p>
<p>Formatted Date (4):
<fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short" />
</p>
<p>Formatted Date (5):
<fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="medium" />
</p>
<p>Formatted Date (6):
<fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="short" />
</p>
<p>Formatted Date (7):
<fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long" />
</p>
<p>pattern:
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" />
</p>
</body>
</html>
//結果輸出爲:
Formatted Date (1): 11:55:11
Formatted Date (2): 2016-5-14
Formatted Date (3): 2016-5-14 11:55:11
Formatted Date (4): 16-5-14 上午11:55
Formatted Date (5): 2016-5-14 11:55:11
Formatted Date (6): 2016-5-14 上午11:55
Formatted Date (7): 2016年5月14日 上午11時55分11秒
pattern: 2016-05-14
<fmt:parseDate> 解析一個代表着日期或時間的字符串
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 要顯示的日期 | 是 | 無 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定義格式模式 | 否 | 無 |
timeZone | 顯示日期的時區 | 否 | 默認時區 |
var | 存儲格式化日期的變量名 | 否 | 顯示在頁面 |
scope | 存儲格式化日誌變量的範圍 | 否 | 頁面 |
eg:
<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="now" value="20-10-2010" />
<fmt:parseDate value="${now }" pattern="dd-MM-yyyy" type="date" dateStyle="short"/>
<%-- <p>Parse Date:<c:out value="${parsedEmpDate}" /></p> --%>
</body>
</html>
//結果輸出爲:
Wed Oct 20 00:00:00 CST 2010
<fmt:bundle> 綁定資源
資源束包含區域特定對象。資源束包含鍵值對。
當程序需要區域特定資源時,可以將所有的關鍵詞對所有的locale共享,也可以爲locale指定轉換後的值。資源束可以幫助提供指定的locale的內容。
一個Java資源束文件包含一系列的鍵值對。所需類繼承自java.util.ListResourceBundle類。類編譯後放在Web應用程序的CLASSPATH中。
語法:<fmt:bundle basename="basename" [prefix="keypre"]>
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
basename | 指定被載入的資源束的基礎名稱 | 是 | 無 |
prefix | 指定<fmt:message>標籤key屬性的前綴 | 否 | 無 |
eg: 1.java資源束創建部分
package com.tutorialspoint;
import java.util.ListResourceBundle;
public class Example_En extends ListResourceBundle{
static final Object[][] contents={
{"count.one","One"},
{"count.two","Two"},
{"count.three","Three"}
};
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}
}
2.資源束使用部分
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<fmt:bundle basename="com.tutorialspoint.Example_En" prefix="count.">
<fmt:message key="one" /><br>
<fmt:message key="two" /><br>
<fmt:message key="three" /><br>
</fmt:bundle>
<fmt:bundle basename="com.tutorialspoint.Example_En">
<fmt:message key="count.one" /><br>
<fmt:message key="count.two" /><br>
<fmt:message key="count.three" /><br>
</fmt:bundle>
</body>
</html>
//結果輸出爲:
One
Two
Three
One
Two
Three
<fmt:setLocale> 指定地區(將給定的區域存儲在locale配置變量中)
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 指定ISO-639 語言碼和ISO-3166 國家碼 | 是 | en_US |
variant | 特定瀏覽器變體 | 否 | 無 |
scope | Locale配置變量的作用域 | 否 | Page |
eg:1.java資源束創建部分Example_en_US
package com.tutorialspoint;
import java.util.ListResourceBundle;
public class Example_en_US extends ListResourceBundle{
static final Object[][] contents={
{"count.one","One"},
{"count.two","Two"},
{"count.three","Three"}
};
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}
}
2.java資源束創建部分Example_es_ES
package com.tutorialspoint;
import java.util.ListResourceBundle;
public class Example_es_ES extends ListResourceBundle{
static final Object[][] contents={
{"count.one","Uno"},
{"count.two","Dos"},
{"count.three","Tres"}
};
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}
}
3.資源束使用部分
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <fmt:bundle basename="com.tutorialspoint.Example" prefix="count."> <fmt:message key="one" /><br> <fmt:message key="two" /><br> <fmt:message key="three" /><br> </fmt:bundle> <fmt:setLocale value="es_ES" /> <fmt:bundle basename="com.tutorialspoint.Example"> <fmt:message key="count.one" /><br> <fmt:message key="count.two" /><br> <fmt:message key="count.three" /><br> </fmt:bundle> </body> </html>
//結果輸出爲: One Two Three Uno Dos Tres
<fmt:setBundle> 綁定資源(載入一個資源束,然後存儲在作用域中已命名的變量或bundle配置變量中)類似於<fmt:bundle>
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
basename | 資源束家族基礎名稱,暴露給作用域變量或配置變量 | 是 | 無 |
var | 存儲新資源束的變量 | 否 | Replace default |
scope | 變量的作用域 | 否 | Page |
eg:
1.java資源束創建部分Example_es_ES
package com.tutorialspoint; import java.util.ListResourceBundle; public class Example_es_ES extends ListResourceBundle{ static final Object[][] contents={ {"count.one","Uno"}, {"count.two","Dos"}, {"count.three","Tres"} }; @Override protected Object[][] getContents() { // TODO Auto-generated method stub return contents; } }
2.資源束使用部分
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <fmt:setLocale value="es_ES" /> <fmt:setBundle basename="com.tutorialspoint.Example" var="lang" /> <fmt:message key="count.one" bundle="${lang}"/><br> <fmt:message key="count.two" bundle="${lang}"/><br> <fmt:message key="count.three" bundle="${lang}"/><br> </body> </html>
//結果輸出爲: Uno Dos Tres
<fmt:timeZone> 指定時區
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 時區 | 是 | 無 |
eg:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <c:set var="now" value="<%=new java.util.Date() %>" /> <p>當前時間: <fmt:formatDate value="${now}" type="both" timeStyle="medium" dateStyle="medium" /> </p> <p>時區爲 GMT-8 : <fmt:timeZone value="GMT-8"> <fmt:formatDate value="${now}" type="both" /> </fmt:timeZone> </p> </body> </html>
//結果輸出爲:
當前時間: 2016-5-18 20:54:04
時區爲 GMT-8 : 2016-5-18 4:54:04
<fmt:setTimeZone> 用來複制一個時區對象至指定的作用域,類似於<fmt:timeZone>
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 時區 | 是 | 無 |
var | 存儲新時區的變量名 | 否 | Replace default |
scope | 變量的作用域 | 否 | Page |
eg:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <c:set var="now" value="<%=new java.util.Date() %>" /> <p>當前時間: <fmt:formatDate value="${now}" type="both" timeStyle="medium" dateStyle="medium" /> </p> <p>時區爲 GMT-8 : <fmt:setTimeZone value="GMT-8" /> <fmt:formatDate value="${now}" type="both" /> </p> </body> </html>
//結果輸出爲:
當前時間: 2016-5-18 20:54:04
時區爲 GMT-8 : 2016-5-18 4:54:04
<fmt:message> 映射一個關鍵字給局部消息,然後執行參數替換
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
key | 要檢索的消息關鍵字 | 否 | Body |
bundle | 要使用的資源束 | 否 | 默認資源束 |
var | 存儲局部消息的變量名 | 否 | Print to page |
scope | var屬性的作用域 | 否 | Page |
eg:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <fmt:setLocale value="es_ES" /> <fmt:setBundle basename="com.tutorialspoint.Example" var="lang" /> <fmt:message key="count.one" bundle="${lang}"/><br> <fmt:message key="count.two" bundle="${lang}"/><br> <fmt:message key="count.three" bundle="${lang}"/><br> </body> </html> //結果輸出爲: Uno Dos Tres
<fmt:requestEncoding> 用來指定返回給Web應用程序的表單編碼類型
指定字符集,用於解碼來自表單的數據。在字符集不是ISO-8859-1時必須使用這個標籤。
用來指定請求的Content-Type,即使response是通過Page指令的contentType屬性來編碼,這是由於response的實際區域可能與Page指令所指定的不同。
語法:
屬性 | 描述 | 是否必要 | 默認值 |
---|---|---|---|
value | 字符編碼集的名稱,用於解碼request參數 | 是 | 無 |
eg:
<fmt:requestEncoding value="UTF-8" />
SQL標籤
JSTL SQL標籤庫提供了與關係型數據庫(Oracle,MySQL,SQL Server等等)進行交互的標籤。引用SQL標籤庫的語法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
標籤 | 描述 |
---|---|
<sql:setDataSource> | 指定數據源 |
<sql:query> | 運行SQL查詢語句 |
<sql:update> | 運行SQL更新語句 |
<sql:param> | 將SQL語句中的參數設爲指定值 |
<sql:dateParam> | 將SQL語句中的日期參數設爲指定的java.util.Date 對象值 |
<sql:transaction> | 在共享數據庫連接中提供嵌套的數據庫行爲元素,將所有語句以一個事務的形式來運行 |
XML 標籤
JSTL XML標籤庫提供了創建和操作XML文檔的標籤。引用XML標籤庫的語法如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
在使用xml標籤前,你必須將XML 和 XPath 的相關包拷貝至你的<Tomcat 安裝目錄>\lib下:
- XercesImpl.jar
- xalan.jar
標籤 | 描述 |
---|---|
<x:out> | 與<%= ... >,類似,不過只用於XPath表達式 |
<x:parse> | 解析 XML 數據 |
<x:set> | 設置XPath表達式 |
<x:if> | 判斷XPath表達式,若爲真,則執行本體中的內容,否則跳過本體 |
<x:forEach> | 迭代XML文檔中的節點 |
<x:choose> | <x:when>和<x:otherwise>的父標籤 |
<x:when> | <x:choose>的子標籤,用來進行條件判斷 |
<x:otherwise> | <x:choose>的子標籤,當<x:when>判斷爲false時被執行 |
<x:transform> | 將XSL轉換應用在XML文檔中 |
<x:param> | 與<x:transform>共同使用,用於設置XSL樣式表 |
JSTL函數
JSTL包含一系列標準函數,大部分是通用的字符串處理函數。引用JSTL函數庫的語法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函數 | 描述 |
---|---|
fn:contains() | 測試輸入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 測試輸入的字符串是否包含指定的子串,大小寫不敏感 |
fn:endsWith() | 測試輸入的字符串是否以指定的後綴結尾 |
fn:escapeXml() | 跳過可以作爲XML標記的字符 |
fn:indexOf() | 返回指定字符串在輸入字符串中出現的位置 |
fn:join() | 將數組中的元素合成一個字符串然後輸出 |
fn:length() | 返回字符串長度 |
fn:replace() | 將輸入字符串中指定的位置替換爲指定的字符串然後返回 |
fn:split() | 將字符串用指定的分隔符分隔然後組成一個子字符串數組並返回 |
fn:startsWith() | 測試輸入字符串是否以指定的前綴開始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之後的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 將字符串中的字符轉爲小寫 |
fn:toUpperCase() | 將字符串中的字符轉爲大寫 |
fn:trim() | 移除首位的空白符 |
fn:toLowerCase
fn:toLowerCase函數將一個字符串中包含的所有字符轉換爲小寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數,例如:
fn:toLowerCase("Www.IT315.org")的返回值爲字符串"www.it315.org"
fn.toLowerCase("") 的返回值爲空字符串
fn:toUpperCase
fn:toUpperCase函數將一個字符串中包含的所有字符轉換爲大寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數。例如:
fn:toUpperCase("www.IT315.org")的返回值爲字符串"WWW.IT315.ORG"
fn:toUpperCase("")的返回值爲空字符串
fn:trim
fn:trim函數刪除一個字符串的首尾的空格,並返回刪除空格後的結果字符串,它接收一個字符串類型的參數。需要注意的是,fn:trim函數不能刪除字符串中間位置的空格
例如:fn:trim(" www.it3 15.org ")的返回值字符串是"www.it 315.org"
fn:length
fn:length函數返回一個集合或數組大小,或返回一個字符串中包含的字符的個數,返回值是int類型。fn:length函數接收一個參數,這個參數可以是<c:forEach>標籤的items屬性支持的任何類型,包括任意類型的數組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。
如果fn:length函數的參數爲null或者是元素個數爲0的集合或數組對象,則函數返回0;如果參數是空字符串,則函數返回0;
fn:split
fn:split函數以指定字符串作爲分隔符,將一個字符串分割成數組並返回這個字符串數組。
fn:split函數接收兩個字符串類型的參數,第一個參數表示要分割的字符串,第二個參數表示作爲分隔符的字符串。
例如:fn:split("www.it315.org",".")[1]的返回值爲字符串"it315"
fn:join
fn:join函數以一個字符串作爲分隔符,將一個字符串數組中的所有元素合併爲一個字符串並返回合併後的結果字符串。fn:join函數接收兩個參數,第一個參數是要操作的字符串數組,第二個參數是作爲分隔符的字符串。
如果fn:join函數的第二個參數是空字符串,則fn:join函數的返回值直接將元素連接起來。例如:
假設stringArray是保存在Web域中的一個屬性,它表示一個值爲{"www","it315","org"}的字符串數組,則fn:join(stringArray,".")返回字符串"www.it315.org"
fn:join(fn:split("www,it315,org",","),".") 的返回值爲字符串"www.it315.org"
fn:indexOf
fn:indexOf 函數返回指定字符串在一個字符串中第一次出現的索引值,返回值爲int類型。fn:indexOf函數接收兩個字符串類型的參數,如果第一個參數字符串中包含第二個參數字符串,那麼不管第二個參數字符串在第一個參數字符串中出現幾次,fn:indexOf函數總是返回第一次出現的索引值;如果第一個參數中不包含第二個參數,則fn:indexOf函數返回-1。如果第二個參數爲空字符串,則fn:indexOf函數總是返回0。
例如:fn:indexOf("www.it315.org","t3") 的返回值爲5
fn:contains
fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值爲布爾類型。fn:contains函數在比較兩個字符串是否相等時是大小寫敏感的。
fn:contains函數接收兩個字符串類型的參數,如果第一個字符串中包含第二個參數字符串返回true,否則返回false。如果第二個參數的值爲空字符串,則fn:contains函數總是返回true。實際上,fn:contains(string,substring)等價於fn:indexOf(string,sunstring)!= -1
忽略大小寫的EL函數:fn:containsIgnoreCase
fn:startsWith
fn:startsWith 函數用於檢測一個字符串是否以指定的字符串開始的,返回值爲布爾類型。
fn:startsWith 函數接收兩個字符串類型的參數,如果第一個參數字符串以第二個參數字符串開始,則函數返回true,否則函數返回false。如果第二個參數爲空字符串,則fn:startsWith函數總是返回true。例如:
fn:startsWith("www.it315.org","it315")的返回值爲false
與之對應的EL函數:fn:endsWith
fn:replace
fn:replace函數將一個字符串中包含的指定字符串替換爲其他的指定字符串,並返回替換後的結果字符串。fn:replace("www it315 org"," ",".")的返回值爲字符串"www.it315.org"
fn:substring
fn:substring 函數用於截取一個字符串的子字符串並返回截取到的子字符串。fn:substring函數接收三個參數,第一個參數是用於指定要操作的源字符串,第二個參數是用於指定截取子字符串開始的索引值,第三個參數是用於指定截取子字符串結束的索引值,第二個參數和第三個參數都是int類型,其值都從0開始例如:
fn:substring("www.it315.org",4,9)的返回值爲字符串"it315"
fn:substringAfter
fn:substringAfter函數用於截取並返回一個字符串中的指定字符串第一次出現之後的子字符串。fn:substringAfter函數接收兩個字符串類型的參數,第一個參數表示要操作的源字符串,第二個參數表示指定的子字符串。
fn:substringAfter("www.it315.org",".")的返回值爲字符串"it315.org"
與之對應的EL函數爲:fn:substringBefore
自定義EL函數開發步驟
EL自定義函數開發與應用包括以下三個步驟:
編寫一個Java類,方法必須是靜態方法。
在WEB-INF目錄下新建一個tld的文件。
沒有標籤的提示,複製http://java.sun.com/xml/ns/j2ee , 合併名稱
設置2.0,設置url和shortname
編寫標籤庫描述符(tld)文件,在tld文件配置自定義函數
使用function標籤配置自定義函數。
使用name標籤配置方法名(可以任意)
使用function-class標籤配置類的全路徑
使用function-signature 標籤配置返回值類型(中間有空格)方法名稱(參數類型)
在JSP頁面中導入和自定義函數
開發EL function注意事項
編寫標籤庫描述文件後,需要將它放置到<web應用>\WEB-INF目錄中或WEB-INF目錄下的除了classes和lib目錄之外的任意子目錄中。
TLD文件中的<uri>元素用指定該TLD文件的URI,在JSP文件中需要通過這個URI來引入該標籤庫描述文件。
<function>元素用於描述一個EL自定義函數,其中:
<name>子元素用於指定EL自定義函數的名稱。
<funtion-class>子元素用於指定完整的Java類名。
<function-signature>子元素用於指定Java類中的靜態方法的簽名,方法簽名必須指明方法的返回類型以及各個參數的類型,各個參數之間用逗號分隔。
實例如下:
在src下新建一個cn.itcast.el的包,在包內新建ElDemo1.java
代碼如下:
package cn.itcast.el;
public class ElDemo1 {
public static String sayHello(String name){
return "hello "+name;
}
}
在WebRoot/WEB-INF下新建myfn的tld文件 並進行配置:
配置後的代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>myfn</short-name>
<uri>http://www.itcast.cn/1110/myfn</uri>
<!-- 配置自定義的EL函數 -->
<function>
<!-- 配置方法名稱 -->
<name>sayHi</name>
<!-- 方法所在的類 -->
<function-class>cn.itcast.el.ElDemo1</function-class>
<!-- 配置方法的簽名 -->
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
</taglib>
在WebRoot根目錄下新建el文件夾,在裏面新建demo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://www.itcast.cn/1110/myfn" prefix="myfn" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${ fn:length("abcdefg") }
${ fn:toUpperCase("abcdefg") }
${ myfn:sayHi("小風") }
</body>
</html>
自定義標籤
自定義標籤簡介
自定義標籤主要用於移除JSP頁面中的Java代碼,提高代碼的複用性
使用自定義標籤移除jsp頁面在奇偶那個的Java代碼,只需要完成以下步驟:
- 編寫一個實現Tag接口的Java類(標籤處理器)
- 編寫標籤庫描述符(tld)文件,在tld文件中對標籤處理器類描述成一個標籤
- 參考Tomcat中example項目中的JSP部分
因爲企業業務需求是多種多樣的,所以常見開源框架只能提供通用的Java代碼功能,如果實現既定業務邏輯功能,需要自定義標籤。通過自定義標籤(簡化複雜業務開發)
簡單標籤
由於傳統標籤使用三個標籤接口來完成不同的功能,顯得過於繁瑣,不利於標籤技術的推廣,SUN公司爲降低標籤技術的學習難度,在JSP2.0中定義了一個更爲簡單、便於編寫和調用的SimpleTag接口來實現標籤的功能。實現SimpleTag接口的標籤通常稱爲簡單標籤。
SimpleTag方法介紹
- setJspContext方法:用於把JSP頁面的pageContext對象傳遞給標籤處理器對象。
- setParent方法:用於把父標籤處理器對象傳遞給當前標籤處理器對象。
- getParent方法:用於獲得當前標籤的父標籤處理對象。
- setJspBody方法:用於把代表標籤體的JspFragment對象傳遞給標籤處理器對象。即傳入標籤體緩存對象(封裝了標籤體內容)
- doTag方法:用於完後所有標籤邏輯,包括輸出、迭代、修改標籤體內容等。在doTag方法中可以拋出javax.servlet.jsp.SkipPageException異常,用於通知WEB容器不再執行JSP頁面中位於結束標記後面的內容,這等效於在傳統標籤的doEndTag方法中返回Tag.SKIP_PAGE常量的情況。
簡單標籤庫開發常用功能,實現SimpleTag接口標籤類(SimpleTag JSP2.0 之後爲了簡化標籤開發提供的)
編寫簡單的標籤類,只需要繼承SimpleTagSupport類
setJspContext 傳入pageContext對象
setParent 傳入父標籤對象
setJSPBody 傳入標籤體緩存對象(封裝了標籤體內容)
doTag (執行標籤,在該方法中編寫標籤代碼邏輯)
在setJSPBody方法中傳入對象JSPFragment,該對象封裝了標籤體內容,控制標籤體內容輸出
最重要方法invoke(Writer out) 意義將標籤體內容輸出到指定字符輸出流中。
注意:在簡單標籤庫中<bodyContent>不能寫JSP,而必須寫scriptless
SimpleTag接口方法的執行順序:
當web容器開始執行標籤時,會調用如下方法完成標籤的初始化:
- WEB容器調用標籤處理器對象的setJspContext方法,將代表JSP頁面的pageContext對象傳遞給標籤處理器對象。
- WEB容器調用標籤處理器對象的setParent方法,將父標籤處理器對象傳遞給這個標籤處理器對象。注意,只有在標籤存在父標籤的情況下,WEB容器纔會調用這個方法。
- 如果調用標籤時設置了屬性,容器將調用每個屬性對應的setter方法把屬性值傳遞給標籤處理器對象。如果標籤的屬性值是EL表達式,則WEB容器首先計算表達式的值,然後把值傳遞給標籤處理器對象。
- 如果簡單標籤有標籤體,容器將調用setJSPBody方法把代表標籤體的JspFragment對象傳遞進來。
執行標籤時:
- 容器調用標籤處理器的doTag() 方法,開發人員在方法內通過操作JspFragment對象,就可以實現是否執行、迭代、修改標籤體的目的。
JSPFragment類
(1)javax.servlet.jsp.tagext.JspFragment類是在JSP2.0中定義的,它的實例對象代表JSP頁面中的一段符合JSP語法規範的JSP片段,這段JSP片段中不能包含JSP腳本元素。
(2)WEB容器在處理簡單標籤的標籤體時,會把標籤體內容用一個JspFragment對象表示,並調用標籤處理器對象的setJSPBody方法把JspFragment對象傳遞給標籤處理器對象。JspFragment類中只定義了兩個方法,如下所示:
getJspContext方法:用於返回代表調用頁面的JspContext對象——pageContext
public abstract void invoke(java.io.Writer out) 輸出標籤內容
用於執行JspFragment對象所代表的JSP代碼片段
參數out用於指定將JspFragment對象的執行結果寫入到哪個輸出流對象中,如果傳遞給參數out的值爲null,則 將執行結果寫入到JspContext.getOut()方法返回的輸出流對象中。(簡而言之,可以理解爲寫給瀏覽器)
invoke方法詳解
JspFragment.invoke方法是JspFragment最重要的方法,利用這個方法可以控制是否執行和輸出標籤體的內容、是否迭代執行標籤體的內容或對標籤體的執行結果進行修改後再輸出。例如:
- 在標籤處理器中如果沒有調用JspFragment.invoke方法,其結果就相當於忽略標籤體內容;
- 在標籤體處理器中重複調用JspFragment.invoke方法,則標籤體內容會被重複執行;
- 若想在標籤處理器中修改標籤體內容,只需在調用invoke方法時指定一個可取出結果數據的輸出流對象(例如:StringWriter),讓標籤體的執行結果輸出到該輸出流對象中,然後從該輸出流對象中取出數據進行修改後在輸出到目標設備,即可達到修改標籤體的目的。
例:控制標籤後的jsp頁面是否執行
doTag
throw new SkipPageException
TLD配置
<tag>
<name>demo2</name>
<tag-class>simple.MyTag2</tag-class>
<body-content>empty</body-content>
</tag>
自定義標籤入門
需求:自定義標籤<myc:print>在頁面中輸出hello
步驟一:編寫標籤類
編寫一個類,繼承SimpleTagSupport
重寫兩個方法,doTag()和setJspContext(JspContext pc)
通過JspContext 對象可以獲取out對象向外輸出內容
步驟二:提供tld文件進行配置
通過<tag>標籤配置自定義標籤
配置標籤名稱<name>print</name>
配置標籤的類<tag-class>xxx.xxx.xxx</tag-class>
配置標籤體的內容<body-content>empty</body-content>
步驟三:在JSP頁面中引入該標籤庫
自定義帶有標籤體的標籤
需求:自定義標籤<myc:out>在頁面中輸出內容
步驟一:編寫標籤類
編寫一個類,繼承SimpleTagSupport
重寫兩個方法,doTag()和setJspContext(JspContext pc)
在doTag()中通過getJspBody()獲取JspFragment標籤體,調用invoke(null)
步驟二:提供tld文件進行配置
通過<tag>標籤配置自定義標籤
配置標籤名稱<name>out</name>
配置標籤的類<tag-class>xxx.xxx.xxx</tag-class>
配置標籤體的內容<body-content>scriptless</body-content>
步驟三:在JSP的頁面中引入該標籤庫
Body-content的配置
<body-content>元素的可選值有:
- empty:不能有標籤體內容
- JSP:標籤體內容可以是任何東西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建議使用Java代碼段,SimpleTag已經不再支持使用<body-content>JSP</body-content>
- scriptless:標籤體內容不能是Java代碼段,但可以是EL、JSTL等。
- tagdependent:標籤體內容不做運算,由標籤處理類自行處理,無論標籤體內容是EL、JSP、JSTL,都不會做運算。
自定義帶有屬性的標籤
需求:自定義標籤<myc:if>在頁面中輸出內容
步驟一:編寫標籤類
編寫一個類,繼承SimpleTagSupport類。
提供頁面的屬性,設置成boolean類型。並提供set方法,頁面的屬性與類中的屬性名稱必須相同。
重寫doTag()方法,判斷屬性是否爲true,通過getJspBody()獲取JspFragment標籤體,調用invoke(null)
步驟二:提供tld文件進行配置
通過<tag>標籤配置自定義標籤
配置標籤名稱<name>if</name>
配置標籤的類<tag-class>xxx.xxx.xxx</tag-class>
配置標籤體的內容<body-content>scriptless</body-content>
配置屬性<attribute>在屬性中配置其他信息</attribute>
步驟三:在JSP頁面中引入標籤庫
attribute的配置
(1)配置屬性名稱
<name>test</name>
(2)屬性是否是必須的
<required>true</required>
(3)配置是否支持EL表達式
<rtexprvalue>true</rtexprvalue>
(4)配置屬性的類型
<type>boolean</type>
在TLD中描述標籤屬性attribute
元素名 | 是否必須指定 | 描述 |
description | 否 | 用於指定屬性的描述信息 |
name | 是 | 用於指定屬性的名稱。屬性名稱是大小寫敏感的,並且不能以jsp、 _jsp、java和sun開頭 |
required | 否 | 用於指定在JSP頁面中調用自定義標籤時是否必須設置這個屬性。其 取值包括true和false,默認值是false,true表示必須設置,否則可以 設置也可以不設置該屬性。 |
rtexprvalue | 否 | rtexprvalue是runtime expression value(運行時表達式)的英文簡寫, 用於指定屬性值是一個靜態值或動態值。其取值包括true和false,默認值 是false,false表示只能爲該屬性指定靜態文本值,例如"123"; true表示可 以爲該屬性指定一個JSP動態元素,動態元素的結果作爲屬性值,例如 JSP表達式<%=value %> |
type | 否 | 用於指定屬性值的Java類型。默認是String |
<tag>元素的<attribute>子元素用於描述自定義
標籤的一個屬性,自定義標籤所具有的每個屬性
都要對應一個<attribute>元素 。
<attribute>
<description>description</description>
<name>aaaa</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>ObjectType</type>
</attribute>
實例如下:
在WEB項目的src目錄下新建cn.itcast.tag包,在包內新建三個標籤實現類
TagDemo1.java (沒有標籤體的自定義標籤)
package cn.itcast.tag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 對外輸出Hello
* @author Administrator
*
*/
public class TagDemo1 extends SimpleTagSupport{
private PageContext pc;
public void doTag() throws JspException, IOException {
pc.getOut().write("Hello");
}
/**
* 服務器默認先執行該方法
*/
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
}
TagDemo2.java (有標籤體 處理標籤體內容):
package cn.itcast.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 帶有標籤主體
* @author Administrator
*
*/
public class TagDemo2 extends SimpleTagSupport{
private PageContext pc;
public void doTag() throws JspException, IOException {
JspFragment jf = getJspBody();
StringWriter sw = new StringWriter();
//通過invoke方法將標籤體內容寫入到參數Writer對象sw中
jf.invoke(sw);
// 獲取標籤體內容
String content = sw.toString().toUpperCase();
pc.getOut().print(content);
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext)pc;
}
}
TagDemo3.java (有屬性 有標籤體的自定義標籤)
package cn.itcast.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 類似<c:if>標籤,帶有屬性的
* @author Administrator
*
*/
public class TagDemo3 extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
public void doTag() throws JspException, IOException {
if(test){
getJspBody().invoke(null);
}
}
}
在WebRoot/WEB-INF 目錄下新建myc.tld文件
配置內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>myc</short-name>
<uri>http://www.itcast.cn/1110/myc</uri>
<!-- 配置自定義標籤 -->
<tag>
<!-- 配置標籤名稱 -->
<name>print</name>
<!-- 配置標籤的類 -->
<tag-class>cn.itcast.tag.TagDemo1</tag-class>
<!-- 配置標籤主體 -->
<body-content>empty</body-content>
</tag>
<!-- 配置自定義標籤 -->
<tag>
<!-- 配置標籤名稱 -->
<name>out</name>
<!-- 配置標籤的類 -->
<tag-class>cn.itcast.tag.TagDemo2</tag-class>
<!-- 配置標籤主體 -->
<body-content>scriptless</body-content>
</tag>
<!-- 配置自定義標籤 -->
<tag>
<!-- 配置標籤名稱 -->
<name>if</name>
<!-- 配置標籤的類 -->
<tag-class>cn.itcast.tag.TagDemo3</tag-class>
<!-- 配置標籤主體 -->
<body-content>scriptless</body-content>
<!-- 配置屬性 -->
<attribute>
<!-- 配置屬性名稱 -->
<name>test</name>
<!-- 屬性是否是必須的 -->
<required>true</required>
<!-- 是否支持EL表達式 -->
<rtexprvalue>true</rtexprvalue>
<!-- 屬性的類型 -->
<type>boolean</type>
</attribute>
</tag>
</taglib>
在WebRoot下新建tag文件夾,新建tag.jsp 測試自定義標籤內容
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.cn/1110/myc" prefix="myc" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<myc:print/>
<myc:out>
liuxun1993
</myc:out>
<c:set var="i" value="10"></c:set>
<myc:if test="${ i eq 10 }">
美美
</myc:if>
</body>
</html>
啓動服務器,運行結果如下:
從一下地址整理所得:https://blog.csdn.net/u013087513/article/details/54847678
http://www.runoob.com/jsp/jsp-jstl.html
https://www.cnblogs.com/blog-yuesheng521/p/5468624.html