EL表达式(经典)

本文详细介绍了EL(Expression Language)表达式,包括其概念、作用、语法和各种运算,如算数、比较、逻辑和三目运算符。还探讨了如何从对象、Map和List中获取值,以及如何处理空值。同时,文章提到了EL表达式的忽略方法,并介绍了隐式对象的使用,特别是pageContext对象在获取虚拟路径中的应用。

概念

作用

语法

忽略el表达式

忽略单个

忽略全部

使用

运算

算数运算

比较运算符

逻辑运算符

三目运算符

空运算符与非空运算符

获取值

语法

注意

从对象中获取存储的值

从Map中获取值

从List获取值

隠式对象


 

概念

  • 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个域

域名称真实类
pageScopepageContext
requestScoperequest
sessionScopesession
applicationScopeapplication(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,得到虚拟路径

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林高禄

你打不打赏,我都会一直写博客

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值