EL表达式
表达式语言(Expression )简称EL,它是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性。
主要作用:
1、获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索Java对象、获取数据。(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算数运算,以在JSP页面中完成一些简单的逻辑运算。${user == null}
3、获取web开发常用对象
EL表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
获取数据
EL表达式可以用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索Java对象、获取数据(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)。在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果对象中不存在标识符所对应的对象,则返回" "(注意不是null)。
<%@ page import="org.lanqiao.shoppingcar.pojo.Customer" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedHashMap" %>
<%@ page import="java.util.Map" %><%--
Created by IntelliJ IDEA.
User: huwei
Date: 2018/7/18
Time: 15:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
request.setAttribute("name","张三");
session.setAttribute("username","李四");
%>
${requestScope.name}--相当于--><%=pageContext.findAttribute("name")%>---->${sessionScope.username}
<hr>
<%
List<Customer> cList = new ArrayList<>();
Customer c1 = new Customer("张三1","1233455","山西太原",1);
Customer c2 = new Customer("张三2","1233455","山西太原",1);
Customer c3 = new Customer("张三3","1233455","山西太原",1);
cList.add(c1);
cList.add(c2);
cList.add(c3);
request.setAttribute("cList",cList);
%>
<%--对于list集合 的下标是从0开始--%>
${cList[1].username}
<hr>
<!-- 在jsp页面中,使用el表达式获取map集合的数据 -->
<%
Map<String,String> map = new LinkedHashMap<String,String>();
map.put("a","aaaaxxx");
map.put("b","bbbb");
map.put("c","cccc");
map.put("1","aaaa1111");
request.setAttribute("map",map);
%>
${map.a}---->${map["1"]}
</body>
</html>
EL表达式访问JavaBean属性
1、访问一个普通的javabean,假设一个对象Person有那么属性
Person person = new Person();
先request.setAttribute("person",person);
显示name:${person.name}
2、访问数组,利用下标直接访问
String s[] = {"1","2"};
request.setAttribute("s",s);
显示s[1]: ${s[1]}或者${s["1"]}
3、访问List,直接用下标进行访问
ArrayList list = new ArrayList();
list.add("1");
list.add("1");
request.setAttribute("list",list);
显示list[1]: ${list[1]}或者${list["1"]}
4、访问一个Map,用 . 或者[]访问
Map map = new Map();
map.put("one","no.1");
map.put("two","no.2");
request.setAttribute("map",map);
显示map("one"): ${map.one}或者${map["one"]}
注意:这里千万不能用${map[one]}因为下标里面的东西如果不加引号,它就相当于一个属性,容器编译的时候就会去寻找one属性,相当于${one},找不到,当然就错了,中括号里面是可以嵌套表达式的,但是,中括号里面的表达式是去掉${}的
[]与 . 运算符
EL提供 . 和[] 两种运算符来存取数据。当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符合,就一定要用[]。例如:
${user.My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。
例如:
${sessionScope.user[data]}中data是一个变量
假若data的值为“sex”时,那上述的例子等于${sessionScope.user.sex};
假若data的值为“name”时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以用上述的方法来做,但,无法做到动取值态。
执行运算
1、EL算数运算: + - * /
2、EL关系运算
表达式语言不仅可在数字与数字之间比较,还可在字符与字符之间比较,字符串的比较是根据其对应UNICOD值来比较大小的。
注意:在使用EL关系运算符时,不能够写成:${param.password 1}==${param.password 2}或者${${param.password 1}==${param.password 2}},而应写成${param.password 1==param.password 2}
3、EL逻辑运算
Empty运算符
Empty运算符主要用来判断值是否为空(NULL,空字符串,空集合)。<%@page pageEncoding="UTF-8"%><BR>name:${param.name}</br>
empty处理结果:${empty param.name}</br>
==null处理结果:${param.name == null}
地址栏输入:地址栏输入:http://127.0.0.1:8080/test/test.jsp empty:true ==null:true
地址栏输入:地址栏输入:http://127.0.0.1:8080/test/test.jsp ?name= empty:true ==null:false
结论:在EL中,empty对“ ”和null的处理都返回true;而null对“ ”返回false,对null返回true
<%--
Created by IntelliJ IDEA.
User: huwei
Date: 2018/7/18
Time: 16:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
name:<%=request.getParameter("name")%><br>
name:${param.name}<br>
${empty param.name}<br><!-- 如果为null 和"" 都返回true-->
${param.name == null || param.name==""}<!--只能是当为null的时候 返回true-->
</body>
</html>
二元表达式:${user!=null?user.name:""}成立取第一个值,不成立取第二个。
获得web开发中的常用对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便的获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称}:获得对象的引用
类别 标识符 描述
与作用范围有关的EL隐含对象包含有:pageScope、requestScope、sessionScope和applicationScope
它们可以读取使用JSP内置对象pageContext、request、session以及application的setAttribute()方法所设定的对象的数值------即getAttribute(String name),却不能取得其他相关信息。例如,要取得session中储存的一个username属性的值,可以利用下面的方法: session.getAttribute("username")
在EL中则使用下面的方法:
${sessionScope,username}
注意:如果没有设定使用EL内置对象的作用范围,则按照pageScope、requestScope、sessionScope和applicationScope的先后顺序读取属性值,即,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为" "(注意,不是null)。