基本概念
EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。
基本语法
EL表达式的语法格式非常简单,写为 ${表达式内容}
例如:在浏览器中输出请求域中名称为message的内容。假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");
),此时在jsp中获取的方式,如下表显示:
Java代码块 | JSP表达式 | EL表达式 |
---|---|---|
<% out.println(request.getAttribute(message")); %> | <%=request.getAttribute("message")%> |
${message} |
通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。
注意:有些时候我们使用EL表达式来获取后端塞在请求域的数据时,发现获取不到,这是因为jsp默认开启了 isELIgnored 这个属性,它的作用是忽略EL表达式。所以我们必须要将它给关闭了。
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
它只能从四大域中获取数据,调用的就是findAttribute(name,value);
方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。
它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:
创建两个实体类,User和Address
/**
* 用户的实体类
*/
public class User implements Serializable{
private String name = "张三";
private int age = 18;
private Address address = new Address();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
public class Address implements Serializable {
private String province = "北京";
private String city = "昌平区";
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
JSP代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.User" %>
EL入门
<%--EL表达式概念:
它是Expression Language的缩写。它是一种替换jsp表达式的语言。
EL表达式的语法:
${表达式}
表达式的特点:有明确的返回值。
EL表达式就是把内容输出到页面上
EL表达式的注意事项:
1.EL表达式没有空指针异常
2.EL表达式没有数组下标越界
3.EL表达式没有字符串拼接
EL表达式的数据获取:
它只能在四大域对象中获取数据,不在四大域对象中的数据它取不到。
它的获取方式就是findAttribute(String name)
--%>
-----------获取对象数据---------------------
<% //1.把用户信息存入域中
User user = new User();
pageContext.setAttribute("u",user);
%>
${u}===============输出的是内存地址<%--就相当于调用此行代码<%=pageContext.findAttribute("u")%> --%>
${u.name}<%--就相当于调用此行代码<% User user = (User) pageContext.findAttribute("u");out.print(user.getName());%> --%>
${u.age}
-----------获取关联对象数据------------------
${u.address}==========输出的address对象的地址
${u.address.province}${u.address.city}
${u["address"]['province']}
-----------获取数组数据---------------------
<% String[] strs = new String[]{"He","llo","Expression","Language"};
pageContext.setAttribute("strs", strs);
%>
${strs[0]}==========取的数组中下标为0的元素
${strs[3]}
${strs[5]}===========如果超过了数组的下标,则什么都不显示
${strs["2"]}=========会自动为我们转换成下标
${strs['1']}
-----------获取List集合数据-----------------
<% List list = new ArrayList();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("DDD");
pageContext.setAttribute("list", list);
%>
${list}
${list[0] }
${list[3] }
-----------获取Map集合数据------------------
<% Map map = new HashMap();
map.put("aaa",new User());
pageContext.setAttribute("map", map);
%>
${map}
${map.aaa}<%--获取map的value,是通过get(Key) --%>
${map.aaa.name}${map.aaa.age}
${map["aaa"].name }
在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
EL表达式的注意事项
<%--EL表达式的三个没有--%>
第一个:没有空指针异常
<% String str = null;
request.setAttribute("testNull",str);
%>
${testNull}
第二个:没有数组下标越界
<% String[] strs = new String[]{"a","b","c"};
request.setAttribute("strs",strs);
%>
取第一个元素:${strs[0]}
取第六个元素:${strs[5]}
第三个:没有字符串拼接
<%--${strs[0]+strs[1]}--%>
${strs[0]}+${strs[1]}
EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.
运算符 | 作用 |
empty | 1、判断对象是否为null 2、判断字符串是否为空字符串 3、判断容器元素是否为0 |
条件 ?表达式1 : 表达式2 | 三元运算符 |
使用方式的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.User" %>
EL两个特殊的运算符
<%--empty运算符:
它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个
--%>
<% String str = null;
String str1 = "";
List slist = new ArrayList();
pageContext.setAttribute("str", str);
pageContext.setAttribute("str1", str1);
pageContext.setAttribute("slist", slist);
%>
${empty str}============当对象为null返回true
${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)
${empty slist}==========当集合中的元素是0个时,是true
<%--三元运算符
条件?真:假
--%>
<% request.setAttribute("gender", "female"); %>
男
女
EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:
EL中的隐式对象 | 类型 | 对应JSP隐式对象 | 备注 |
---|---|---|---|
PageContext | Javax.serlvet.jsp.PageContext | PageContext | 完全一样 |
ApplicationScope | Java.util.Map | 没有 | 应用层范围 |
SessionScope | Java.util.Map | 没有 | 会话范围 |
RequestScope | Java.util.Map | 没有 | 请求范围 |
PageScope | Java.util.Map | 没有 | 页面层范围 |
Header | Java.util.Map | 没有 | 请求消息头key,值是value(一个) |
HeaderValues | Java.util.Map | 没有 | 请求消息头key,值是数组(一个头多个值) |
Param | Java.util.Map | 没有 | 请求参数key,值是value(一个) |
ParamValues | Java.util.Map | 没有 | 请求参数key,值是数组(一个名称多个值) |
InitParam | Java.util.Map | 没有 | 全局参数,key是参数名称,value是参数值 |
Cookie | Java.util.Map | 没有 | Key是cookie的名称,value是cookie对象 |
代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
EL表达式11个隐式对象
<%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%>
${pageContext.request.contextPath}
<%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%>
<% request.setAttribute("username","zhangsan"); %>
${username}
${requestScope.username}
<%--header headerValues 获取请求头数据--%>
${header["connection"]}
${headerValues["connection"][0]}
<%--param paramValues 获取请求参数数据--%>
${param.username}
${paramValues.hobby[0]}
${paramValues.hobby[1]}
<%--initParam 获取全局配置参数--%>
${initParam["pname"]}
<%--cookie 获取cookie信息--%>
${cookie}
<%--获取Map集合--%>
${cookie.JSESSIONID}
<%--获取map集合中第二个元素--%>
${cookie.JSESSIONID.name}
<%--获取cookie对象的名称--%>
${cookie.JSESSIONID.value} <%--获取cookie对象的值--%>