JSP學習筆記(3)——JSTL 標籤庫
- 2019 年 10 月 3 日
- 筆記
JSP Standard Tag Lib,名為JSP標準標籤庫,設計的目的主要用來方便我們將數據輸出,而不是使用JSP中的語法<% %> <%= %> <%! %>
。
平常使用的話,我們會在JSP在嵌套HTML代碼來實現數據的獲取,比如說把一個list中的內容轉換為表格顯示,需要使用到循環,還要在循環中嵌套HTML代碼,看起來很不優雅,而且代碼不好閱讀。
根據JSTL標籤所提供的功能,可以將其分為5個類別。
- 核心標籤 c.tld
- 格式化標籤 f.tld
- SQL 標籤 s.tl
- XML 標籤 x.tld
- JSTL 函數
標籤庫可以和EL表達式聯用
核心標籤庫 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存在變量中,之後便於引用
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}"/>