文章目录
- 零、本节学习目标
- 一、EL
- (一)EL基本语法
- 1、EL的概念
- 2、EL的语法
- 3、案例演示
- (1)用EL读取保存的信息
- (2)使用Java代码与EL获取信息的对比
- 4、EL基本语法的特点
- (二)EL中的标识符
-
- (三)EL中的关键字
- (四)EL中的变量
-
- (五)EL中的常量
- 1、布尔常量
- 2、整型常量
- 3、浮点型常量
- 4、字符串常量
- 5、Null常量
- (六)EL访问数据
- 1、EL的点运算符
- 2、方括号运算符
- 3、EL运算法的应用
- (七)EL中的运算符
- 1、算术运算符
- 2、比较运算符
- 3、逻辑运算符
- 4、empty运算符
- 5、条件运算符
- 6、小括号运算符
- 7、运算优先级
- 二、EL隐式对象
- 三、JSTL
- 四、JSTL中的Core标签库
零、本节学习目标
- 掌握EL的基本语法
- 熟悉EL中常见的隐式对象
- 了解JSTL标签库
- 熟悉JSTL的下载与使用
- 掌握Core标签库中的常用标签
前面我们学习了JSP页面,在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的话会使JSP页面混乱。为了降低JSP页面的复杂度,增强代码的重用性,Sun公司制定了一套标准标签库JSTL,同时为了获取Servlet域对象中存储的数据,JSP2.0规范还提供了EL(表达式语言),大大降低了开发的难度。本节将针对EL以及JSTL标签库进行详细讲解。
一、EL
(一)EL基本语法
1、EL的概念
- EL全称为Expression Language,即表达式语言。它是JSP 2.0引入的一个新内容。EL可以简化JSP开发中的对象引用,从而规范页面代码,增加程序的可读性及可维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发JavaWeb应用的新途径。
2、EL的语法
- EL的语法非常简单,都是以“
${
”符号开始,以“}
”符号结束的 - 语法格式:
${表达式}
- “
${表达式}
”中的表达式必须符合EL语法要求。 - 由于EL的语法以“
${
" 开头,如果在JSP网页中要显示“${
“字符串,必须在前面加上“\
”符号,即“\${
”,或者写成“${${}
“, 也就是用表达式输出“${
” 符号。
3、案例演示
(1)用EL读取保存的信息
- 创建Java Enterprise项目 -
ELJSTLDemo
- 单击【Finish】按钮
- 修改Artifact名称
- 重新部署项目
- 修改首页
- 启动服务器,查看结果
- 创建
net.huawei.servlet
包,在包里创建ServletDemo01
类
package net.huawei.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "ServletDemo01", urlPatterns = "/demo01")
public class ServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("username", "无心剑");
request.setAttribute("password", "903213");
RequestDispatcher dispatcher = request.getRequestDispatcher("/demo01.jsp");
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
- 在
web
目录里创建demo01.jsp
页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo01</title>
</head>
<body>
使用JSP表达式获取属性:<br />
用户名:<%=request.getAttribute("username")%> <br />
密码:<%=request.getAttribute("password")%> <br />
<hr />
使用EL获取属性:<br />
用户名:${username} <br />
密码:${password} <br />
</body>
</html>
- 启动服务器,访问
http://localhost:8080/ELJSTLDemo/demo01
(2)使用Java代码与EL获取信息的对比
- 由上图中可知,使用EL同样可以成功获取Servlet中存储的数据,但EL明显简化了JSP页面的书写,使程序简洁易维护。另外,当域对象里面的值不存在时,使用EL获取域对象里面的值时返回空字符串;而使用Java方式获取时,如果返回值是null,会报空指针异常,所以在实际开发中推荐使用EL的方式获取域对象中存储的数据。
4、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中的关键字
- 关键字就是编程语言里事先定义好并赋予了特殊含义的单词,和其他语言一样,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]
[−263,263−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访问数据
- 目标:掌握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 div 2} | 2.5 |
%(或mod) | 取模(取余) | ${10 % 4} 或${10 mod 2} | 2 |
- EL中的算术运算符用于对整数和浮点数的值进行算术运算。
- “
-
”运算符即可以作为减号,也可以作为负号。 - “
/
”或“div
”运算符在进行除法运算时,商为小数。 - EL的“+”运算符与Java的“+”运算符不同,它不能实现两个字符串之间的连接,如果使用该运算符连接两个不可以转换为数值型的字符串,将抛出异常;如果使用该运算符连接两个可以转换为数值型的字符串,EL会自动将这两个字符串转换为数值型,再进行加法运算。
2、比较运算符
- EL中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的比较运算符执行的结果都是布尔类型。
比较运算符 | 说明 | 关系表达式 | 结果 |
---|
==(或eq) | 等于 | ${10 == 2} 或${10 eq 2} | false |
!=(或ne) | 不等于 | ${10 != 2} 或${10 ne 2} | true |
<(或lt) | 小于 | ${10 < 2} 或${10 lt 2} | false |
>(或gt) | 大于 | ${10 > 2} 或${10 gt 2} | true |
<=(或le) | 小于等于 | ${10 <= 2} 或${10 le 2} | false |
>=(或ge) | 大于等于 | ${10 >= 2} 或${10 ge 2} | true |
- 比较运算符中的“
==
”是两个等号,千万不可只写一个等号。 - 为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL中通常使用上表中括号内的表示方式,例如,使用“
lt
”代替“<
”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如${1lt 2}
,但后面如果有其他符号时则可以不加空格,例如${1lt(1+1)}
。
3、逻辑运算符
- EL中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。
逻辑运算符 | 说明 | 逻辑表达式 | 结果 |
---|
&&(and) | 逻辑与 | ${true && false} 或${true and false} | false |
||(or) | 逻辑或 | ${false || true} 或${false or true} | true |
- 需要注意的是,在使用
&&
运算符时,如果有一个表达式结果为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}
${empty user2}
- 由上述代码可知一个变量或对象为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)}
,则会先计算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
四、JSTL中的Core标签库