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