JavaWeb学习总结(十一)EL表达式
一、简介
EL 表达式的全称是:Expression Language,即表达式语言。
EL 表达式的作用:EL 表达式主要是代替 jsp 页面中的表达式脚本,在 jsp 页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
EL 表达式的格式是:${表达式}
注意:
- EL 表达式在输出 null 值的时候,输出的是空串。
- jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
EL表达式与jsp表达式脚本对比:
二、EL 表达式搜索域数据的顺序
EL 表达式主要作用是在 jsp 页面中输出数据,并且主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的作用范围从小到大的顺序去进行搜索,找到就输出。
顺序:pageContext ——>request——> session ——> application
三、EL 表达式分别输出实体类的普通属性、数组属性、List集合属性、Map集合属性
案例:
实体类Person:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cities = cities;
this.map = map;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", phones=" + Arrays.toString(phones) +
", cities=" + cities +
", map=" + map +
'}';
}
}
jsp:
其实,EL表达式对于实体类属性的输出就是调用了实体类中对应属性的get()方法。
不信?我们在Person类中添加一个get()方法,但是不去添加age这个属性:
public int getAge() {
return 18;
}
在jsp中添加:
输出Person的age属性:${p.age} <br>
结果:
事实证明,EL表达式对于实体类属性的输出就是调用了实体类中对应属性的get()方法。
即${object.xxx}
就是调用了object.getXxx()
或object.isXxx()
(后者适用于布尔类型的属性)
四、EL表达式中的运算
(一)关系运算
关系运算符 | 说 明 | 范 例 | 结 果 |
== 或 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 |
(二)逻辑运算
逻辑运算符 | 说 明 | 范 例 | 结 果 |
&& 或 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 |
(三)算术运算
算数运算符 | 说 明 | 范 例 | 结 果 |
+ | 加法 | ${ 12 + 18 } | 30 |
- | 减法 | ${ 18 - 8 } | 10 |
* | 乘法 | ${ 12 * 12 } | 144 |
/ 或 div | 除法 | ${ 144 / 12 } 或 ${ 144 div 12 } | 12 |
% 或 mod | 取模 | ${ 144 % 10 } 或 ${ 144 mod 10 } | 4 |
(四)empty运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true;不为空,则输出 false。
以下几种情况为空:
- 值为 null 值的时候
- 值为空串的时候
- 值是 Object 类型数组,且长度为零的时候
- list 集合,元素个数为零
- map 集合,元素个数为零
案例:
(五)三元运算
和Java中的三元运算一样
${表达式 1?表达式 2:表达式 3}
如果表达式 1 的值为真,返回表达式 2 的值;如果表达式 1 的值为假,返回表达式 3 的值。
案例:
(六).点运算 和 [] 中括号运算
- .点运算,可以输出 Bean 对象中某个属性的值。
- []中括号运算,可以输出有序集合中指定索引的元素的值。
并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
案例:map 集合中 key 里含有特殊字符
五、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 中配置的上下文参数 |
(一)EL表达式获取四个特定域中的属性
对应关系:
pageScope ———— pageContext 域
requestScope ———— Request 域
sessionScope ———— Session 域
applicationScope ———— ServletContext 域
案例:四个域中都有同个key,如何只获取ServletContext域的value?
(二)pageContext对象
我们知道,pageContext对象可以获取 jsp 中的九大内置对象,因此它通常被用来获取以下信息:
获取信息 | jsp表达式脚本 | EL表达式 |
获取请求协议 | <%=request.getScheme()%> | ${pageContext.request.scheme} |
获取服务器 ip | <%=request.getServerName()%> | ${pageContext.request.serverName} |
获取服务器端口号 | <%=request.getServerPort()%> | ${pageContext.request.serverPort} |
获取当前工程路径 | <%=request.getContextPath()%> | ${pageContext.request.contextPath} |
获取请求方法(GET或POST) | <%=request.getMethod()%> | ${pageContext.request.method} |
获取客户端 ip 地址 | <%=request.getRemoteHost()%> | ${pageContext.request.remoteHost} |
获取会话的唯一标识 | <%=session.getId()%> | ${pageContext.session.id} |
案例:
(三)EL 表达式其他隐含对象的使用
1.param和paramValues
- param 它可以获取请求参数的值
- paramValues 它也可以获取请求参数的值,获取多个值的时候使用。
案例:
2.header和headerValues
- header它可以获取请求头的信息
- headerValues 它可以获取请求头的信息,它可以获取多个值的情况(请求头有多个值的情况比较少)
案例:
3.cookie
它可以获取当前请求的 Cookie 信息
案例:
4.initParam
它可以获取在 web.xml 中配置的上下文参数
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:8080/test</param-value>
</context-param>
</web-app>
a.jsp: