什么是EL表达式?
EL(Expression Language)表达式是一种简化JSP页面内Java代码的表达式语言。它借鉴了JavaScript和XPath的表达式语言,提供了在JSP中简化表达式的方法,目的是为了尽量减少JSP页面中的Java代码,使得JSP页面的处理程序编写起来更加简洁,便于开发和维护。
EL表达式的语法非常简单,所有EL表达式的格式都是以“${}”表示。在JSP中访问模型对象是通过EL表达式的语法来表达的,这意味着从域对象中获取数据,然后将数据展示在页面上。不过,需要注意的是,EL表达式只能读取数据,不能修改数据,并且不能在Java代码块中定义。
此外,EL表达式的自动转类型和四大域读取数据的特性也使得它在处理动态网页时非常方便。当四大域内中有相同属性名时,EL表达式会从最小范围的域依次往最大域查找,找到相关内容后将会停止查找,并显示查找到的第一条数据。
结论:
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出,并简化jsp页面语句。
表达式格式:
EL 表达式的格式是:${表达式}
EL 表达式在输出 null 值的时候,输出的是空串。
jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串(如果要输出空串,需要进行三元运算符判断)
<%
request.setAttribute("key","hello,El表达式");
%>
jsp表达式脚本的输出方式:<%=request.getAttribute("key")==null?"":request.getAttribute("key")%>
EL表达式的输出方式:${key}
EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
<%
//往四个域中保存相同的key的数据
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
pageContext.setAttribute("key","pageContext");
%>
${key}
EL 表达式输出 Bean 的属性
创建一个实体类Person,类中定义(普通属性、数组属性、List集合属性和map集合属性)。
public class Person
private T id;
private T[] data;
private List
private Map
public Person() {
}
public Person(T id, T[] data, List
this.id = id;
this.data = data;
this.list = list;
this.map = map;
}
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
public T[] getData() {
return data;
}
public void setData(T[] data) {
this.data = data;
}
public List
return list;
}
public void setList(List
this.list = list;
}
public Map
return map;
}
public void setMap(Map
this.map = map;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person> person = (Person>) o;
return Objects.equals(id, person.id) && Arrays.equals(data, person.data) && Objects.equals(list, person.list) && Objects.equals(map, person.map);
}
@Override
public int hashCode() {
int result = Objects.hash(id, list, map);
result = 31 * result + Arrays.hashCode(data);
return result;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", data=" + Arrays.toString(data) +
", list=" + list +
", map=" + map +
'}';
}
}
<%!
List
String[] data = new String[3];
Map
Person
%>
<%
list.add("上海");
list.add("广州");
list.add("北京");
data[0] = "AA";
data[1] = "BB";
data[2] = "CC";
map.put("key1", LocalDateTime.now());
map.put("key2",true);
map.put("key3", "hello");
person = new Person<>("1001",data,list,map);
pageContext.setAttribute("p",person);
%>
输出Person类中的id属性值:${p.id}
输出Person类中的data数组属性值:${p.data[1]}
输出Person列中的list集合属性值:${p.list.get(1)}
输出Person类中的Map集合属性值:${p.map}
输出Person类中的Map集合属性指定key的value值:${p.map.key1}
EL 表达式:运算符
语法:${ 运算表达式 } , EL 表达式支持如下运算符:
关系运算
${10 == 10} 或 ${10 eq 12}
${10 ne 12} 或 ${10 != 10}
${10 < 5} 或 ${5 lt 10}
${10 > 5} 或 ${5 gt 10}
${10 <= 5} 或 ${5 le 10}
${10 >= 5} 或 ${5 ge 10}
逻辑运算
${12 == 12 && 12 < 10} 或 ${12 == 12 and 12 < 10}
${12 == 12 || 12 < 10} 或 ${12 == 12 or 12 < 10}
${!true} 或 ${not true}
算术运算
${12 + 18}
${18 - 10}
${5 * 5}
${12 / 6} 或 ${12 div 6}
${10 % 2} 或 ${10 mod 5}
empty 运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。
以下几种情况为空:
1、值为 null 值的时候,为空
2、值为空串的时候,为空
3、值是 Object 类型数组,长度为零的时候
4、list 集合,元素个数为零
5、map 集合,元素个数为零
empty运算
<%
request.setAttribute("emptyNull",null);
request.setAttribute("emptyStr","");
request.setAttribute("emptyArr",new Object[]{});
List
request.setAttribute("emptyList",list);
Map
request.setAttribute("emptyMap",map);
%>
${!empty emptyNull}
${empty emptyStr}
${empty emptyArr}
${empty emptyList}
${empty emptyMap}
三元运算符
语法格式:表达式 1?表达式 2:表达式 3
如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
三元运算符
${10 % 2 == 0 ? "偶数" : "奇数"}
“.”点运算 和 [] 中括号运算符
.点运算,可以输出对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值。
并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
.与[]运算
<%
Map
map1.put("a.a.a","aaaVal");
map1.put("b+b+b","bbbVal");
request.setAttribute("map",map1);
%>
${map['a.a.a']}
${map['b+b+b']}
EL 表达式: 11 个隐含对象
EL 个表达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。
变量
类型
作用
pageContext
PageContextImpl
它可以获取 jsp 中的九大内置对象
pageScope
Map
它可以获取 pageContext 域中的数据
requestScope
Map
它可以获取 Request域中的数据
sessionScope
Map
它可以获取 Session 域中的数据
applicationScope
Map
它可以获取ServletContext域中的数据
param
Map
它可以获取请求参数的值
paramValues
Map
它也可以获取请求参数的值,获取多个值的时候使用。
header
Map
它可以获取请求头的信息
headerValues
Map
它可以获取请求头的信息,它可以获取多个值的情况
cookie
Map
它可以获取当前请求的Cookie信息
initParam
Map
它可以获取在 web.xml 中配置的上下文参数
获取域数据
<%
pageContext.setAttribute("key1","pageContext1");
pageContext.setAttribute("key2","pageContext2");
request.setAttribute("key1","request");
session.setAttribute("key1","session");
application.setAttribute("key1","application");
%>
${pageScope.key2}
${pageContext.request.getAttribute("key1")}
${sessionScope.key1}
${applicationScope.key1}
pageContext对象的使用
<%--
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<%
pageContext.setAttribute("req",request);
pageContext.setAttribute("session",session);
%>
<%=request.getScheme()%>
<%=session.getId()%>
<%-- 以上方式简化以下的写法--%>
1.协议: ${ req.scheme}
2.服务器 ip:${ pageContext.request.serverName }
3.服务器端口:${ pageContext.request.serverPort }
4.获取工程路径:${ pageContext.request.contextPath }
5.获取请求方法:${ pageContext.request.method }
6.获取客户端 ip 地址:${ pageContext.request.remoteHost }
7.获取会话的 id 编号:${ pageContext.session.id }
EL 表达式其他隐含对象的使用
param Map
paramValues Map
<%-- 浏览器地址输入请求参数进行测试 --%>
输出请求参数 username 的值:${ param.username }
输出请求参数 password 的值:${ param.password }
输出请求参数 username 的值:${ paramValues.username[0] }
输出请求参数 hobby 的值:${ paramValues.hobby[0] }
输出请求参数 hobby 的值:${ paramValues.hobby[1] }
header Map
headerValues Map
输出请求头【User-Agent】的值:${ header['User-Agent'] }
输出请求头【Connection】的值:${ header.Connection }
输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] }
cookie Map
获取 Cookie 的名称:${ cookie.JSESSIONID.name }
获取 Cookie 的值:${ cookie.JSESSIONID.value }
initParam Map
web.xml 中的配置:
输出<Context-param>username 的值:${ initParam.username }
输出<Context-param>url 的值:${ initParam.url }