JSTL表達式與EL表達式

一、什麼是 EL 語言。

表達式語言(EL)是 JSP 2.0 引入的一種計算和輸出 Java 對象的簡單語音。

二、EL 語言的作用。

爲了使JSP寫起來更加簡單。表達式語言的靈感來自於ECMAScript和XPath表達式語言,它提供了在JSP中簡化表達式的方法。它是一種簡單的語言,基於可用的命名空間(PageContext 屬性)、嵌套屬性和對集合、操作符(算術型、關係型和邏輯型)的訪問符、映射到 Java 類中靜態方法的可擴展函數以及一組隱式對象。

三、使用 EL 語言前的配置。

1、導入standard.jar。
2、在需要使用 EL 語言的頁面加上<%@ page isELIgnored="false" %>
注意 <%@ page isELIgnored=”true” %> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0默認的啓用EL語言。
3、對於整個JSP應用程序,要修改WEB.XML配置(tomcat5.0.16默認是支持EL的)

<jsp-property-group>   
    <description> For config the ICW sample application </description>   
    <display-name>JSPConfiguration </display-name>  
    <url-pattern>/jsp/datareset.jsp </url-pattern>  
    <el-ignored>true< / el-ignored> < / el-ignored>  
    <page-encoding>UTF-8</page-encoding>   
    <scripting-invalid>true</scripting-invalid>  
    <include-prelude>/jsp/prelude.jspf</include-prelude>   
    <include-coda>/jsp/coda.jspf</include-coda>  
</jsp-property-group>  

四、如何使用 EL 表達式。

1、EL 的內置對象。

首先我們要知道 EL 的內置對象有pageScoperequestScopesessionScopeapplicationScope,如果未指定scope,默認從 pageScopeapplicationScope查找屬性名,也可以使用 xxxScope.屬性名 直接指定在某個 scope 查找,如:

${ requestScope.tom }  

2、語法結構。

${expression}  

3、[ ]與.運算符。

EL 提供.[]兩種運算符來存取數據。
如:

${student.name}  
${studentList[0].name}  

當要存取的屬性名稱中包含一些特殊字符,如.或?等並非字母或數字的符號,就一定要使用[ ]。如:

${ student.My-Name}   <!-- ${ student.My-Name} 寫法不正確,應該改爲下面這種 -->  
${ student["My-Name"] }  

如果要動態取值時,就可以用[ ]來做,而.無法做到動態取值。如:

${ sessionScope.student[property] }    <!-- 其中 property 是一個變量,動態取對象的屬性,如"id", "name"等等 -->  

4、使用 EL 取出內置對象的數據。

(1)、普通對象和對象屬性。

服務器端:

request.setAttribute("student", student);  

在瀏覽器上打印出服務器端綁定的數據:

${ student }  <!-- 相當於執行了 student.toString(); -->  
${ student.name }  <!-- 相當於執行了 student.getName(); -->  
${ student.teacher.name }  <!-- 相當於執行了 student.getTeacher().getName(); -->  

(2)、數組中的數據。

服務器端:

String[] nameArray = new String[]{"Tom", "Lucy", "Lilei"};  
request.setAttribute(“nameArray”,nameArray);  

Student[] students = new Student[3];  
students[0] = stu1;  
students[1] = stu2;  
students[2] = stu3;  
request.setAttribute(“students”,students);  

在瀏覽器上打印出服務器端綁定的數組數據:

${ nameArray[0] }   <!-- Tom --> 
${ nameArray[1] }   <!-- Lucy -->  
${ nameArray[2] }   <!-- Lilei -->  

${ students[0].id }   <!-- 輸出第一個學生的ID -->  
${ students[1].name }   <!-- 輸出第二個學生的name -->  
${ students[2].teacher.name }   <!-- 輸出第三個學生的老師的name -->  

(3)、List中的數據。

服務器端:

List<Student> studentList=new ArrayList<Student>();  
studentList.add(stu1);  
studentList.add(stu2);  
studentList.add(stu3);  
request.setAttribute(“studentList”,studentList);  

在瀏覽器上打印出服務器端綁定的List數據:

${ studentList[0].id }   <!-- 輸出第一個學生的ID -->  
${ studentList[1].name }   <!-- 輸出第二個學生的name -->  
${ studentList[2].teacher.name }   <!-- 輸出第三個學生的老師的name -->  

(4)、Map中的數據。

服務器端:

Map<String, Student> studentMap = new HashMap<String, Student>();  
studentMap.put("Tom", stu1);  
studentMap.put("Lucy", stu2);  
studentMap.put("Lilei", stu3);  
request.setAttribute(“studentMap”,studentMap);  

在瀏覽器上打印出服務器端綁定的Map數據:

${ studentMap.Tom.id }   <!-- 輸出第一個學生的ID -->  
${ studentMap.Lucy.name }   <!-- 輸出第二個學生的name -->  
${ studentMap.Lilei.teacher.name }   <!-- 輸出第三個學生的老師的name -->  

5、使用 EL 取出隱式對象中的數據。

JSP 表達式語言定義了一組隱式對象,其中許多對象在 JSP scriplet 和表達式中可用。可使用的隱式對象如下:

隱式對象 作用
page Context JSP 頁的上下文
page Context JSP 頁的上下文。它可以用於訪問 JSP 隱式對象
param 將請求參數名稱映射到單個字符串參數值
paramValues 將請求參數名稱映射到一個數值數組
header 將請求頭名稱映射到單個字符串頭值
headerValues 將請求頭名稱映射到一個數值數組
cookie cookie 名稱映射到單個cookie 對象
initParam 將上下文初始化參數名稱映射到單個值
pageScope 將頁面範圍的變量名稱映射到其值
requestScope 將請求範圍的變量名稱映射到其值
sessionScope 將會話範圍的變量名稱映射到其值
applicationScope 將應用程序範圍的變量名稱映射到其值

五、EL 操作符

JSP 表達式語言提供以下操作符,其中大部分是 Java 中常用的操作符:

術語 定義
算術型 +-(二元)、*/div%mod-(一元)
邏輯型 and&&or、`
關係型 ==eq!=negt<=le>=ge。可以與其他值進行比較,或與布爾型、字符串型、整型或浮點型文字進行比較。
empty。空操作符是前綴操作,可用於確定值是否爲空。
條件型 A ?B :C。根據 A 賦值的結果來賦值 BC

六、什麼是 JSTL 表達式。

JSP 標準標記庫(JSP Standard Tag Library,JSTL)是一個實現 Web 應用程序中常見的通用功能的定製標記庫集,這些功能包括迭代和條件判斷、數據管理格式化、XML 操作以及數據庫訪問。

七、JSTL 表達式的作用。

JSTL標籤庫的使用是爲類彌補html表的不足,規範自定義標籤的使用而誕生的。在告別modle1模式開發應用程序後,人們開始注重軟件的分層設計,不希望在jsp頁面中出現java邏輯代碼,同時也由於自定義標籤的開發難度較大和不利於技術標準化產生了自定義標籤庫。JSTL標籤庫可分爲5類:

  • 核心標籤庫
  • I18N格式化標籤庫
  • SQL標籤庫
  • XML標籤庫
  • 函數標籤庫

八、JSTL 表達式在頁面的配置。

1、導入standard.jarjstl.jar

2、在JSP頁面上引入 JSTL 的引用。如:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

九、JSTL 的使用。

1、核心標籤庫

JSTL的核心標籤庫標籤共13個,從功能上可以分爲4類:表達式控制標籤、流程控制標籤、循環標籤、URL操作標籤。使用這些標籤能夠完成JSP頁面的基本功能,減少編碼工作。如:

表達式控制標籤:out標籤、set標籤、remove標籤、catch標籤。
流程控制標籤:if標籤、choose標籤、when標籤、otherwise標籤。
循環標籤:forEach標籤、forTokens標籤。
URL操作標籤:import標籤、url標籤、redirect標籤。

1.1、表達式控制標籤。

(1)、<c:out>標籤:用來顯示數據對象(字符串、表達式)的內容或結果。相當於 <% out.println(“字符串”)%><%=表達式%>
語法如下:

[語法1]:

<c:out value=”要顯示的數據對象” [escapeXml=”true|false”] [default=”默認值”]>

[語法2]:

<c:out value=”要顯示的數據對象” [escapeXml=”true|false”]>默認值</c:out>

其中,
value:指定要輸出的變量或表達式。
escapeXml:設定是否轉換特殊字符。
default:爲默認輸出結果。如果使用表達式得到的結果爲null(注意與空區別),將會輸出默認結果。

(2)、<c:set>標籤:主要用於將變量存取於JSP範圍中或JavaBean屬性中。

[語法1]:

<c:set value="值1" var="name1" [scope="page|request|session|application"]>

把一個值放在指定(pagesession等)的map中。
[語法2]:

<c:set var=”name2” [scope=”page|request|session|application”]>  

把一個變量名爲name2的變量存儲在指定的scope範圍內。
[語法3]:

<c:set value=”值3” target=”JavaBean對象” property=”屬性名”/>  

把一個值爲“值3”賦值給指定的JavaBean的屬性名。相當與setter()方法。
[語法4]:

<c:set target=”JavaBean對象” property=”屬性名”>值4</c:set>  

把一個值4賦值給指定的JavaBean的屬性名。

(3)、<c:remove>標籤:主要用來從指定的JSP範圍內移除指定的變量。

[語法]:

<c:remove var=”變量名” [scope=”page|request|session|application”]/>  

其中var屬性是必須的,scope可以以省略。

(4)、<c:catch>標籤:用來處理JSP頁面中產生的異常,並將異常信息存儲。
[語法]:

<c:catch var=”name1”>容易產生異常的代碼</c:catch>

var表示由用戶定義存取異常信息的變量的名稱。省略後也可以實現異常的捕獲,當就不能顯示的輸出異常信息。

1.2、流程控制標籤。

流程控制標籤主要用於對頁面簡單業務邏輯進行控制。流程控制標籤包含有4個:<c:if>標籤、<c:choose>標籤、<c:when>標籤和<c:otherwise>標籤。下面將介紹這些標籤的功能和使用方式。

(1)、<c:if>標籤:同程序中的if作用相同,用來實現條件控制。

[語法1]:

<c:if test=”條件1” var=”name” [scope=”page|request|session|application”]>

[語法2]:

<c:if test=”條件2” var=”name” [scope=”page|request|session|application”]>結果2</c:if>

[參數說明]:
I、test屬性用於存放判斷的條件,一般使用EL表達式來編寫。
II、var指定名稱用來存放判斷的結果類型爲truefalse
III、scope用來存放var屬性存放的範圍。

(2)、<c:choose><c:when><c:otherwise>標籤:這3個標籤通常情況下是一起使用的,<c:choose>標籤作爲<c:when><c:otherwise>標籤的父標籤來使用。

[語法1]:3個標籤的嵌套使用方式,<c:choose>標籤只能和<c:when>標籤共同使用。如:

<c:choose>  
    <c:when test="條件1">  
        …..//業務邏輯1  
    </c:when>  
    <c:when test="條件2">  
        …..//業務邏輯2  
    </c:when>  
    <span style="white-space: pre;">    </span><c:otherwise>  
        …..//業務邏輯3  
    </c:otherwise>  
</c:choose>  

[語法2]:<c:when>標籤的使用方式,該標籤都條件進行判斷,一般情況下和<c:choose>共同使用。如:

<c:when text=”條件”>  
    表達式  
</c:when>  

[語法3]:<c:otherwise>不含有參數,只能跟<c:when>共同使用,並且在嵌套中只允許出現一次。如:

<c:otherwise>  
    表達式  
</c:otherwise>  

1.3、循環標籤。

循環標籤主要實現迭代操作。主要包含兩個標籤:<c:forEach><c:forTokens>標籤,接下來將詳細介紹這兩個標籤的用法。

(1)、標籤:該標籤根據循環條件遍歷集合(Collection)中的元素。

[語法]:

<c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>  
    所有內容  
</c:forEach>  

[參數解析]:
I、var設定變量名用於存儲從集合中取出元素。
I、items指定要遍歷的集合。
III、varStatus設定變量名,該變量用於存放集合中元素的信息。
IV、beginend用於指定遍歷的起始位置和終止位置(可選)。
V、step指定循環的步長。

[循環標籤屬性說明]:

名稱 EL 類型 是否必須 默認值
var N String
items Y Arrays``Collection``Iterator``Enumeration``Map``String []args
begin Y int 0
end Y int 集合中最後一個元素
step Y int 1
varStatus N String

其中varStatus有4個狀態屬性,如下:

屬性名 類型 說明
index int 當前循環的索引值
count int 循環的次數
frist boolean 是否爲第一個位置
last boolean 是否爲第二個位置

(2)、標籤:該標籤用於瀏覽字符串,並根據指定的字符將字符串截取。

[語法]:

<c:forTokens items=”strigOfTokens” delims=””delimiters [var=”name” begin=”begin” end=”end” step=”len” varStatus=”statusName”] >  

[參數說明]
I、items指定被迭代的字符串。
II、delims指定使用的分隔符。
III、var指定用來存放遍歷到的成員。
IV、begin指定遍歷的開始位置(int型從取值0開始)。
V、end指定遍歷結束的位置(int型,默認集合中最後一個元素)。
VI、step遍歷的步長(大於0的整型)。
VII、varStatus存放遍歷到的成員的狀態信息。

注:<c:forToken>的屬性varStatus的使用同<c:forEach>的使用方法相同,在此就再不表述。

1.4、URL操作標籤。

JSTL包含3個與URL操作有關的標籤,分別爲:<c:import><c:redirect><c:url>標籤。它們的作用爲:顯示其他文件的內容、網頁導向、產生URL。下面將詳細介紹這3個標籤的使用方法。

(1)、<c:import>標籤:該標籤可以把其他靜態或動態文件包含到本JSP頁面。同<jsp:include>的區別爲:只能包含同一個web應用中的文件。而<c:import>可以包含其他web應用中的文件,甚至是網絡上的資源。

[語法1]:

<c:import url=”url” [context=”context”][ value=”value”][scope=”page|request|session|application”] [charEncoding=”encoding”]>  

[語法2]:

<c:import url=”url” varReader=”name” [context=”context”][charEncoding=”encoding”]>  

標籤參數說明。

名稱 說明 EL 類型 必須 默認值
url 被導入資源的URL路徑 Y String
context 相同服務器下其他的web工程,必須以“””開頭 Y String
var 以String類型存入被包含文件的內容。 N String
Scope var變量的JSP範圍 N String page
charEncoding 被導入文件的編碼格式 Y String
varReader 以Reader類型存儲被包含文件內容 N String

[參數說明]:
I、URL爲資源的路徑,當應用的資源不存在時系統會拋出異常,因此該語句應該放在<c:catch></c:catch>語句塊中捕獲。應用資源有兩種方式:絕對路徑和相對路徑。使用絕對路徑示例如下:

<c:import url=”http://www.baidu.com”>  

使用相對路徑的實例如下:

<c:import url=”aa.txt”>  

aa.txt放在同一文件目錄。
如果以“/”開頭表示應用的根目錄下。例如:tomcat應用程序的根目錄文件夾爲webapps。導入webapps下的文件bb.txt的編寫方式爲:

<c:import url=/bb.txt”>  

如果訪問webapps管理文件夾中其他web應用就要用context屬性。
II、context屬性用於在訪問其他web應用的文件時,指定根目錄。例如,訪問root下的index.jsp的實現代碼爲:

<c:import url=/index.jspcontext=/root”>  

等同於webapps/root/index.jsp
III、var 屬性表示爲資源起的別名。
IV、scope 屬性標識該資源訪問的範圍。
V、charEncoding 屬性標識該資源的編碼方式。
VI、varReader 這個參數的類型是Reader,用於讀取資源。

(2)、<c:redirect>標籤:用來實現了請求的重定向。同時可以在url中加入指定的參數。例如:對用戶輸入的用戶名和密碼進行驗證,如果驗證不成功重定向到登錄頁面;或者實現web應用不同模塊之間的銜接。
[語法1]:

<c:redirect url=”url” [context=”context”]>  

[語法2]:

<c:redirect url=”url”[context=”context”]>  
    <c:param name=”name1” value=”value1”>  
</c:redirect>  

[參數說明]:
I、url 指定重定向頁面的地址,可以是一個string類型的絕對地址或相對地址。
II、context
用於導入其他web應用中的頁面。

(3)、<c:url>標籤:該標籤用於動態生成一個String類型的URL,可以同<c:redirect>標籤共同使用,也可以使用html的標籤實現超鏈接。

[語法1]:指定一個url不做修改,可以選擇把該url存儲在JSP不同的範圍中。

<c:url value=”value” [var=”name”][scope=”page|request|session|application”][context=”context”]/>  

[語法2]:給url加上指定參數及參數值,可以選擇以name存儲該url。

<c:url value=”value” [var=”name”][scope=”page|request|session|application”][context=”context”]>  
    <c:param name=”參數名” value=”值”>  
</c:url>  

2、I18N格式標籤庫

JSTL標籤提供了對國際化(I18N)的支持,它可以根據發出請求的客戶端地域的不同來顯示不同的語言。同時還提供了格式化數據和日期的方法。實現這些功能需要I18N格式標籤庫(I18N-capable formation tags liberary)。引入該標籤庫的方法爲:

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

I18N格式標籤庫提供了11個標籤,這些 標籤從功能上可以劃分爲3類如下:

數字日期格式化。formatNumber標籤、formatData標籤、parseNumber標籤、parseDate標籤、timeZone標籤、setTimeZone標籤。
讀取消息資源。bundle標籤、message標籤、setBundle標籤。
國際化。setlocale標籤、requestEncoding標籤。

接下將詳細介紹這些標籤的功能和使用方式。

2.1、數字日期格式化標籤:數字日期格式化標籤共有6個,用來將數字或日期轉換成設定的格式。

[語法1]:

<frm:formatNumber value=”被格式化的數據”[type=”number|currency|percent”]  
    [pattern=”pattern”]  
    [currencyCode=”code”]  
    [currencySymbol=”symbol”]  
    [groupingUsed=”true|false”]  
    [maxIntergerDigits=”maxDigits”]  
    [minIntergerDigits=”minDigits”]  
    [maxFractionDigits=”maxDigits”]  
    [minFractionDigits=”minDigits”]  
    [var=”name”]  
    [scope=page|request|session|application]   
/>  

[語法2]:

<frm:formatNumber [type=”number|currency|percent”]  
    [pattern=”pattern”]  
    [currencyCode=”code”]  
    [currencySymbol=”symbol”]  
    [groupingUsed=”true|false”]  
    [maxIntergerDigits=”maxDigits”]  
    [minIntergerDigits=”minDigits”]  
    [maxFractionDigits=”maxDigits”]  
    [minFractionDigits=”minDigits”]  
    [var=”name”][scope=page|request|session|application]   
/>   

標籤參數說明:

名稱 說明 EL 類型 必須 默認值
value 要格式化的數據 String
type 指定類型(單位、貨幣、百分比等)見表 String number
pattern 格式化的數據樣式 String
currencyCode 貨幣單位代碼 String
cuttencySymbol 貨幣符號($、¥) String
groupingUsed 是否對整數部分進行分組如(9,999) boolean true
maxIntergerDigits 整數部分最對顯示多少位數 int
minIntergerDigits 整數部分最少顯示多少位 int
maxFractionDigits 小數部分最多顯示多少位 int
minFractionDigits 小數部分最少顯示多少位 int
var 存儲格式化後的數據 String
scope var的JSP範圍 String page

Type屬性的類型應用見表:

類型 說明 示例
number 數字格式 0.8
currency 當地貨幣 ¥0.80
percent 百分比格式 80%

2.2、<frm:parseNumber>標籤:將格式化後的數字、貨幣、百分比都轉化爲數字類型。

[語法1]:

<fmt:parseNumber value="number" [type=”number|currency|percent”]
    [pattern=”pattern”]
    [parseLocale=”locale”]
    [intergerOnly=”true|false”]
    [scope=page|request|session|application”]
/>

[語法2]:

<fmt:parseNumber [type=”number|currency|percent”]
    [pattern=”pattern”]
    [parseLocale=”locale”]
    [intergerOnly=”true|false”]
    [scope=”page|request|session|application”]>
Number
</fmt:parseNumber>

<fmt:parseNumber>標籤參數說明:

名稱 說明 EL 類型 是否必須 默認值
value 被解析的字符串 String
type 指定單位(數字、貨幣、百分比) String number
pattern 格式樣式 String
parseLocale 用來替代默認區域的設定 StringJava.util.``Locale 默認本地樣式
var 存儲已經格式化的數據 String
scope var變量的作用域 String page

<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆運算。相應的參數和類型的配置和使用<fmt:formatNumber>格式化時相同。

2.3、標籤:該標籤主要用來格式化日期和時間。

[語法]:

<fmt: formatDate value=”date” [type=”time|date|both”]  
    [pattern=”pattern”]  
    [dateStyle=”default|short|medium|long|full”]  
    [timeStyle=”default|short|medium|long|full”]  
    [timeZone=”timeZone”]  
    [var=”name”]  
    [scope=”page|request|session|application”]  
/>

<fmt:formatDate>標籤屬性說明:

屬性名 說明 EL 類型 必須 默認值
value 將要格式化的日期對象。 Java.util.Date
type 顯示的部分(日期、時間或者兩者)。 String date
partten 格式化的樣式。 String
dateStyle 設定日期的顯示方式。 String default
timeStyle 設定時間的顯示方式。 String default
timeZone 設定使用的時區。 String 當地所用時區
var 存儲已格式化的日期或時間。 String
scope 指定var存儲的JSP範圍。 String

其中type屬性參數說明見表:

參數名 說明
time 只顯示時間
date 只顯示時期
both 顯示日期和時間

2.4、<fmt:parseDate>標籤:主要將字符串類型的時間或日期轉化爲時間或日期對象。

[語法1]:

<fmt:parseDate value=”date” [type=”time|date|both”]  
    [pattern=”pattern”]  
    [parseLocale=”locale”]  
    [dateStyle=”default|short|medium|long|full”]  
    [timeStyle=”default|short|medium|long|full”]  
    [timeZone=”timezone”]  
    [var=”name”]  
    [scope=”page|request|session|application”]  
/>

[語法2]:

<fmt:parseDate [type=”time|date|both”]  
    [pattern=”pattern”]  
    [parseLocale=”locale”]  
    [dateStyle=”default|short|medium|long|full”]  
    [timeStyle=”default|short|medium|long|full”]  
    [timeZone=”timezone”]  
    [var=”name”]  
    [scope=”page|request|session|application”]>   
    Date  
</fmt:parseDate>

<fmt:parseData>標籤屬性說明:

屬性名 說明 EL 類型 必須 默認值
value 將要格式化的日期時間 String
type 字符串的類型(日期、時間或全部) EL String date
pattern 字符串使用的時間樣式 String
parseLocale 取代默認地區設定 String 默認地區
dateStyle 字符串使用的日期顯示方式 String default
timeStyle 字符串使用的時間顯示格式 String default
timeZone 使用的時區 String 當地區時
var 使用var定義的名字保存對象 String
scope var的JSP範圍 String page

2.5、<fmt:setTimeZone>標籤:該標籤用於設定默認時區或者將時區存儲在指定的JSP範圍內。

[語法]:

<fmt:timeZone value=”timeZone”>  
    …..  
</fmt:timeZone>  

使用<fmt:timeZone></fmt:timeZone>只會應用到標籤體內使用的時區,對標籤外部將不產生影響。

轉載自JSTL 表達式與 EL 語言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章