1.什么是EL表达式2.EL表达式搜索域数据的顺序3.EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性4.EL表达式--运算5.EL表达式的11个隐含对象
1.什么是EL表达式EL表达式的全称:expression Language。表达式语言。
EL表达式的作用:主要是代替jsp页面中的表达式脚本,在jsp页面中进行数据的输出。因为EL表达式在输出数据时要比jsp的脚本要简洁。
EL表达式输出的格式是:${表达式}
EL表达式输出null值的时候,输出的是空串,jsp表达式脚本输出null值的时候,输出的是null字符串。
我们创建一个工程,在webapp目录下创建一个a.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
request.setAttribute("key","值");
%>
表达式脚本输出key的值是:<%=request.getAttribute("key")%>
EL表达式输出key的值是:${key}
表达式脚本输出key的值是:<%=request.getAttribute("key1")%>
EL表达式输出key的值是:${key1}
运行结果如下:
EL表达式主要是在jsp页面中输出数据。主要是输出域对象中的数据。
当四个域中都要相同的key值时,EL表达式会按照四个域从小到大的顺序去进行搜索,找到就输出。
我们在webapp目录下编写一个b.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
pageContext.setAttribute("key","pageContext");
request.setAttribute("key","request");
session.setAttribute("key","session");
application.setAttribute("key","application");
%>
${key}
运行结果:
我们任意的调换数据,结果还是pageContext。
接着我们注释掉pageContext,运行结果如下:
我们再把request注释掉,结果如下:
接着注释掉session,结果如下:
这是因为session在打开浏览器时被创建,我们关闭浏览器在搜索b.jsp,结果为application
我们先创建一个软件包,假设命名为com.bjpowernode,在包下创建一个Person类,代码如下:
package com.bjpowernode;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private String[]phones;
private Listcities;
private Mapmap;
public Person(){
}
public Person(String name,String[]phones,Listcities,Mapmap){
this.name=name;
this.phones=phones;
this.cities=cities;
this.map=map;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setPhones(String[]phones){
this.phones=phones;
}
public String[] getPhones(){
return this.phones;
}
public void setCities(Listcities){
this.cities=cities;
}
public List getCities(){
return this.cities;
}
public void setMap(Mapmap){
this.map=map;
}
public Map getMap(){
return this.map;
}
@Override
public String toString(){
return "Person{"+
"name="+name+
",phone="+ Arrays.toString(phones)+
",cities="+cities+
",map="+map+
"}";
}
}
然后在webapp目录下创建一个c.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.bjpowernode.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.ArrayList" %>
Title
<%
Person person=new Person();
person.setName("HelloWorld");
person.setPhones(new String[]{"18610541354","186888666","186999888"});
Listcities=new ArrayList();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
Mapmap=new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("person",person);
%>
输出Person:${person}
输出Person的name属性:${person.name}
输出Person的phones数组地址:${person.phones}
输出Person的phones数组属性:${person.phones[0]}
输出Person的cities集合中的元素值:${person.cities}
输出Person的cities集合中的个别元素值:${person.cities[0]}
输出Person的map集合:{$person.map}
输出Person的map集合中某个key的值:{$person.map.key1}
运行结果如下:
假设我们给Person类添加一个age属性,
private int age=18;
然后在c.jsp访问该属性
删除Person的age属性:{$person.age}
结果会报错。
我们在Person.java中添加getAge()方法,在重新运行,结果如下:
也就是说,在找数据时,不会直接找那个属性,而是寻找该属性对应的get方法。
1)关系运算
我们在webapp目录下创建一个d.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${12==12}或${12 eq 12}
${12 != 12}或${12 ne 12}
${12 > 12}或${12 gt 12}
${12 < 12}或${12 lt 12}
${12 <= 12}或${12 le 12}
${12 >=12}或${12 ge 12}
结果如下:
2)逻辑运算
我们修改d.jsp,代码如下:
${12==12 && 12>11 }或 ${12==12 and 12>11}
${12==12 || 12>11 }或 ${12==12 or 12>11}
${!true} 或 ${not true}
结果如下:
3)算术运算
修改d.jsp代码:
${12 +12}
${12-12}
${12*12}
${12/12}或${12 div 12}
${18%12}或${18 mod 12}
结果如下:
4)empty运算
可以判断一个数据是否为空,如果为空,则输出true,反之输出false
以下几种情况为空:
(1)值为null的时候,为空
(2)值为空串的时候,为空
(3)值是Object类型数组,长度为0的时候
(4)list集合,元素个数为0
(5)map集合,元素个数为0
我们创建一个e.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
Title
<%
request.setAttribute("emptyNull", null);
request.setAttribute("emptyStr","");
request.setAttribute("emptyArr",new Object[]{});
Listlist=new ArrayList<>();
list.add("abc");
request.setAttribute("emptyList",list);
Mapmap=new HashMap();
map.put("key1","value1");
request.setAttribute("emptyMap",map);
%>
${empty emptyNull}
${empty emptyStr}
${empty emptyArr}
${empty emptyList}
${empty emptyMap}
结果如下:
5)三元运算
表达式1?表达式2:表达式3
我们修改e.jsp,代码如下:
${12==12?"Hello":"World"};
${12!=12?"Hello":"World"};
结果如下:
6)"."点运算和[]中括号运算符
点运算可以输出Bean对象中某个属性的值。
[]中括号运算,可以输出有序集合中某个元素的值。并且[]中括号运算,还可以输出map集合中key里含有特殊字符的key的值
我们创建一个f.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
Title
<%
Mapmap=new HashMap();
map.put("aaa","aaaValue");
map.put("b+b+b","bbbValue");
map.put("c-c-c","cccValue");
request.setAttribute("map",map);
%>
${map}
${map.aaa}
${map.b+b+b}
${map['b+b+b']}
${map["c-c-c"]}
结果如下:
当key有特殊字符时,要获得value值时可以用[]将key包起来,同时key要加单引号或者双号
EL表达式中11个隐含对象是EL表达式中自己定义的,可以直接使用
变量 类型 作用 pageContext PageContextImpl 获取jsp中的九大内置对象 pageScope Map获取pageContext域中的数据 requestScope Map 获取request域中的数据 sessionScope Map 获取Session域中的数据 applicationScope Map 获取ServletContext域中的数据 param Map 获取请求的参数值 paramValues Map 获取请求参数的值,获取多个值的时候使用 header Map 获取请求头的信息 headerValues Map 获取请求头的信息,可以获取多个值的情况 cookie Map 获取当前请求的cookie信息 initParam Map 获取在web.xml中配置的 上下文参数
1)EL获取四个特定域中的属性
pageScope ==== pageContext域
requestScope ==== Request域
sessionScope ==== Session域
applicationScope ==== ServletContext域
我们创建一个scope.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
pageContext.setAttribute("key1","pageContext1");
pageContext.setAttribute("key2","pageContext2");
request.setAttribute("key2","request");
session.setAttribute("key2","session");
application.setAttribute("key2","application");
%>
${pageScope.key2}
${requestScope.key2}
${sessionScope.key2}
${applicationScope.key2}
结果如下:
2)pageContext对象的使用
1.协议
2.服务器IP
3.服务器端口
4.获取工程路径
5.获取请求方法
6.获取客户端IP地址
7.获取会话的id编号
我们创建一个pageContext.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%--
request.getScheme()它可以获取请求的协议
request.getServerName()获取请求的服务器IP或域名
request.getServerPort()获取请求的服务器端口号
request.getContextPath()获取当前路径
request.getMethod()获取请求的方式(GET or POST)
request.getRemoteHost()获取客户端的ip地址
session.getId()获取会话的唯一标识
--%>
${pageContext}
<%=request.getScheme()%>
<%=request.getServerName()%>
<%=request.getServerPort()%>
<%=request.getContextPath()%>
<%=request.getMethod()%>
<%=request.getRemoteHost()%>
<%=session.getId()%>
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}
结果如下:
3)EL表达式其他隐含对象的使用(了解一下即可)
创建一个other_el_obj.jsp
代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Titile
${param}
结果如下:
没有参数,那么我们在浏览栏后面添加参数
http://ip:port/other_el_obj.jsp?username=cxy&password=666,结果如下:
修改other_el_obj.jsp如下:
输出请求参数username的值:${param.username}
输出请求参数password的值:${param.password}
结果如下:
我们修改other_el_obj.jsp如下:
输出请求参数username的值:${param.username}
输出请求参数password的值:${param.password}
输出请求参数hobby的值:${paramValues.hobby[0]}
输出请求参数hobby的值:${paramValues.hobby[1]}
在地址栏输入:
http://ip:port/other_el_obj.jsp?username=cxy&password=666&hobby=cpp&hobby=java
结果如下:
修改web.xml,添加代码如下:
url jdbc:mysql1///test
修改other_el_obj.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Titile
输出请求参数username的值:${param.username}
输出请求参数password的值:${param.password}
输出请求参数hobby的值:${paramValues.hobby[0]}
输出请求参数hobby的值:${paramValues.hobby[1]}
输出请求头[User-Agent]的值:${header['User-Agent']}
输出请求头[Connection]的值:${header.Connection}
输出请求头[User-Agent]的值:${headerValues['User-Agent'][0]}
${cookie}
获取cookie的名称:${cookie.JSESSIONID.name}
获取cookie的值:${cookie.JSESSIONID.value}
${initParam}
输出<Context-param">>url的值:&{initParam.url}
在浏览栏上输入:http://ip:port/other_el_obj.jsp?username=cxy&password=666&hobby=cpp&hobby=java
结果如下:



