一、EL 表达式简介
1、概念
EL 表达式的全称:Expression Language 表达式语言。
EL 是 JSP 内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象,取得对象属性的值,或执行简单的运算或判断操作。
2、作用
EL表达式主要是替换和简化 jsp 页面中表达式脚本在jsp页面中进行数据的输出。
EL 表达式仅仅用来读取数据,而不能第数据进行修改。
3、特点
EL 在得到某个数据时,会自动进行数据类型的转换
EL 表达式输出数据时,如果有则输出数据,如果为 null 则什么也不输出。
4、EL 表达式与 JSP 表达式的区别
① 如果数据为 null,jsp 显示 null,EL 则什么也不显示;
② EL 显示的数据,必须存放在域对象或上下文对象中;
③ EL 可以自带数据类型转换的功能;
5、语法格式
${表达式}
6、注意事项
jsp 默认是支持 el 表达式的。
如果要忽略 el 表达式,有两种方式
(1)设置 jsp 中 page 指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
(2)\${表达式}:这种方式忽略当前这个 el 表达式,会在当前页面呈现原有格式。
7、案例
1 <body>
2 <%
3 request.setAttribute("key","值");
4 %>
5 表达式脚本输出 key 的值是:
6 <%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%><br/>
7 EL 表达式输出 key 的值是: ${key1}
8 </body>
注意:
EL 在表达式在输出 null 值的时候,输出的空串。
而 jsp 表达式脚本在输出 null 值的时候,输出的是 null 字符串。
二、EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。主要是输出 域对象 中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
Demo:
1 <%
2 //往四个域中都保存了相同的 key 的数据。
3 request.setAttribute("key", "request");
4 session.setAttribute("key", "session");
5 application.setAttribute("key", "application");
6 pageContext.setAttribute("key", "pageContext");
7 %>
8 ${ key }
三、EL 表达式输出信息
创建一个 JavaBean,然后输出 JavaBean 类中的普通属性,数组属性,list集合和 map 集合属性。
JavaBean:
1 public class Person {
2 private String name;
3 private String[] phones;
4 private List<String> cities;
5 private Map<String,Object> map;
6
7 public int getAge() {
8 return 18;
9 }
10
11 public Person() {
12 }
13
14 public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
15 this.name = name;
16 this.phones = phones;
17 this.cities = cities;
18 this.map = map;
19 }
20
21 public String getName() {
22 return name;
23 }
24
25 public void setName(String name) {
26 this.name = name;
27 }
28
29 public String[] getPhones() {
30 return phones;
31 }
32
33 public void setPhones(String[] phones) {
34 this.phones = phones;
35 }
36
37 public List<String> getCities() {
38 return cities;
39 }
40
41 public void setCities(List<String> cities) {
42 this.cities = cities;
43 }
44
45 public Map<String, Object> getMap() {
46 return map;
47 }
48
49 public void setMap(Map<String, Object> map) {
50 this.map = map;
51 }
52
53 @Override
54 public String toString() {
55 return "Person{" +
56 "name='" + name + '\'' +
57 ", phones=" + Arrays.toString(phones) +
58 ", cities=" + cities +
59 ", map=" + map +
60 '}';
61 }
62 }
1、输出 JavaBean 的普通属性
2、输出数组信息
3、输出 List 集合
4、输出 Map 集合
Demo:
1 <%
2 Person person = new Person();
3
4 person.setName("Hello EL");
5 person.setPhones(new String[]{"123","456","789"});
6
7 List<String> cities = new ArrayList<String>();
8 cities.add("北京");
9 cities.add("上海");
10 cities.add("深圳");
11 person.setCities(cities);
12
13 Map<String,Object> map = new HashMap<>();
14 map.put("key1","value1");
15 map.put("key2","value2");
16 map.put("key3","value3");
17
18 person.setMap(map);
19 pageContext.setAttribute("p", person);
20 %>
21
22 输出 Person: ${ p }<br/>
23 输出 Person 的 name 属性: ${p.name} <br>
24 输出 Person 的 phones 数组属性值: ${p.phones[2]} <br>
25 输出 Person 的 cities 集合中的元素值: ${p.cities} <br>
26 输出 Person 的 List 集合中个别元素值: ${p.cities[2]} <br>
27 输出 Person 的 Map 集合: ${p.map} <br>
28 输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
29 <%--输出 Person 的 age 属性: ${p.age} <br> --%>
30 %>
注意:
① 如果在 JavaBean 中只声明一个 age 变量,如果没有写 getAge() 方法,那么是无法通过 EL 表达式来读取该属性的;
② 如果在 JavaBean 中只是声明了一个 getAge() 方法,没有声明 age 这个变量,那么 EL 表达式也是可以读取;
③ EL 是通过JavaBean 对应的 getter() 方法来读取属性的,而不是直接通过属性的名字来读取(切记)
④ 这里的属性名是指 JavaBean 里面的 setter 和 getter 方法去掉 set或get,然后首字母变小写就是属性了。
⑤ 如果发生了下标越界,并不会报错,而是显示为空字符串。
四、EL表达式——运算
EL 表达式支持如下运算符:
1、算数运算符
+、-、*、/(div)、%(mod)
注意:其中的除号可以用 div 来代替,取余可以用 mod 来代替。
算数运算符 | 说明 | 范例 | 结果 |
+ | 加法 | ${ 12 + 18 } | 30 |
- | 减法 | ${ 15 - 5 } | 10 |
* | 乘法 | ${ 2 * 10 } | 20 |
/ 或 div | 除法 | $( 24 / 2 ) 或 ${ 24 div 2 } | 12 |
% 或 mod | 取模 | ${ 14 % 4 } 或 ${ 14 mod 10} | 4 |
2、关系运算符
> < >= <= == !=
关系运算符:
关系运算符 | 说 明 | 范 例 | 结果 |
== 或 eq | 等于 | ${ 5 == 5 } 或 ${ 5 eq 5 } | true |
!= 或 ne | 不等于 | ${ 5 !=5 } 或 ${ 5 ne 5 } | false |
< 或 lt | 小于 | ${ 3 < 5 } 或 ${ 3 lt 5 } | true |
> 或 gt | 大于 | ${ 2 > 10 } 或 ${ 2 gt 10 } | false |
<= 或 le | 小于等于 | ${ 5 <= 12 } 或 ${ 5 le 12 } | true |
>= 或 ge | 大于等于 | ${ 3 >= 5 } 或 ${ 3 ge 5 } | false |
3、逻辑运算符
&&(and) ||(or) !(not)
逻辑运算符:
逻辑运算符 | 说 明 | 范 例 | 结果 |
&& 或 and | 与运算 | ${ 12 == 12 && 12 < 11 } 或 ${ 12 == 12 and 12 < 11 } | false |
|| 或 or | 或运算 | ${ 12 == 12 || 12 < 11 } 或 ${ 12 == 12 or 12 < 11 } | true |
! 或 not | 取反运算 | ${ !true } 或 ${not true } | false |
4、empty 空运算符
空运算符:empty
功能:用于判断一个数据是否为空,如果为空,则输出 true;不为空输出 false。
以下几种情况为空:
① 值为 null 值的时候,为空;
② 值为 空串 的时候,为空;
③ 值是 Object 类型的数据,长度为零的时候;
④ list 集合,元素个数为 零;
⑤ map 集合,元素个数为 零;
Demo:
1 ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0,为空或为0返回 true,不然返回 false
2 ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0;不为空或长度不为0返回 true,不然返回 false
3
4 <body>
5 <%
6 // 1、 值为 null 值的时候, 为空
7 request.setAttribute("emptyNull", null);
8
9 // 2、 值为空串的时候, 为空
10 request.setAttribute("emptyStr", "");
11
12 // 3、 值是 Object 类型数组, 长度为零的时候
13 request.setAttribute("emptyArr", new Object[]{});
14
15 // 4、 list 集合, 元素个数为零
16 List<String> list = new ArrayList<>();
17 // list.add("abc");
18 request.setAttribute("emptyList", list);
19
20 // 5、 map 集合, 元素个数为零
21 Map<String,Object> map = new HashMap<String, Object>();
22 // map.put("key1", "value1");
23 request.setAttribute("emptyMap", map);
24 %>
25 ${ empty emptyNull } <br/>
26 ${ empty emptyStr } <br/>
27 ${ empty emptyArr } <br/>
28 ${ empty emptyList } <br/>
29 ${ empty emptyMap } <br/>
30 </body>
5、三元运算符
格式:
表达式 1? 表达式 2: 表达式 3
说明:如果表达式 1 的值为真, 返回表达式 2 的值, 如果表达式 1 的值为假, 返回表达式 3 的值
Demo:
${ 12 != 12 ? "正确":"错误" }
6、"." 点运算 和 [] 中括号运算符
说明:
. 点运算,可以输出 JavaBean 对象中某个属性的值(其实是调用的 getter() 方法)
[ ] 中括号运算,可以输出有序集合中某个元素的值,并且中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值,key需要用引号(单引号或双引号)引起来
Demo:
1 <body>
2 <%
3 Map<String,Object> map = new HashMap<String, Object>();
4 map.put("a.a.a", "aaaValue");
5 map.put("b+b+b", "bbbValue");
6 map.put("c-c-c", "cccValue");
7 request.setAttribute("map", map);
8 %>
9 ${ map['a.a.a'] } <br>
10 ${ map["b+b+b"] } <br>
11 ${ map['c-c-c'] } <br>
12 </body>
五、EL 表达式的 11 个隐含对象
EL 表达式中有 11 个隐含对象,是 EL 表达式自已定义的,可以直接拿来使用。
变量 | 类型 | 作用 |
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 它可以获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 它可以获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 它可以获取 ServletContext 域中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值, 获取多个值的时候使用。 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息, 它可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的 Cookie 信息 |
initParam | Map<String,String> | 它可以获取在 web.xml 中配置的<context-param>上下文参数 |
六、使用隐含对象
1、pageContext 对象的使用
使用 pageContext 对象可以获取:
1. 协议:
2. 服务器 ip:
3. 服务器端口:
4. 获取工程路径:
5. 获取请求方法:
6. 获取客户端 ip 地址:
7. 获取会话的 id 编号:
8. 获取 jsp 其他的八个内置对象
Demo:
1 <body>
2 <%--
3 request.getScheme() 它可以获取请求的协议
4 request.getServerName() 获取请求的服务器 ip 或域名
5 request.getServerPort() 获取请求的服务器端口号
6 getContextPath() 获取当前工程路径
7 request.getMethod() 获取请求的方式(GET 或 POST)
8 request.getRemoteHost() 获取客户端的 ip 地址
9 session.getId() 获取会话的唯一标识
10 --%>
11 <%
12 pageContext.setAttribute("req", request);
13 %>
14 <%=request.getScheme() %> <br>
15 1.协议: ${ req.scheme }<br>
16 2.服务器 ip: ${ pageContext.request.serverName }<br>
17 3.服务器端口: ${ pageContext.request.serverPort }<br>
18 4.获取工程路径: ${ pageContext.request.contextPath }<br>
19 5.获取请求方法: ${ pageContext.request.method }<br>
20 6.获取客户端 ip 地址: ${ pageContext.request.remoteHost }<br>
21 7.获取会话的 id 编号: ${ pageContext.session.id }<br>
22 </body>
2、EL 获取四个特定域中的属性
EL 表达式只能从域对象中获取值,依次从最小的域中查找是否有该键对应的值,直到找到为止
使用 域名称可以选择性地获取域对象中的数据
注意:如果在域中没有对应的键值对,会返回空字符串""
域名称 | 作用域 |
pageScope | pageContext域 |
requestScope | request域 |
sessionScope | session域 |
applicationScope | application(ServletContext)域 |
Demo:
1 <body>
2 <%
3 pageContext.setAttribute("key1", "pageContext1");
4 pageContext.setAttribute("key2", "pageContext2");
5 request.setAttribute("key2", "request");
6 session.setAttribute("key2", "session");
7 application.setAttribute("key2", "application");
8 %>
9 ${ applicationScope.key2 }
10 </body>
3、获取参数的信息
说明:
param Map<String,String> 它可以获取请求参数的值
paramValues Map<String,String[]> 它也可以获取请求参数的值, 获取多个值的时候使用。
Demo:
1 请求地址:
2 http://localhost:8080/09_EL_JSTL/other_el.jsp?username=zs&password=666&hobby=java&hobby=cpp
3
4 输出请求参数 username 的值: ${ param.username } <br>
5 输出请求参数 password 的值: ${ param.password } <br>
6 输出请求参数 username 的值: ${ paramValues.username[0] } <br>
7 输出请求参数 hobby 的值: ${ paramValues.hobby[0] } <br>
8 输出请求参数 hobby 的值: ${ paramValues.hobby[1] } <br>
4、获取请求头的信息
说明:
header Map<String,String> 它可以获取请求头的信息
headerValues Map<String,String[]> 它可以获取请求头的信息, 它可以获取多个值的情况
Demo:
1 输出请求头【User-Agent】 的值: ${ header['User-Agent'] } <br>
2 输出请求头【Connection】 的值: ${ header.Connection } <br>
3 输出请求头【User-Agent】 的值: ${ headerValues['User-Agent'][0] } <br>
5、获取 cookie 信息
说明:
cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
Demo:
1 获取 Cookie 的名称: ${ cookie.JSESSIONID.name } <br>
2 获取 Cookie 的值: ${ cookie.JSESSIONID.value } <br>
6、获取配置参数信息
说明:
initParam Map<String,String> 它可以获取在 web.xml 中配置的<context-param>上下文参数
Demo:
1 web.xml 中的配置
2 <context-param>
3 <param-name>username</param-name>
4 <param-value>root</param-value>
5 </context-param>
6 <context-param>
7 <param-name>url</param-name>
8 <param-value>jdbc:mysql:///test</param-value>
9 </context-param>
10
11 示例代码:
12 输出<Context-param>username 的值: ${ initParam.username } <br>
13 输出<Context-param>url 的值: ${ initParam.url } <br>