JSP學習筆記(3)——JSTL 標籤庫
JSP Standard Tag Lib,名為JSP標準標籤庫,設計的目的主要用來方便我們將資料輸出,而不是使用JSP中的語法<% %> <%= %> <%! %>
。
平常使用的話,我們會在JSP在巢狀HTML程式碼來實現資料的獲取,比如說把一個list中的內容轉換為表格顯示,需要使用到迴圈,還要在迴圈中巢狀HTML程式碼,看起來很不優雅,而且程式碼不好閱讀。
根據JSTL標籤所提供的功能,可以將其分為5個類別。
- 核心標籤 c.tld
- 格式化標籤 f.tld
- SQL 標籤 s.tl
- XML 標籤 x.tld
- JSTL 函式
標籤庫可以和ESL表示式聯用
核心標籤庫 c.tld
set
相當於setAttribute方法
語法:
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="page|requset|session|application"/>
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
value | 要儲存的值 | 否 | 主體的內容 |
target | 要修改的屬性所屬的物件 | 否 | 無 |
property | 要修改的屬性 | 否 | 無 |
var | 儲存資訊的變數 | 否 | 無 |
scope | var屬性的作用域 | 否 | Page |
scope屬性有四種選擇:page,requset,session,application
//下面的標籤相當於pageContext.setAttribute("html"); <c:set var="html" value="<h1>hello</h1>"/> <c:set var="html" value="<h1>hello</h1>" score="request"/>
out
語法:
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
value | 要輸出的內容 | 是 | 無 |
default | 輸出的預設值 | 否 | 主體中的內容 |
escapeXml | 是否忽略XML特殊字元 | 否 | true |
//html是上面set的內容
//輸出<h1>hello</h1>,忽略了轉義
<c:out value="${pageScope.html}"></c:out>
//輸出顯示一級標題hello
<c:out value="${pageScope.html}" escapeXml="false"></c:out>
if
語法:
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
test | 條件 | 是 | 無 |
var | 用於儲存條件結果的變數 | 否 | 無 |
scope | var屬性的作用域 | 否 | page |
<c:if test="${"hello".startWith("h")}" var="flag" >
<p>hello以h開頭</p>
</c:if>
//if-else語句
<c:if test="${"hello".startWith("h")}" var="flag" >
<p>hello以h開頭</p>
</c:if>
<c:if test="${flag}">
<p>hello不以h開頭</p>
</c:if>
remove
語法:
//相當於xx.removeAttrbute
<c:remove var="<string>" scope="<string>"/>
choose
<c:set value="3000" var="sal" />
<c:choose>
<c:when test="${sal <3000}">
<p>z混日子</p>
</c:when>
<c:when test="${sal >=300 and sal <5000}">
<p>還算湊合</p>
</c:when>
<c:otherwise>
<p>富有</p>
</c:otherwise>
</c:choose>
import
相當於指令 <%@ include
菜鳥 JSTL-import
redirect
重定向
url
用於生成url,優點是可以把url存在變數中,之後便於引用
菜鳥 JSTL——url
param
可作為上面import,redirect,url中的子標籤,表明帶參
forEach
語法:
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
items | 要被迴圈的資訊 | 否 | 無 |
begin | 開始的元素(0=第一個元素,1=第二個元素) | 否 | 0 |
end | 最後一個元素(0=第一個元素,1=第二個元素) | 否 | Last element |
step | 每一次迭代的步長 | 否 | 1 |
var | 代表當前條目的變數名稱 | 否 | 無 |
varStatus | 代表迴圈狀態的變數名稱 | 否 | 無 |
<c:forEach var="item" items="${lists}" varStatus="staus">
${item}
staus.index 當前的下標 0開始
staus.count 從1開始
</c:forEach>
forTokens
屬性和forEach用於,不過多了一個屬性delims,表明分隔符,有多個分隔符使用空格隔開
<c:set var="token" value="2010,2,3.25,47,58:62"/>
<c:forTokens items="${token}" delims=", . :" var="item">
<p>${item}</p>
</c:forTokens>
格式化標籤
引用:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
requestEncoding
使用<fmt:requestEncoding>
標籤來指定字符集,用於解碼來自表單的資料。在字符集不是ISO-8859-1時必須使用這個標籤。
<fmt:requestEncoding value="UTF-8" />
formatNumber
<fmt:formatNumber
value="<string>"
type="<string>"
pattern="<string>"
currencyCode="<string>"
currencySymbol="<string>"
groupingUsed="<string>"
maxIntegerDigits="<string>"
minIntegerDigits="<string>"
maxFractionDigits="<string>"
minFractionDigits="<string>"
var="<string>"
scope="<string>"/>
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
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 |
fromatData
<fmt:formatDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>
屬性 | 描述 | 是否必要 | 預設值 |
---|---|---|---|
value | 要顯示的日期 | 是 | 無 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定義格式模式 | 否 | 無 |
timeZone | 顯示日期的時區 | 否 | 預設時區 |
var | 儲存格式化日期的變數名 | 否 | 顯示在頁面 |
scope | 儲存格式化日誌變數的範圍 | 否 | 頁面 |
資料庫連線
引用:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
標籤 | 描述 |
---|---|
指定資料來源 | |
執行SQL查詢語句 | |
執行SQL更新語句 | |
將SQL語句中的引數設為指定值 | |
將SQL語句中的日期引數設為指定的java.util.Date 物件值 | |
在共享資料庫連線中提供巢狀的資料庫行為元素,將所有語句以一個事務的形式來執行 |
連線資料庫
<sql:setDataSource var="myDb"
driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:ORCL"
user="xx"
password="xx"
scope="application"/>
查詢
<sql:query var="resultSet" dataSource="${myDb}">
select * from employee where ename like ? and sal>=? and hiredate<?
<%--這裡的順序與上面的?順序相同 --%>
<sql:param value="%A%"/>
<sql:param>1000.0</sql:param>
<sql:dateParam value="${hiredate}"/>
</sql:query>
注意:結果集物件的型別不是java.sql.ResulSet 的例項,而是javax.servlet.jsp.jstl.sql.Result 的例項
獲取資料
<c:forEach var="emp" items="${resultSet.rows}">
<tr>
<td>${emp.empno}</td>
<td>${emp.ename}</td>
<td>${emp.job}</td>
<td>${emp.mgr}</td>
<td><fmt:formatDate value="${emp.hiredate}" pattern="yyyy年MM月dd日"/></td>
<td><fmt:formatNumber value="${emp.sal}" type="currency" /> </td>
<td>${emp['comm']}</td>
<td>${emp['deptno']}</td>
</tr>
</c:forEach>
自定義JSTL標籤
1. 定義類
定義一個類,繼承與javax.servlet.jsp.tagext.SimpleTagSupport
(簡單標籤的支援類,不允許標籤內有主體內容)
重寫doTag
方法,標籤解析之後會自動執行此方法
類中的成員屬性名需要與標籤的屬性名一致,成員屬性需要有get/set方法
獲得JSP中的out物件:
JspContext jspcontext = this.getJspContext();
JspWriter out = jspcontext.getOut();
out.println(s);
2. 編寫tlc檔案
在web-inf目錄下新建tld檔案,檔名隨意。tlc檔案主要說明標籤如何使用,是由哪一個類實現和一些標籤的屬性配置。
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<!--下面的兩個屬性,之後引用需要用到-->
<short-name>lq</short-name>
<uri>http://www.lanqiao.com/tag</uri>
<tag>
<description>完成日期的格式化輸出</description>
<!--標籤名-->
<name>printDate</name>
<!--標籤實現類-->
<tag-class>com.lanqiao.tag.PrintDateTag</tag-class>
<!--標籤主休形式-->
<body-content>empty</body-content>
<attribute>
<name>date</name>
<!--屬性是否必須-->
<required>false</required>
<!--是否可使用EL或指令碼求值-->
<rtexprvalue>true</rtexprvalue>
<type>java.util.Date</type>
</attribute>
<attribute>
<name>pattern</name>
<!--屬性是否必須-->
<required>false</required>
<!--是否可使用EL或指令碼求值-->
<rtexprvalue>false</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
3. 引用自定義標籤
jsp中使用<%@ taglib prefix=”Short-Name” uri=”uri”%>指令引入標籤庫才能使用。
4. 使用
request.setAttribute("now",new Data());
<lq:printDate date="${now}"/>