07.EL
一、简介
- 全称:Expression Language,表达式语言,用来代替JSP表达式
- 格式:${表达式}
- 作用:主要用来获取域对象中的属性值
- EL表达式的查询规则:
- 默认会进行全域(四个域都查)查找,先从page域中开始查找,找到后直接返回,不在去其他域中查找;如果在page域中找不到,则去request域中查找,找到后直接返回,不再去session域中查找,依次类推…
- 如果最后在application域中也找不到则什么也不输出
- EL给我们提供了四个Scope对象,用来精确获取指定域中的属性值
- pageScope
- 获取page域中的属性值
- requestScope
- 获取request域中的属性值
- sessionScope
- 获取session域中的属性值
- applicationScope
- 获取application域中的属性值
- pageScope
- 当域对象中存放数据时的key比较特殊时,比如使用了减号,则需要通过[]的方式获取域中的属性值
<%
Date date = new Date();
//将date放到域中
pageContext.setAttribute("date",date+"-");
request.setAttribute("date",date+"--");
session.setAttribute("date",date+"---");
application.setAttribute("date",date+"----");
//向域中放数据时key比较特殊的情况
pageContext.setAttribute("hello-kitty","Tomcat");
%>
通过JSP表达式输出当前时间:<%=date%><br>
通过EL表达式获取当前的时间:${date}<br>
通过EL表达式精确获取request域中的时间:${requestScope.date}<br>
通过EL表达式获取page域中key比较特殊的属性值:${pageScope['hello-kitty']}<br>
二、通过EL表达式获取JavaBean的属性值
- Employee类
package com.atguigu.el.beans;
public class Employee {
private Integer id;
private String lastName;
private String email;
private Department dept;
public Employee() {
}
public Employee(Integer id, String lastName, String email, Department dept) {
this.id = id;
this.lastName = lastName;
this.email = email;
this.dept = dept;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
System.out.println("getLastName方法被调用");
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", dept=" + dept +
'}';
}
public int getAge(){
return 23;
}
public boolean isMarried(){
return true;
}
public int sleepingTime(){
return 6;
}
}
- Department类
package com.atguigu.el.beans;
public class Department {
private Integer id;
private String name;
public Department() {
}
public Department(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Department{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
-
1)通过对象.属性名的方式获取JavaBean的属性值
- 调用的是属性对应的get方法
- 如果对象的属性是一个其他JavaBean类型的值,可以通过继续点的方式获取属性的属性值
-
2)通过对象.get方法或is方法单词的首字母小写获取类中方法的返回值
-
3)直接通过对象.方法获取方法的返回值
<%
//创建JavaBean对象
Employee employee = new Employee(1,"张三","zhangsan@lisi.com",new Department(1001,"小卖部"));
//将employee放到page域中
pageContext.setAttribute("emp",employee);
%>
通过EL表达式获取employee对象的lastName属性值:${emp.lastName}<br>
通过EL表达式获取employee对象的dept属性的name属性值:${emp.dept.name}<br>
通过EL表达式获取employee对象中getAge方法的返回值:${emp.age}<br>
通过EL表达式获取employee对象中isMarried方法的返回值:${emp.married}<br>
通过EL表达式获取employee对象中sleepingTime方法的返回值:${emp.sleepingTime()}<br>
三、EL中的11个隐含对象
-
一个我们比较熟悉的
-
pageContext
- 类型:PageContext
- 它既是JSP的隐含对象,也是EL的隐含对象
- pageContext在EL表达式中可以直接使用,如果在EL表达式中要使用JSP中的其他八个隐含对象必须通过pageContext来获取
- 通常我们通过EL表达式使用该对象获取项目的虚拟路径
通过EL表达式获取项目的虚拟路径:${pageContext.request.contextPath}<br>
-
-
四个Scope对象
- pageScope
- 类型:Map<String ,Object>
- 作用:获取page域中的属性值
- requestScope
- 类型:Map<String ,Object>
- 作用:获取request域中的属性值
- sessionScope
- 类型:Map<String ,Object>
- 作用:获取session域中的属性值
- applicationScope
- 类型:Map<String ,Object>
- 作用:获取application域中的属性值
- pageScope
-
其他6个隐含对象
-
param
- 类型:Map<String , String>
- 作用:获取请求参数
-
paramValues
- 类型:Map<String , String[]>
- 作用:获取请求参数中一个key对应多个值的情况
-
header
- 类型:Map<String , String>
- 作用:获取请求头中的信息
-
headerValues
- 类型:Map<String , String[]>
- 作用:获取请求头中一个key对应多个值的情况
-
cookie
- 类型:Map<String , Cookie>
- 作用:根据Cookie对象的名字获取Cookie对象
-
initParam
-
类型:Map<String , String>
-
作用:获取当前Web应用的初始化参数
- 前提需要先在web.xml文件中配置
<!--设置当前Web应用的初始化参数--> <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param>
-
<%-- Created by IntelliJ IDEA. User: 韩总 Date: 2021/5/22 Time: 10:36 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>11个隐含对象</title> </head> <body> 通过JSP表达式获取项目的虚拟路径:<%=request.getContextPath()%><br> 通过EL表达式获取项目的虚拟路径:${pageContext.request.contextPath}<br> 通过EL表达式中的隐含对象获取请求参数:${param.username}<br> 通过EL表达式中的隐含对象获取请求头中User-Agent的信息:${header['User-Agent']}<br> 通过EL表达式中的隐含对象获取请求头的Cookie对象的value值:${cookie.JSESSIONID.value}<br> 通过EL表达式中的隐含对象获取当前Web应用的初始化参数:${initParam.encoding}<br> </body> </html>
-
四、empty运算符
-
EL表达式中也支持加、减、乘、除的运算
-
EL表达式中有一个常用的运算符:empty
- 1)判断JavaBean的属性是否为空串或null
- 2)集合是否为空
- 非空的表示方式
- not empty
- !empty
<%--empty运算符--%> <% //创建Employee对象 Employee employee = new Employee(null,"张三",null,null); //将employee放到page域中 pageContext.setAttribute("emp",employee); //创建一个List List<Employee> list = new ArrayList(); //将list中添加一个employee对象 list.add(employee); //将list放到page域中 pageContext.setAttribute("list",list); %> 使用empty运算符判断employee对象的id属性是否为null:${empty emp.id}<br> 使用empty运算符判断employee对象的lastName属性是否为空串:${empty emp.lastName}<br> 使用empty运算符判断list是否为空:${empty pageScope.list}<br> 使用empty运算符判断list是否为非空:${not empty pageScope.list}<br> 使用empty运算符判断list是否为非空:${!empty pageScope.list}<br>