概念
- Expression Language 表达式语言
作用
- 替换和简化jsp页面中java代码的编写
语法
- ${表达式}
如${3+4}
启动访问el1.jsp页面
忽略el表达式
忽略单个
要想忽略某个el表达式,使其已原本的表达式显示在页面中,则可以 在表达式前面加反斜杠\
访问,则\${3+4}<br>中的EL表达式${3+4}会被忽略,已字符串${3+4}显示在页面
忽略全部
要想忽略全部,那么第一种就是在每个EL表达式前都加上反斜杠\,这样是不是很麻烦。第二种就是在JSP的page指令中添加isELIgnored="true",这样就忽略了当前JSP页面的EL表达式
访问el1.jsp,发现单个忽略的反斜杠\也被当成字符串了
使用
运算
算数运算
- 加+
- 减-
- 乘*
- 除/,也可以使用div
- 取模%,也可以使用mod
例子
访问el2.jsp
比较运算符
- 大于 >
- 大于等于 >=
- 小于 <
- 小于等于 <=
- 等等 ==
- 不等于 !=
例子
访问el2.jsp报错,提示11行错误
我们更改为真确的
访问el2.jsp
可见,我们的el表达式使用错误,页面就会报异常
逻辑运算符
- 与 && (and)
- 或 || (or)
- 非 !(not)
例子
访问el2.jsp,报错了,11行报错,也就是表达式${! 7>3}是不正确的,所以我们要用括号把7>3括起来,变为${! (7>3)},t同理,${not 7>8}里的7>8也要用括号括起来,变为${not (7>8)}
修改代码
访问el2.jsp
三目运算符
- 表达式?结果1: 结果2
例子
访问el2.jsp,显然7肯定是大于3的,所以页面显示了3
空运算符与非空运算符
- empty:用于判断字符串、集合、数组对象是否为null或者长度是否为0
- not empty:用于判断字符串、集合、数组对象不为null并且长度不为0
例子(这里的例子关于取name的值看不懂没关系,往下看EL表达式的取值,就能明白)
访问el2.jsp
获取值
语法
${域名称.键名}
EL表达式只能成域对象中获取值,有4个域
域名称 真实类 pageScope pageContext requestScope request sessionScope session applicationScope application(ServletContext)
例子
访问el3.jsp
注意
四个域的范围从小到大为:pageScope -> requestScope -> sessionScope -> applicationScope
如果不指定域名称,只执行键名,那么会默认从范围最小的域开始找,找不到再往上一个范围找
这里我们往session存入name,再往request存入name,接着再往session存入name,我们直接访问键名name
访问el3.jsp
- 可见name拿到的是request里面的name,因为我们没有指定域对象,所以会默认从最小范围的pageScope 开始找。找不到再requestScope的name,所以拿到的是林大帅2,
- 找age的时候,pageScope 和requestScope都没有,接着找sessionScope的时候找到了
- 也可以看出,有多个键名同一样的时候,想要找到sessionScope的name,那就指定域名称就可以了,所以sessionScope.name找到的就是林大帅
- 键名不存在的时候,也不会报错,不比如我们获取的ageee不存在,没报错,输出的是空串
从对象中获取存储的值
这里我们新建一个student类
package com.lingaolu.bean;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* @author 林高禄
* @create 2020-08-01-18:43
*/
public class Student {
private String name;
private Date date1;
private List<Student> friends;
/**
* 逻辑视图
* @return
*/
public String getMyDate(){
if(date1 != null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date1);
}else{
return "";
}
}
public String getNamehehe() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate1() {
return date1;
}
public void setDate1(Date date1) {
this.date1 = date1;
}
public List<Student> getFriends() {
return friends;
}
public void setFriends(List<Student> friends) {
this.friends = friends;
}
}
注意我们student类的部分代码,我们下面用到,日期转化,以及name的get方法我取名为getNamehehe,也就是其属性为namehehe
例子,将学生存入域,在从域中获取,通过类.属性名(注意变量name的属性名为namehehe)
访问el4.jsp,name不存在报的错
可见s1这个键名是不存在,但是没有报错,这个在上面已经演示过,但是为何18行name会报错,因为它的原理是这样的,我们在取name的时候,程序会把name拼成getName方法,会找s类的getName方法,s类是Student类,所以会去找Student类的getName方法,但是Student类并没有getName方法,我们已经修改过这个方法名了,改为了getNamehehe,所以我们要获取name的值,在el表达式中就只能用属性namehehe,而不能用变量name,name是变量,namehehe才是属性
我们修改下代码
访问el4.jsp
注意我们Student类里面的getMyDate()方法,因为我们原始的时间格式可能不是我们想要的,所以我们用一个逻辑视图方法封装起来,这样就能得到我们想要额时间格式,这也是常用的处理方法,当然还有其他的处理方法,那就是使用JSTL标签格式化时间
从Map中获取值
从Map中获取有2中方式,一种是map对象.key,一种是map对象["key"]
例子,将学生放入map,再把map放入域里面
访问el4.jsp,即使我们的map中没有s1,也没有报错,只是输出空字符
从List获取值
从List中获取值是通过下标获取,list对象[下标]
例子,新建2个学生,放进List,再建一个学生,再把前面的list辅助给后面学生的friends属性
访问el4.jsp,我们的std.friends就是list集合,我们的集合只有2个元素,但是即使我们取的下标为2,索引越界了,也没有报错,只是输出了空字符
隠式对象
EL表达式有11个隠式对象,其中主要的就是pageContext,主要是用它来获取虚拟路径,这样我们的JSP页面也能动态的获取到虚拟路径了
pageContext还可以获取到JSP的内置对象
例子,获取虚拟路径,先把我们的虚拟路径改了,改为web
访问el5.jsp,得到虚拟路径
本文详细介绍了EL(Expression Language)表达式,包括其概念、作用、语法和各种运算,如算数、比较、逻辑和三目运算符。还探讨了如何从对象、Map和List中获取值,以及如何处理空值。同时,文章提到了EL表达式的忽略方法,并介绍了隐式对象的使用,特别是pageContext对象在获取虚拟路径中的应用。





































756

被折叠的 条评论
为什么被折叠?



