总的总结
EL简介
EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。
EL表达式用于代替JSP表达式(<%= %>)在页面中做输出操作。
EL表达式仅仅用来读取数据,而不能对数据进行修改。
使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。
EL基本使用
EL表达式总是放在{}中,而且前边有一个$作为前缀。
${EL表达式}
获取域中的对象可以直接使用对象名,如获取域中名字为user的对象
${user}
获取对象的属性值可以直接通过“对象.属性名”
${user.name}
${user.age}
注意:这里的属性名是get和set方法对应的属性值,并不是对象中的变量名。
比如:如果获取name属性值,那么该对象中必定要存在一个getName()方法。
获取对象的属性也可以通过“对象[“属性名”]”
${user[“name”]}
${user[“age”]}
获取Map中属性时可以以直接通过属性的key
${map.key}
${map[key]}
在指定域中获取属性
在EL表达式中如果我们直接使用属性名如:${user},它将会在四个域中由小到大依次查找。顺序:pageScope、requestScope、sessionScope、applicationScope。
也可以指定从哪个域中获取:
${ pageScope .user}:当前页面
${requestScope.user}:当前请求
${sessionScope.user}:当前会话
${sessionScope.user}:当前应用
EL隐含对象
EL中包含11个隐含对象,这些对象可以在EL表达式中直接使用。
pageContext
pageContext和JSP中的pageContext功能一样。
请求域
请求域主要用于获取域对象中的属性,四个对象分别对应四个请求域。
pageScope
requestScope
sessionScope
applicationScope
请求参数
参数对象主要用于获取get或post请求中的参数。
param;
获取指定的请求参数, 如:${param.username}
paramValues;
获取请求参数数组,如:${paramValues.sport[1]}
其他
header;
headerValues;
initParam;
cookie;
EL逻辑运算2
运算符 | 说明 | 范例 | 结果 |
+ | 加 | ${17+5} | 22 |
- | 减 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | ${17/5}或${17 div 5} | 3 |
%或mod | 取余 | ${17%5}或${17 mod 5} | 2 |
==或eq | 等于 | ${5==5}或${5 eq 5} | true |
!=或ne | 不等于 | ${5!=5}或${5 ne 5} | false |
<或lt | 小于 | ${3<5}或${3 lt 5} | true |
>或gt | 大于 | ${3>5}或${3 gt 5} | false |
<=或le | 小于等于 | ${3<=5}或${3 le 5} | true |
>=或ge | 大于等于 | ${3>=5}或${3 ge 5} | false |
&&或and | 并且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否为空 | ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} | true |
==========================================================================================================================================
细致的总结
jsp页面开始时,如果大量的使用jsp表达式和脚本片段,会造成页面的可读性差
jsp页面中使用的数据一般是从Servlet中通过域对象共享过来的
jsp2.0之后不推荐使用jsp表达式和脚本片段
jsp表达式 : 向页面输出内容(变量)
使用EL表达式替代
EL表达式: jsp的内置的表达式语言 expression language
默认作用:从域中获取属性值 显示到页面中
EL表达式如果没有取到值,页面中什么都不显示
EL表达式只能用来获取属性值显示到页面中,不能设置属性值
EL只能调用对象的有返回值的方法,并且支持以属性名的方式去调用
EL对取到的值会自动进行类型转换
EL需要操作的数据必须先存到域中然后再通过EL获取使用
语法:
${表达式 }
1、全域查找:根据表达式从域中获取属性值显示到页面中
${key }
el自动根据传入的key遍历所有域查询对应的属性值,找到则返回停止查找
伪代码:
Object obj = "";
obj = pageContext.getAttribute("key");
if(obj==""){
obj = request.getAttribute("key");
}
if(obj==""){
obj = session.getAttribute("key");
}
if(obj==""){
obj = application.getAttribute("key");
}
2、指定域查询: pageScope、requestScope、sessionScope、applicationScope(注意域的作用大小)
${xxxScope.key}
3、获取域中的复杂属性:
${obj.属性名 } 等价于 obj.get属性名();
4、取出域中的list中的值:
${list[index]}
5、获取域中的map指定键对应的值:
5.1 如果map的键没有特殊符号:${map.key}
5.2 如果map的键有特殊符号:${map['t2-1']}
jsp脚本片段: 编写java逻辑代码
使用jstl标签库代替,将一段段的逻辑代码封装为jsp标签[jsp:forward]
EL中方法的调用:
el中不推荐直接调用方法 , 推荐以属性名的形式去调用get方法
并不是真正的去使用属性(属性是私有的没法调用),是通过属性名去找对应的get、set方法,所以我们在封装时尽量规范(让ide自动生成)
user.username ==》 user.getUsername();
BeanHandler: 可以将查询到的第一条记录的数据封装位对象
根据查询到的列名找javabean的对应的setXXX方法,调用方法时将列的值传入
EL需要操作的数据必须先存到域中然后再通过EL获取使用
<%//必须存入值才能通过EL获取到 List list = new ArrayList(); list.add(new User(11, "wangyang" , "123456" , "wy@12.com")); list.add(123); list.add("hehe"); //el操作的值必须先存到域中 pageContext.setAttribute("list", list); %> |
EL表达式支持数学运算
所以当获取的值中带有运算符号时,必须用[]括起来
${map['t2-3'] }<br/><!-- el表达式支持数学运算 -->
EL为了可以将其他的数据获取显示到页面中,提供了11个内置对象和jsp9大内置对象作用类似,但是不一样
都是我们熟悉的,想想九大内置对象(面试提问率很高的)
1、pageContext:不能用来向域中设置属性值,也不能获取属性值
和jsp的pageContext类似,用来获取jsp的其他8个隐含对象
作用:拼接url地址
使用少 pageContext.request.contextPath 获取上下文路径
2、pageScope
类型:Map<String , Object> pageScope
代表: page域中的属性值集合
作用:获取pageContext域中的属性值
3、requestScope
类型:Map<String , Object>
代表:request域中的数据
作用:
4、sessionScope
类型:Map<String , Object>
代表:session域中的数据
作用:
5、applicationScope
类型:Map<String , Object>
代表:application域中的数据
6、param: 使用多 http://localhost:8080/08_web_EL/el02_obj.jsp?username=laowang&password=12345
param.put("username" , "laowang");
param.put("password" , "123456");
类型:Map<String , String>
代表:一个请求参数对应一个值的请求参数的集合
作用:获取请求参数
7、paramValues:username=laowang&password=12345&hobby=tingjie&hobby=cls
paramValues.put("hobby" , new String[]{"tingjie" , "cls"});
类型:Map<String , String[]>
代表:一个键对应多个值的请求参数的集合
8、header: User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36
header.put("User-Agent" ,"....");
类型:Map<String , String>
代表:请求报文的请求头数据
作用:获取请求头数据
9、headerValues:一般不用
类型:Map<String , String[]>
代表:一个请求头的键对应多个值的请求
作用:
10、initParam:
类型:Map<String , String>
代表:jsp页面翻译后的Servlet配置的初始化参数
作用:不用
11、cookie: 服务器识别浏览器的标记
类型:Map<Stirng , Cookie>
代表:浏览器请求报文中的cookie
作用:获取cookie
你会发现都是键值对,也就是获取各种各样的值!!!!! |
<h3>pageContext</h3> 拼接url地址:${pageContext.request.scheme }://${pageContext.request.serverName }:${pageContext.request.serverPort }${pageContext.request.contextPath }/ <h3>取出域中的值[键有特殊符号]</h3> <% request.setAttribute("t2-1", "hehe"); %> ${requestScope.t2-1 } <h3>获取请求参数</h3> ${param.username }<br/> ${paramValues.hobby[0] } <h3>获取请求头数据</h3> <%-- ${header.User-Agent } --%><!-- 先从请求头的集合中根据User键去获取对应的值没有查找到, 再根据Agent全域查找对应的值也没有找到 --> ${header['User-Agent'] } |
取值的不同:
<% request.setAttribute("age" , 18); %> <!-- 使用jsp表达式取出值显示到页面中: 在servlet中和jsp页面的表达式或脚本片段中按照以下语法来使用 --> <%=request.getParameter("username") %><br/> <%=request.getAttribute("age") %><br/>
<!-- 使用EL表达式取出值显示到页面中: el语法 --> ${param.username }<br/> ${requestScope.age } |
EL数学运算和逻辑运算
EL表达式支持数学和逻辑运算,先将表达式进行运行计算,再将计算后的结果输出到页面中显示
如果表达式中使用的是+-*/ 会自动将表达式两边的不是数字的内容转为数字使用
如果是逻辑运算符不会自动转换
+只能进行数字运算
支持查找集合中的下标查找
空值判断:(区分一下==和empty的不同)
EL表达式经常会获取Servlet中共享的数据集合进行遍历显示
,遍历之前需要判断是否为空
页面中如果集合==null 或者 集合的长度为0,就没有必要遍历
EL中提供了empty元素符: 用来做空值判断,它认为=null的和长度为0的内容就是空,判断后返回true
- 只能对字符串集合数组进行长度判断,自定义类的对象没有判断