一 什么是 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 表达式。

4.1 EL 的内置对象。

首先我们要知道 EL 的内置对象有pageScope requestScope sessionScope applicationScope,如果未指定scope,默认从 pageScopeapplicationScope查找属性名,也可以使用 xxxScope.属性名 直接指定在某个 scope 查找,如:

${ requestScope.tom }  

4.2 语法结构。

${expression}  

4.3 [ ]与.运算符。

EL 提供.[]两种运算符来存取数据。 如:

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

当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用[ ]。如:

${ student.My-Name}   <!-- ${ student.My-Name} 写法不正确,应该改为下面这种 -->  
${ student["My-Name"] }  

如果要动态取值时,就可以用[ ]来做,而.无法做到动态取值。如:

${ sessionScope.student[property] }    <!-- 其中 property 是一个变量,动态取对象的属性,如"id", "name"等等 -->  

4.4 使用 EL 取出内置对象的数据。

4.4.1 普通对象和对象属性。

服务器端:

request.setAttribute("student", student);  

在浏览器上打印出服务器端绑定的数据:

${ student }  <!-- 相当于执行了 student.toString(); -->  
${ student.name }  <!-- 相当于执行了 student.getName(); -->  
${ student.teacher.name }  <!-- 相当于执行了 student.getTeacher().getName(); -->  

4.4.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 -->  

4.4.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.4.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 -->  

4.5 使用 EL 取出隐式对象中的数据。

JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用。可使用的隐式对象如下:

隐式对象作用
page ContextJSP 页的上下文
pageContext JSP 页的上下文。它可以用于访问 JSP 隐式对象
param将请求参数名称映射到单个字符串参数值
paramValues将请求参数名称映射到一个数值数组
header将请求头名称映射到单个字符串头值
headerValues将请求头名称映射到一个数值数组
cookiecookie 名称映射到单个cookie 对象
initParam将上下文初始化参数名称映射到单个值
pageScope将页面范围的变量名称映射到其值
requestScope将请求范围的变量名称映射到其值
sessionScope将会话范围的变量名称映射到其值
applicationScope将应用程序范围的变量名称映射到其值

五 EL 操作符

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

术语定义
算术型+ -(二元) * / div % mod -(一元)
逻辑型and && or `
关系型== eq != ne gt <= 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 表达式在页面的配置。

8.1 导入standard.jarjstl.jar

8.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 的使用。

9.1 核心标签库

JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签 流程控制标签 循环标签 URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。如:

表达式控制标签:out标签 set标签 remove标签 catch标签。 流程控制标签:if标签 choose标签 when标签 otherwise标签。 循环标签:forEach标签 forTokens标签。 URL操作标签:import标签 url标签 redirect标签。

9.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"]>

把一个值放在指定(page session等)的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表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。

9.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>  

9.1.3 循环标签。

循环标签主要实现迭代操作。主要包含两个标签:<c:forEach><c:forTokens>标签,接下来将详细介绍这两个标签的用法。

(1) <c:forEach>标签:该标签根据循环条件遍历集合(Collection)中的元素。

[语法]:

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

[参数解析]: I var设定变量名用于存储从集合中取出元素。 I items指定要遍历的集合。 III varStatus设定变量名,该变量用于存放集合中元素的信息。
IV begin end用于指定遍历的起始位置和终止位置(可选)。 V step指定循环的步长。

[循环标签属性说明]:

名称EL类型是否必须默认值
varNString
itemsYArrays``Collection``Iterator``Enumeration``Map``String []args
beginYint0
endYint集合中最后一个元素
stepYint1
varStatusNString

其中varStatus有4个状态属性,如下:

属性名类型说明
indexint当前循环的索引值
countint循环的次数
fristboolean是否为第一个位置
lastboolean是否为第二个位置

(2) <c:forTokens>标签:该标签用于浏览字符串,并根据指定的字符将字符串截取。

[语法]:

<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>的使用方法相同,在此就再不表述。

9.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”]>  

<c:import>标签参数说明。

名称说明EL类型必须默认值
url被导入资源的URL路径YString
context相同服务器下其他的web工程,必须以“"”开头YString
var以String类型存入被包含文件的内容。NString
Scopevar变量的JSP范围NStringpage
charEncoding被导入文件的编码格式YString
varReader以Reader类型存储被包含文件内容NString

[参数说明]: 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.jsp” context=”/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>  

9.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标签。

接下将详细介绍这些标签的功能和使用方式。

9.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]   
/>   

<fmt:formatNumber>标签参数说明:

名称说明EL类型必须默认值
value要格式化的数据String
type指定类型(单位 货币 百分比等)见表Stringnumber
pattern格式化的数据样式String
currencyCode货币单位代码String
cuttencySymbol货币符号($ ¥)String
groupingUsed是否对整数部分进行分组如(9,999)booleantrue
maxIntergerDigits整数部分最对显示多少位数int
minIntergerDigits整数部分最少显示多少位int
maxFractionDigits小数部分最多显示多少位int
minFractionDigits小数部分最少显示多少位int
var存储格式化后的数据String
scopevar的JSP范围Stringpage

Type属性的类型应用见表:

类型说明示例
number数字格式0.8
currency当地货币¥0.80
percent百分比格式80%

9.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指定单位(数字 货币 百分比)Stringnumber
pattern格式样式String
parseLocale用来替代默认区域的设定StringJava.util.``Locale默认本地样式
var存储已经格式化的数据String
scopevar变量的作用域Stringpage

<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆运算。相应的参数和类型的配置和使用<fmt:formatNumber>格式化时相同。

9.2.3 fmt:formatDate标签:该标签主要用来格式化日期和时间。

[语法]:

<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显示的部分(日期 时间或者两者)。Stringdate
partten格式化的样式。String
dateStyle设定日期的显示方式。Stringdefault
timeStyle设定时间的显示方式。Stringdefault
timeZone设定使用的时区。String当地所用时区
var存储已格式化的日期或时间。String
scope指定var存储的JSP范围。String

其中type属性参数说明见表:

参数名说明
time只显示时间
date只显示时期
both显示日期和时间

9.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字符串的类型(日期 时间或全部)ELStringdate
pattern字符串使用的时间样式String
parseLocale取代默认地区设定String默认地区
dateStyle字符串使用的日期显示方式Stringdefault
timeStyle字符串使用的时间显示格式Stringdefault
timeZone使用的时区String当地区时
var使用var定义的名字保存对象String
scopevar的JSP范围Stringpage

9.2.5 <fmt:setTimeZone>标签:该标签用于设定默认时区或者将时区存储在指定的JSP范围内。

[语法]:

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

使用<fmt:timeZone></fmt:timeZone>只会应用到标签体内使用的时区,对标签外部将不产生影响。

转载自JSTL 表达式与 EL 语言