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 函數

標簽庫可以和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>標簽判斷表達式的值,如果表達式的值為 true 則執行其主體內容

語法:

<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

<c: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:setDataSource 指定數據源
sql:query 運行SQL查詢語句
sql:update 運行SQL更新語句
sql:param 將SQL語句中的參數設為指定值
sql:dateParam 將SQL語句中的日期參數設為指定的java.util.Date 對象值
sql:transaction 在共享數據庫連接中提供嵌套的數據庫行為元素,將所有語句以一個事務的形式來運行

連接數據庫

<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}"/>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM