目录
一、EL表达式简介
- EL 表达式的全称:Expression Language。是表达式语言。
- EL 表达式的作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
- EL表达式的语法格式:${表达式}。EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
二、EL表达式获取数据
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式简介</title>
</head>
<body>
<%
request.setAttribute("userName", "root");
%>
JSP表达式输出userName:<%= request.getAttribute("userName") %><br />
JSP表达式输出password:<%= request.getAttribute("password") %><br />
EL表达式输出userName:${userName }<br />
EL表达式输出password:${password }<br />
</body>
</html>
1.EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。主要是输出域对象中的数据。当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。如下:
<body>
<%
pageContext.setAttribute("key", "pageContextValue");
request.setAttribute("key", "requestValue");
session.setAttribute("key", "sessionValue");
application.setAttribute("key", "applicationValue");
%>
EL表达式输出数据:${key }<br />
</body>
访问浏览器结果:EL表达式输出数据:pageContextValue
2.EL表达式获取JavaBean的数据
2.1 JavaBean规范
- JavaBean 类必须是一个公共类,并将其访问属性设置为 public。
- JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
- 一个JavaBean类不应有公共实例变量,类变量都为private。
- 持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量。若是布尔值,可以用isXxx来代替getXxx。
- 成员变量的第二个字母最好不要大写, 像rCategory, hFilename之类,生成getter 和setter会有问题。
2.2 获取JavaBean中不同类型的数据
public class Person {
private String name;
private String[] hobbies;
private List<String> friends;
private Map<String, String> map;
public String getName() {
System.out.println("Person类的getName方法");
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getHobbies() {
System.out.println("Person类的getHobbies方法");
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public List<String> getFriends() {
System.out.println("Person类的getFriends方法");
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
public Map<String, String> getMap() {
System.out.println("Person类的getMap方法");
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Person类的toString方法";
}
}
<body>
<%
String[] hobbies = {"打篮球","下棋"};
List<String> friends = new ArrayList<String>();
friends.add("李四");
friends.add("王五");
Map<String, String> hashMap = new HashMap<>();
hashMap.put("key1", "value1");
hashMap.put("key2", "value2");
Person p = new Person();
p.setName("张三");
p.setHobbies(hobbies);
p.setFriends(friends);
p.setMap(hashMap);
pageContext.setAttribute("person", p);
%>
EL表达式输出p对象: ${person }<br />
EL表达式输出name成员: ${person.name }<br />
EL表达式输出hobbies数组的第一个元素: ${person.hobbies[0] }<br />
EL表达式输出hobbies数组越界的元素: ${person.hobbies[10] }<br />
EL表达式输出firends集合: ${person.friends }<br />
EL表达式输出firends集合的第一个元素: ${person.friends[0] }<br />
EL表达式输出map: ${person.map }<br />
EL表达式输出map的第一个键对应的值: ${person.map.key1 }<br />
</body>
浏览器访问结果:
由于在JavaBean中每个成员的getter方法中都往控制台输出了一句话,下面为控制台输出:
可以看到,EL表达式获取值其实是通过JavaBean的getter方法获取数据。
三、EL的11个隐含对象
EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。如下:
变量 | 类型 | 作用 |
pageContext | PageContextImpl | 它可以获取 jsp 中的九大隐含对象 |
pageScope | Map<String,Object> | 它可以获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 它可以获取 request 域中的数据 |
sessionScope | Map<String,Object> | 它可以获取 session 域中的数据 |
applicationScope | Map<String,Object> | 它可以获取 application 域( ServletContext)中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值,获取多个值的时候使用。 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息,它可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的 Cookie 信息 |
initParam | Map<String,String> | 它可以获取在 web.xml 中配置的<context-param>上下文参数 |
1.pageContext的使用
EL表达式中的pageContext可以获取JSP中的九个隐含对象,JSP中的几个对象的原型我们可以查看其转换后的Servlet类得知。比如JSP中的request对象就是HttpRequest对象,session就是HttpSession对象,所以我们可以调用其暴露出来的getter方法,而EL表达式只不过是以“.”的形式执行其getter方法。
<body>
1.获取请求的协议: ${pageContext.request.scheme }<br />
2.获取服务器IP: ${pageContext.request.serverName }<br />
3.获取服务器端口: ${pageContext.request.serverPort }<br />
4.获取工程路径: ${pageContext.request.contextPath }<br />
5.获取请求方法: ${pageContext.request.method }<br />
6.获取客户端 IP: ${pageContext.request.remoteHost }<br />
7.获取会话ID: ${pageContext.session.id }<br />
</body>
浏览器访问结果如下:
2.获取四个特定域中的属性
如果不使用EL域对象那么其搜索域数据的顺序是由小到大的,EL提供4个域对象方便精准获取数据。
<body>
<%
pageContext.setAttribute("key", "pageContextValue");
request.setAttribute("key", "requestValue");
session.setAttribute("key", "sessionValue");
application.setAttribute("key", "applicationValue");
%>
pageContext域中的数据: ${pageScope.key }<br />
request域中的数据: ${requestScope.key }<br />
session域中的数据: ${sessionScope.key }<br />
application域中的数据: ${applicationScope.key }<br />
</body>
浏览器访问结果如下:
3.其他隐含对象的使用
获取请求参数
<body>
<%--请求参数:?userName=123&hobby=c&hobby=java --%>
1.获取请求参数userName的值:${param.userName }<br />
2.获取请求参数userName的值:${paramValues.userName[0] }<br />
3.获取请求参数hobby的值 : ${paramValues.hobby[0] }<br />
4.获取请求参数hobby的值 : ${paramValues.hobby[1] }<br />
</body>
浏览器访问结果如下:
获取请求头信息
<body>
1.输出请求头【User-Agent】的值:${header['User-Agent'] } <br />
2.输出请求头【User-Agent】的值:${headerValues['User-Agent'][0] } <br />
3.输出请求头【Accept-Language】的值:${header['Accept-Language'] } <br />
4.输出请求头【Connection】的值:${header.Connection } <br />
5.输出请求头【Host】的值:${header.Host } <br />
</body>
浏览器访问结果如下:
获取Cookie信息
<body>
1.获取 Cookie 的名称:${cookie.JSESSIONID.name } <br />
2.获取 Cookie 的值:${cookie.JSESSIONID.value } <br />
</body>
浏览器访问结果如下:
获取web.xml中配置的值
<context-param>
<param-name>userName</param-name>
<param-value>root</param-value>
</context-param>
<body>
获取全局配置userName 的值:${initParam.userName } <br />
</body>
访问结果为:root
四、EL中的运算符
1.关系运算
关系运算符 | 示例 | 结果 |
== 或 eq | ${5 == 5} 或 ${5 eq 5} | true |
!= 或 ne | ${5 != 5} 或 ${5 ne 5} | false |
< 或 lt | ${2 < 8} 或 ${2 lt 8 } | true |
> 或 gt | ${2 > 8 } 或 ${2 gt 8 } | false |
<= 或 le | ${2 <= 2 } 或 ${2 le 2 } | true |
>= 或 ge | ${2 >= 6} 或 ${2 ge 6} | false |
2.逻辑运算
逻辑运算符 | 示例 | 结果 |
&& 或 and | ${12 < 20 && 2 > 1} 或 ${12 < 20 and 2 > 1} | true |
|| 或 or | ${12 == 12 || 1 > 6} 或 ${12 == 12 or 1 > 6} | true |
! 或 not | ${! true} 或 ${not true} | false |
3.算数运算
算数运算符 | 示例 | 结果 |
+ | ${10 + 1} | 11 |
- | ${10 - 1} | 9 |
* | ${10 * 2} | 20 |
/ 或 div | ${10 / 2} 或 ${10 div 2} | 5 |
% 或 mod | ${11 % 10} 或 ${11 mod 10} | 1 |
4.empty运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。
以下几种情况为空:
- 值为 null 值的时候,为空
- 值为空串的时候,为空
- 值是 Object 类型数组,长度为零的时候
- list 集合,元素个数为零
- map 集合,元素个数为零
5.三元运算符
表达式 1?表达式 2:表达式 3
如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
6."."点运算和[]中括号运算符
.点运算,可以输出 Bean 对象中某个属性的值。[]中括号运算,可以输出有序集合中某个元素的值。并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
<body>
<%
Map<String, String> hashMap = new HashMap<>();
hashMap.put("Accept-Language", "xxx");
hashMap.put("User-Agent", "yyy");
hashMap.put("Connection", "zzz");
pageContext.setAttribute("map", hashMap);
%>
${pageScope.map["Accept-Language"] }<br />
${pageScope.map["User-Agent"] }<br />
${pageScope.map.Connection }<br />
</body>
最后需要注意的是:EL表达式目的是替代JSP脚本表达式可以使页面变得整洁,方便,避免<%= %>的出现。由于JSP中Java代码就是写在<%%>中的,这将导致不能与EL表达式一起使用,可以利用JSP中的各种标签替代Java代码,这样可以结合EL表达式。比如对于一些使用if判断的java代码可以使用JSP标签来代替<c:if>等。