针对EL表达式的本质以及规范的透析

简介: EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

1.EL表达式介绍


  • EL(Expression Language ),表达式语言。是一种在JSP页面中 获取数据的简单方式。EL表达式的基本语法很简单:在JSP页面的任何静态部分均可以通过 ${experssion} 的形式获取指定表达式的值。
  • EL表达式只能处理四大域中的属性值以及常量


2. EL表达式获取数据方式


  • EL只能从四大域中获取数据。 其查找顺序是:依此按照由小到大的范围从四大域名中查找指定名称的属性值。
  • 四大域名的范围大小:application>session>request>pageContext
  • 注意:在Servlet中只有三个作用域,没有pageContext作用域。
<%
    String username = "今天天气不错";
%>
username = ${username } <br>   <%--获取不到这个username属性值--%>
<%
    String username = "今天天气不错";
    pageContext.setAttribute("username",username);
    request.setAttribute("username",username);
%>
username = ${username }<br>  <%--输出结果:username=--%>
<%
    pageContext.setAttribute("username","北京");
    request.setAttribute("username","上海");
    session.serAttribute("username","重庆");
    application.setAttribute("username","武汉");
%>
username = ${username }<br> <%---输出结果:username=北京--%>
复制代码


3.使用EL表达式提供的作用域别名来获取数据


  • JSP中为四大作用域提供了作用域别名

微信截图_20220609232023.png

<%
    pageContext.setAttribute("username","北京");
    request.setAttribute("username","上海");
    session.serAttribute("username","重庆");
    application.setAttribute("username","武汉");
%>
username = ${pageScope.username}<br> <%---输出结果:username=北京--%>
username = ${sessionScope.username}<br>  <%--输出结果:username=重庆--%>
复制代码


4.获取对象的属性值


  • 定义一个student类,在JSP文件中使用EL表达式来获取student的属性

注意:EL表达式中的这个属性并不是student类中的成员变量名,而是getName()、getAge()去掉get以及括号将Age改为小写age,这个才是EL表达式的属性值,一般情况下属性值等于student类中的成员变量名,但是boolean类型的属性值和成员变量的不相等的。boolean类型的成员变量的获取成员变量的方式是isSex(),所以对应的EL表达式的属性值是sex。

<body>
    <%
        Student student = new Student("张三",23);
        pageConntext.setAttribute("student",student);
    %>
    student = ${student}  <%--可以获取到student的信息(重写了toString()方法)--%>
    <%--EL表达式属性值要和student类中的属性相对应--%>
    name = ${student.name} <%--获取到student对象的name值--%>
    age = ${student.age} <%--获取到student对象的name值--%>
    name = ${student['name']} <%--获取到student对象的name值--%>
    age = ${student['age']} <%--获取到student对象的name值--%>
</body>
复制代码


5.几种特殊的属性值


  • 当一个类不存在的时候,要获取这个类中属性。此时不会抛出空指针异常,其仅仅是不显示而已。
name = ${student1.name}   <%--此时的输出结果是:name=  --%>
复制代码
  • 当student类中声明了一个school类的时候,要获取到school类中的属性值,此时使用多次点的方式。
school = ${student.school.sname}  <%-- 此时获取到的是student类中调用的school类中的snames属性值-->
复制代码


6. EL访问数组(Array)


  • 访问普通的数组
<%
    String[] name = new String[]{"李四","张三","王五"};
    pageContext.setAttribute("names",name);
%>
name[1] = ${names[1]}   <%--取出的数据为:张三--%>
<%--若访问的数组元素的下标超过了数组下标最大值,EL不会输出下标越界异常--%>
name[5] = ${name[5]} 
复制代码
  • 访问对象数组
<%
    Student[] students = new Student[2];
    students[0] = new Student("张三",20);
    student[1] = new Student("李四",30);
    pageContext.setAttribute("students",students);
%>
student[0].name = ${student[0].name}  <%--输出的结果为:张三--%>
student[1].age = ${student[1].age}  <%--输出的结果为:30--%>
复制代码


7. EL访问集合(List)


  • EL表达式可以通过索引访问List集合,但无法访问Set。因为Set中不存在索引。
<%
    List<Sting> names = new ArrayList<>();
    names.add("张三");
    names.add("李四");
    names.add("王五");
    pageContext.setAttribute("names",names);
%>
<%--第一个输出结果为王五,和上边一样,不会报下标越界异常--%>
name[2] = ${name[2]}
name[200] = ${name[200]}
复制代码


8. EL访问Map集合(map)


  • Map中可以使用key来获取到values值
<%
    // map集合中存储的是Object类型。可以存储任意类型
    Map<String,Object> map = new HashMap<>();
    map.put("student",new Student("张三",age));
    map.put("mobile","123456");
    map.put("age",20);
    pageContext.setAttribute("map",map);
%>
<%--这里发生了一个类型的向下转型,将Object类型转换为student类型--%>
student.name = ${mpa.student.name}
mobile = ${map.mobile}
age = ${map.age}
复制代码


9.EL表达式中的运算符


  • EL表达式支持的运算符

微信截图_20220609232152.png

  • 除了上述运算符之外,非常重要的运算符 empty,这个运算符用于判断变量值是否为空,其用法为${empty 变量},如果变量为空则返回true
  • 若变量为定义,返回值是 true
  • 若变量为String类型,且其值为空串,则返回 true
  • 若变量为引用和类型,且其值为null,则返回 true
  • 若变量为集合类型,且不包含任何元素,则返回true

微信截图_20220609232207.png

10. EL内置对象

微信截图_20220609232225.png

  • 就像JSP一样代码以及表达式中可以使用九个内置对象一样,EL表达式中,同样也存在内置对象,并且存在11个内置对象。


10.1 pageContext内置对象


  • 该pageComtext与JSP内置对象中的pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。 注意:这些对象不是EL中的内置对象。这些对象只能pageContext获取。
  • 在EL表达式中可以通过 ${pageContext.request}获取request对象。 其底层实际调用的pageContext.getRequest()方法。同理,也可以通过类似的方式获取到其他对象。
  • 在这些获取的对象中,有一个是实际工程中最常用的: ${pageContext.request.contextPath},用于获取当前项目的发布到服务器的名称。一般用在JSP页面的路径前。
  • ${pageContext.reuquest.contextPath}代表是的当前的项目,registerServler代表的是将该JSP文件中的数据提交到的位置文件。

微信截图_20220609232334.png

  • 注意:EL表达式只能用于JSP文件。
  • 在EL表达式的11个内置对象中,除了pageContext外,其他10个内置对象,其类型均为java.util.Map类型


10.2 EL表达式中与参数相关的内置对象


10.2.1 param对象


  • ${param.属性值}:底层调用的是 request.getParameter()方法,这个方法获取到的是一个属性对应的一个值。
  • param对象用来获取请求信息中的参数信息。
  • 使用form提交表单可以将请求参数传递到任何的文件(Java、JSP都可以)
<%--提交界面--%>
<body>
    <form action=""${pageContext.request.contextPath}/show.jsp" method="get">
        姓名:<input type="text" name="name"/><br>
        年龄:<input type="text" name="age"/><br>
        <input type="submit" value="注册"/>
    </form>
</body>
复制代码
  • 在提交界面中给定请求参数的属性值

微信截图_20220609232417.png

<%--获取请求参数界面,获取请求中的指定参数值,其底层实际调用的是request.getParameter--%>
name = ${param.name}<br>
age = ${param.age}<br>
复制代码
  • 在结果界面(show.jsp)中显示获取到的请求参数值

微信截图_20220609232430.png

10.2.1 paramValues对象


  • ${paramValue.属性值}:这个属性底层调用的是 req.getParameterValues(),这个方法获取到的属性的属性值有多个,获取到的是一个结果的集合。


11. EL表达式不支持对字符串的处理


${"ab" + "c"} <%--会报错--%>
复制代码


12. EL表达式总结


  • EL不能出现在Java代码块、表达式块等JSP动态部分。
  • EL只能从pageContext、request、session、application四大域属性空间中获取数据。
  • EL表达式只能获取数据,不可以修改数据。
  • EL表达式不会抛出空指针异常,若访问一个null对象的属性,则什么也不显示。
  • EL不会抛出数组下标越界已异常,若访问一个数组中的不存在的元素,则什么也不显示。
  • EL不具备对字符串进行处理的能力,旧连简单的字符串拼接都不可以(此时需要使用JSTL中提供的标准标签中的方法来处理字符串。)



相关文章
|
SQL API Python
Python DB API下规范下cursor对象常用接口
Python DB API下规范下cursor对象常用接口。
261 4
|
Arthas Cloud Native Java
是谁在调用我?使用 arthas+jprofiler 做复杂链路分析
Arthas 是阿里巴巴开源的应用诊断利器,提供了 profiler 命令,可以生成热点火焰图。通过采样录制调用链路来做性能分析,极大提升了线上排查性能问题的效率。
是谁在调用我?使用 arthas+jprofiler 做复杂链路分析
|
5月前
|
机器学习/深度学习 人工智能 算法
AI的出现,如何判定程序员的水平高不高?
本文探讨了AI时代评判程序员水平的标准,涵盖基础知识与编程能力、AI技术理解与应用能力、问题解决与创新能力及团队协作与沟通能力等多方面。同时,强调生成式人工智能认证(GAI认证)对程序员职业发展的助力,包括增强专业认可度、拓展职业空间和提升学习能力。程序员需不断学习,适应AI浪潮,以保持竞争力。
|
存储 缓存 关系型数据库
|
7月前
|
存储 关系型数据库 MySQL
图解MySQL【日志】——Undo Log
Undo Log(回滚日志)是 MySQL 中用于实现事务原子性和一致性的关键机制。在默认的自动提交模式下,MySQL 隐式开启事务,每条增删改语句都会记录到 Undo Log 中。其主要作用包括:
263 0
|
XML 前端开发 Java
掌握Spring EL表达式的基础知识
掌握Spring EL表达式的基础知识
520 1
|
分布式计算 大数据 BI
MaxCompute操作报错合集之返回错误代码ODPS-0110999,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
240 1
|
应用服务中间件 API nginx
网站统计——利用开源的网站流量分析统计工具
网站统计——利用开源的网站流量分析统计工具
222 0
|
SQL 缓存 PHP
【PHP开发专栏】PHP数据库查询优化技巧
【4月更文挑战第29天】本文探讨了PHP数据库查询优化技巧,包括数据库设计的规范化与反规范化,合理使用索引,优化查询逻辑,以及避免SELECT *。在SQL查询优化中,利用EXPLAIN分析查询、优化JOIN操作和子查询,以及改进WHERE条件。PHP层面的优化涉及预处理语句、缓存查询结果、分页查询优化和异步处理。此外,还提到了高级技术如数据库分区、读写分离和分布式数据库。通过这些方法,开发者能提升查询效率,优化应用性能和用户体验。
199 1
|
网络安全
HttpURLConnection 跳过ssl验证
HttpURLConnection 跳过ssl验证
365 0