动态网站开发07:EL和JSTL

一、前言

  • 表达式语言(Expression Language),或称EL表达式,简称EL,是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。

二、笔记

(一)、EL基本语法

1、EL的概念

  • EL全称为Expression Language,即表达式语言。它是JSP 2.0引入的一个新内容。EL可以简化JSP开发中的对象引用,从而规范页面代码,增加程序的可读性及可维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发JavaWeb应用的新途径。

2、EL的语法

  • EL的语法非常简单,都是以“${”符号开始,以“}”符号结束的
    语法格式:${表达式}
    “${表达式}”中的表达式必须符合EL语法要求。
    由于EL的语法以“${" 开头,如果在JSP网页中要显示“${“字符串,必须在前面加上“\”符号,即“\${”,或者写成“${${}“ 也就是用表达式输出“${” 符号。

3、EL基本语法的特点

(1)EL可以与JavaScript语句结合使用。
(2)EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过“+”符号进行连接(如$ {number1 + number2})。
(3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
(4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
(6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
(7)在EL中,可以访问JSP的作用域(page、request、 session与 application)

(二)、EL中的标识符

1、EL中标识符的规范

  • 在EL中,经常需要使用一些符号标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。EL中的标识符可以由任意的大小写字母、数字和下划线组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范。
    (1)不能以数字开头。
    (2)不能是EL中的关键字,如and、or、gt等。
    (3)不能是EL隐式对象,如pageContext。
    (4)不能包含单引号(')、双引号(")、减号(-)和正斜线(/)等特殊字符。

2、EL中标识符的示例

(1)合法标识符

username
username123
user_name
_userName

(2)非法标识符

123username
or
user"name
pageContext

(三)EL中的关键字

= 关键字就是编程语言里事先定义好并赋予了特殊含义的单词,和其他语言一样,EL中也定义了许多关键字,如false、not等。

  • EL所有的关键字
1 2 3 4
and eq gt true
instanceof or ne le
false empty not lt
ge null div mod

(四)EL中的变量

1、基本概念

  • EL中的变量就是一个基本的存储单元,EL中的变量不用事先定义就可以直接使用。EL可以将变量映射到一个对象上。

2、简单示例

${message}

  • 在上述示例中,message就是一个变量,通过表达式${message}就可以访问变量message的值。

(五)EL中的常量

1、布尔常量

  • 布尔常量用于区分一个事物的正反两面,它的值只有两个,分别是true和false。

2、整型常量

  • 整型常量与Java中的十进制的整型常量相同,它的取值范围是Java语言中定义的常量·Long.MIN_VALUE·到·Long.MAX_VALUE·之间,即[ − 2 63 , 2 63 − 1 ] [-2^{63}, 2^{63}-1][−2 63 ,2 63−1]之间的整数。

3、浮点型常量

  • 浮点数常量用整数部分加小数部分表示,也可以用指数形式表示,例如,1.2E4和1.2都是合法的浮点数常量。浮点数常量的取值范围是Java语言中定义的常量Double.MIN_VALUE到Double.MAX_VALUE之间,即[ 4.9 E − 324 , 1.8 E 308 ] [4.9E-324,1.8E308][4.9E−324,1.8E308]之间的浮点数。

4、字符串常量

  • 字符串常量是用单引号或双引号引起来的一连串字符。由于字符串常量需要用单引号或双引号引起来,所以字符串本身包含的单引号或双引号需要用反斜杠(\)进行转义,即用“'”表示字面意义上的单引号,用“"”表示字面意义上的双引号。如果字符串本身包含反斜杠(\),也要进行转义,即用“\”表示字面意义上的一个反斜杠。
  • 需要注意的是,只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义,例如,'ab’4c"d5\e’表示的字符串是ab’4c"d5\e;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义,例如"ab’4c"d5\e"表示的字符串是ab’4c"d5\e。

5、Null常量

  • Null常量用于表示变量引用的对象为空,它只有一个值,用null表示。

(六)EL访问数据

1、EL的点运算符

  • EL中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象中的属性、List集合中的属性、Array数组中的属性等。
  • 用法示例:${student.name}
  • 在上述语法格式中,表达式${student.name}中点运算符的作用就是访问student对象中的name属性。

2、方括号运算符

  • EL中的中括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”“?”等非字母或数字的符号,就只能使用中括号运算符访问该属性。
  • 方括号运算符示例:${user["user-name"]}

3、EL运算法的应用

(1)点运算符和方括号运算符在某种情况下可以互换,如${student.name}等价于${student["name"]}
(2)中括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}用于访问集合或数组中第一个元素。
(3)中括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].age} 可以访问集合或数组中的第一个元素的age属性。

(七)EL中的运算符

1、算术运算符

算术运算符 说明 算术表达式 结果
+ ${10 + 2} 12
- ${10 - 2} 8
* ${10 * 2} 20
/(或div) 10 / 4 或 {10 / 4}或 10/4{10 div 2} 2.5
%(或mod) 取模(取余) KaTeX parse error: Expected '}', got 'EOF' at end of input: {10 % 4}或{10 mod 2} 2
  • EL中的算术运算符用于对整数和浮点数的值进行算术运算。
  • “-”运算符即可以作为减号,也可以作为负号。
  • “/”或“div”运算符在进行除法运算时,商为小数。
  • EL的“+”运算符与Java的“+”运算符不同,它不能实现两个字符串之间的连接,如果使用该运算符连接两个不可以转换为数值型的字符串,将抛出异常;如果使用该运算符连接两个可以转换为数值型的字符串,EL会自动将这两个字符串转换为数值型,再进行加法运算。

2、比较运算符

  • EL中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的比较运算符执行的结果都是布尔类型。
比较运算符 说明 关系表达式 结果
==(或eq) 等于 10 = = 2 或 {10 == 2}或 10==2{10 eq 2} false
!=(或ne) 不等于 10 ! = 2 或 {10 != 2}或 10!=2{10 ne 2} true
<(或lt) 小于 10 < 2 或 {10 < 2}或 10<2{10 lt 2} false
·>(或gt) 大于 10 > 2 或 {10 > 2}或 10>2{10 gt 2} true
<=(或le) 小于等于 10 < = 2 或 {10 <= 2}或 10<=2{10 le 2} false
·>=(或ge) 大于等于 10 > = 2 或 {10 >= 2}或 10>=2{10 ge 2} true
  • 比较运算符中的“==”是两个等号,千万不可只写一个等号。
  • 为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL中通常使用上表中括号内的表示方式,例如,使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如 1 l t 2 ,但后面如果有其他符号时则可以不加空格,例如 {1lt 2},但后面如果有其他符号时则可以不加空格,例如 1lt2,但后面如果有其他符号时则可以不加空格,例如{1lt(1+1)}。

3、逻辑运算符

  • EL中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。
逻辑运算符 说明 逻辑表达式 结果
&&(and) 逻辑与 KaTeX parse error: Expected '}', got '&' at position 7: {true &̲& false}或{true and false} false
(or) 逻辑或 ${false
  • 需要注意的是,在使用&&运算符时,如果有一个表达式结果为false,则整个表达式结果必为false;在使用||运算符时,如果有一个表达式的结果为true,则整个表达式结果必为true。

4、empty运算符

  • 在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀(prefix)运算符, 即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。
  • 语法格式:${empty expression}
  • 在上述语法格式中,expression用于指定要判断的变量或对象。
  • 定义两个request范围内的变量user1和user2,分别设置它们的值为null和""
<% request.setAttribute("user1", ""); %>
<% request.setAttribute("user2", null); %>
  • 通过empty运算符判断user1和user2是否为空

${empty user1} // 返回值为true
${empty user2} // 返回值为true

  • 由上述代码可知一个变量或对象为null 或空,代表的意义是不同的。null 表示这个变量没有指明任何对象,而空表示这个变量所属的对象内容为空,例如,空字符串、空的数组或者空的List容器。

5、条件运算符

  • EL中条件运算符(?:)用于执行某种条件判断,它类似于Java语言中的if-else语句。
  • 语法格式:${A ? B : C}
  • 在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B,并返回B的值作为整个表达式的结果;如果表达式A的计算结果为false,就执行表达式C,并返回C的值作为整个表达式的结果。例如,表达式${(1 == 2) ? 3 : 4}的结果就是4。

6、小括号运算符

  • EL中的小括号用于改变其他运算符的优先级,例如,表达式 a ∗ b + c ,正常情况下会先计算 a ∗ b 的积,然后再将计算的结果与 c 相加,如果在这个表达式中加一个小括号运算符,将表达式修改为 {a * b + c},正常情况下会先计算a * b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个小括号运算符,将表达式修改为 ab+c,正常情况下会先计算ab的积,然后再将计算的结果与c相加,如果在这个表达式中加一个小括号运算符,将表达式修改为{a * (b + c)},则会先计算b与c的和,再将计算的结果与a相乘。

7、运算优先级

  • EL中的运算符都有不同的运算优先级,当EL中包含多种运算符时,它们必须按照各自优先级的大小进行运算。
优先级 运算符
1 [ ] .
2 ( )
3 -(unary)、not、!、empty
4 *、/、div、%、mod
5 +、-(binary)
6 <、>、<=、>=、lt、gt、le、ge
7 ==、!=、eq、ne
8 &&、and
9 丨丨、or
10 ? :
  • 注意:在应用EL取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。

三、EL隐式对象

先写到这里

(一)

四、JSTL

(一)

1、

(二)

1、

(三)

1、

(四)

1、

五、JSTL中的Core标签库