基本概念
EL表达式,全称是Expression Language。意为表达式语言。它是Servlet规范中的一部分,是JSP2.0规范加入的内容。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。
基本语法
EL表达式的语法格式非常简单,写为 ${表达式内容}
例如:在浏览器中输出请求域中名称为message的内容。
假定,我们在请求域中存入了一个名称为message的数据(request.setAttribute("message","EL");),此时在jsp中获取的方式,如下表显示:
Java代码块JSP表达式EL表达式<%<br/> <br/> String message = (String)request.getAttribute("message");<br/> out.write(message);<br/>%><%=request.getAttribute("message")%>${message}通过上面我们可以看出,都可以从请求域中获取数据,但是EL表达式写起来是最简单的方式。这也是以后我们在实际开发中,当使用JSP作为视图时,绝大多数都会采用的方式。
在前面的概述介绍中,我们介绍了EL表达式的作用,它就是用于获取数据的,那么它是从哪获取数据呢?
它只能从四大域中获取数据,调用的就是findAttribute(name,value);方法,根据名称由小到大逐个域中查找,找到就返回,找不到就什么都不显示。
它可以获取对象,可以是对象中关联其他对象,可以是一个List集合,也可以是一个Map集合。具体代码如下:
创建两个实体类,User和Address
/** * 用户的实体类 * @author 黑马程序员 * @Company http://www.itheima.com */ 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; } } /** * 地址的实体类 * @author 黑马程序员 * @Company http://www.itheima.com */ 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" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL入门</title> </head> <body> <%--EL表达式概念: 它是Expression Language的缩写。它是一种替换jsp表达式的语言。 EL表达式的语法: ${表达式} 表达式的特点:有明确的返回值。 EL表达式就是把内容输出到页面上 EL表达式的注意事项: 1.EL表达式没有空指针异常 2.EL表达式没有数组下标越界 3.EL表达式没有字符串拼接 EL表达式的数据获取: 它只能在四大域对象中获取数据,不在四大域对象中的数据它取不到。 它的获取方式就是findAttribute(String name) --%> <br/>-----------获取对象数据---------------------<br/> <% //1.把用户信息存入域中 User user = new User(); pageContext.setAttribute("u",user); %> ${u}===============输出的是内存地址<%--就相当于调用此行代码<%=pageContext.findAttribute("u")%> --%><br/> ${u.name}<%--就相当于调用此行代码<% User user = (User) pageContext.findAttribute("u");out.print(user.getName());%> --%><br/> ${u.age} <br/>-----------获取关联对象数据------------------<br/> ${u.address}==========输出的address对象的地址<br/> ${u.address.province}${u.address.city}<br/> ${u["address"]['province']} <br/>-----------获取数组数据---------------------<br/> <% String[] strs = new String[]{"He","llo","Expression","Language"}; pageContext.setAttribute("strs", strs); %> ${strs[0]}==========取的数组中下标为0的元素<br/> ${strs[3]} ${strs[5]}===========如果超过了数组的下标,则什么都不显示<br/> ${strs["2"]}=========会自动为我们转换成下标<br/> ${strs['1']} <br/>-----------获取List集合数据-----------------<br/> <% List<String> list = new ArrayList<String>(); list.add("AAA"); list.add("BBB"); list.add("CCC"); list.add("DDD"); pageContext.setAttribute("list", list); %> ${list}<br/> ${list[0] }<br/> ${list[3] }<br/> <br/>-----------获取Map集合数据------------------<br/> <% Map<String,User> map = new HashMap<String,User>(); map.put("aaa",new User()); pageContext.setAttribute("map", map); %> ${map}<br/> ${map.aaa}<%--获取map的value,是通过get(Key) --%><br/> ${map.aaa.name}${map.aaa.age}<br/> ${map["aaa"].name } </body> </html>在使用EL表达式时,它帮我们做了一些处理,使我们在使用时可以避免一些错误。它没有空指针异常,没有数组下标越界,没有字符串拼接。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>EL表达式的注意事项</title> </head> <body> <%--EL表达式的三个没有--%> 第一个:没有空指针异常<br/> <% String str = null; request.setAttribute("testNull",str); %> ${testNull} <hr/> 第二个:没有数组下标越界<br/> <% String[] strs = new String[]{"a","b","c"}; request.setAttribute("strs",strs); %> 取第一个元素:${strs[0]} 取第六个元素:${strs[5]} <hr/> 第三个:没有字符串拼接<br/> <%--${strs[0]+strs[1]}--%> ${strs[0]}+${strs[1]} </body> </html>运行结果图:
\
EL表达式除了能在四大域中获取数据,同时它可以访问其他隐式对象,并且访问对象有返回值的方法.
EL表达式中运算符如下图所示,它们都是一目了然的:
但是有两个特殊的运算符,使用方式的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.itheima.domain.User" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL两个特殊的运算符</title> </head> <body> <%--empty运算符: 它会判断:对象是否为null,字符串是否为空字符串,集合中元素是否是0个 --%> <% String str = null; String str1 = ""; List<String> slist = new ArrayList<String>(); pageContext.setAttribute("str", str); pageContext.setAttribute("str1", str1); pageContext.setAttribute("slist", slist); %> ${empty str}============当对象为null返回true<br/> ${empty str1 }==========当字符串为空字符串是返回true(注意:它不会调用trim()方法)<br> ${empty slist}==========当集合中的元素是0个时,是true <hr/> <%--三元运算符 条件?真:假 --%> <% request.setAttribute("gender", "female"); %> <input type="radio" name="gender" value="male" ${gender eq "male"?"checked":""} >男 <input type="radio" name="gender" value="female" ${gender eq "female"?"checked":""}>女 </body> </html>EL表达式也为我们提供隐式对象,可以让我们不声明直接来使用,十一个对象见下表,需要注意的是,它和JSP的隐式对象不是一回事:
EL中的隐式对象类型对应JSP隐式对象备注PageContextJavax.serlvet.jsp.PageContextPageContext完全一样ApplicationScopeJava.util.Map没有应用层范围SessionScopeJava.util.Map没有会话范围RequestScopeJava.util.Map没有请求范围PageScopeJava.util.Map没有页面层范围HeaderJava.util.Map没有请求消息头key,值是value(一个)HeaderValuesJava.util.Map没有请求消息头key,值是数组(一个头多个值)ParamJava.util.Map没有请求参数key,值是value(一个)ParamValuesJava.util.Map没有请求参数key,值是数组(一个名称多个值)InitParamJava.util.Map没有全局参数,key是参数名称,value是参数值CookieJava.util.Map没有Key是cookie的名称,value是cookie对象 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>EL表达式11个隐式对象</title> </head> <body> <%--pageContext对象 可以获取其他三个域对象和JSP中八个隐式对象--%> ${pageContext.request.contextPath} <br> <%--applicationScope sessionScope requestScope pageScope 操作四大域对象中的数据--%> <% request.setAttribute("username","zhangsan"); %> ${username} <br> ${requestScope.username} <br> <%--header headerValues 获取请求头数据--%> ${header["connection"]} <br> ${headerValues["connection"][0]} <br> <%--param paramValues 获取请求参数数据--%> ${param.username} <br> ${paramValues.hobby[0]} <br> ${paramValues.hobby[1]} <br> <%--initParam 获取全局配置参数--%> ${initParam["pname"]} <br> <%--cookie 获取cookie信息--%> ${cookie} <br> <%--获取Map集合--%> ${cookie.JSESSIONID} <br> <%--获取map集合中第二个元素--%> ${cookie.JSESSIONID.name} <br> <%--获取cookie对象的名称--%> ${cookie.JSESSIONID.value} <%--获取cookie对象的值--%> </body> </html>