JSP – Standard Tag Library (JSTL) Tutorial

沒想到,有一天,我又回來寫jsp, 上一次寫jsp 好像是 1998年,19年前的事情。

 

今天要學習的是jsp 裡的新技術,JSTL。


在Servlet中撰寫HTML進行頁面輸出當然是件麻煩的事,第8章學過JSP後,你終於可以在JSP中直接寫HTML。然而,在JSP中寫Scriptlet放入Java程式碼也不是什麼好事,這跟Servlet中撰寫HTML相比其實是件半斤八兩的事。

如果你使用Model 2架構,你可以將請求處理放到Servlet,將商務邏輯放到純綷Java物件中,在JSP上則使用EL來取得值並顯示。如果你使用Model 1,你也可以將商務邏輯放到JavaBean中,在JSP上透過<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>等標籤以及來處理請求並取得結果進行顯示。

然而就目前你所學到的技術,無論如何你還是得在JSP中使用Scriptlet撰寫Java程式碼,才可以讓畫面呈現出想要的結果。例如,需要依某個條件來決定是否顯示某個網頁片段,或是需要使用迴圈來顯示表格內容。然而,HTML或JSP本身並沒有什麼<if>標籤,更沒什麼<for>標籤讓你達到這個目的。

所幸這些跟頁面呈現相關的邏輯判斷標籤是存在的,可由Java EE平台中的JSTL提供。JSTL不僅提供了條件判斷的邏輯標籤,還提供了對應JSP標準標籤的擴充標籤以及更多的功能標籤。基本上,JSTL提供的標籤庫分作五個大類:

  • 核心標籤庫
提供條件判斷、屬性存取、URL處理及錯誤處理等標籤。本章會針對核心標籤庫的功能與作用進行說明。

 

  • 格式標籤庫
提供數字、日期等的格式化功能,以及區域(Locale)、訊息、編碼處理等國際化功能的標籤。

 

  • SQL標籤庫
提供基本的資料庫查詢、更新、設定資料來源(DataSource)等功能之標籤。

 

  • XML標籤庫
提供XML剖析、流程控制、轉換等功能之標籤。

 

  • 函式標籤庫
提供常用字串處理的自訂EL函式標籤庫。

JSTL是另一個標準規範,本身並非在JSP的規範當中,所以必須另外下載JSTL的API與實作:


可以透過上面這個網頁找到JSTL的相關下載與API文件說明。如果想要直接下載JSTL,則可以在這個網址找到:


下載了JSTL實作(封裝好的JAR檔案)之後,必須放置到Web應用程式的WEB-INF/lib資料夾中,JSTL 1.2實作的檔案名稱是jstl-impl-1.2.jar。如果需要API文件說明,則可以在這個網址找到:


JSTL的標籤種類也蠻多的,這邊的文件只說明JSTL核心標籤庫。其它的標籤庫則請參考JSTL文件說明。要使用JSTL核心標籤庫,必須在JSP網頁上,使用taglib指示元素定義前置文件與uri參考。

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


前置文件設定了這個標籤庫在此JSP網頁中的名稱空間,以避免與其它標籤庫的標籤名稱發生衝突,慣例上使用JSTL核心標籤庫時,會使用c作為前置名稱。uri參考則告知容器,如何參考JSTL標籤庫實作。

如果你必須使用JSTL 1.0(適用於JSP 1.2、J2EE 1.3環境),除了要將jstl.jar與standard.jar複製至WEB- INF/lib資料夾,還需複製TLD檔案,並於web.xml中設定TLD檔案的位置。例如要使用核心標籤庫的話,需在web.xml中設定:

<taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tlds/c.tld</taglib-uri>
</taglib>


注意uri名稱與JSTL 1.1之後不一樣(1.1之後的uri是http://java.sun.com/jsp/jstl/core)。在JSP網頁上,同樣也要使用taglib指示元素定義前置文字與uri。

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>

詳細用法:

http://www.runoob.com/jsp/jsp-jstl.html

 

核心标签

核心标签是最常用的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

格式化标签

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的字符编码

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下:

标签 描述
<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() 移除首位的空白符

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *