沒想到,有一天,我又回來寫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提供的標籤庫分作五個大類:
- 核心標籤庫
- 格式標籤庫
- SQL標籤庫
- XML標籤庫
- 函式標籤庫
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下:
- XercesImpl.jar下载地址: http://www.apache.org/dist/xerces/j/
- xalan.jar下载地址: http://xml.apache.org/xalan-j/index.html
标签 | 描述 |
---|---|
<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() | 移除首位的空白符 |