1 走进EL表达式
何为EL表达式?
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。
下面来浅浅感受一下EL表达式的简洁:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% request.setAttribute("key", "值"); %> 表达式脚本输出key的值: <%=request.getAttribute("key")%><br/> EL表达式输出key的值: ${key} </body> </html>
需要注意的是,使用表达式脚本的时候,若原key无值,则会显示null;而当使用EL表达式的时候,若原key无值,则不显示。
回顾一下上节关于jsp域对象的知识
域对象是可以像Map一样存取数据的对象,四个域对象的功能一样,区别是对数据的存取范围。
下表列举了四个域对象和作用范围
对象 | 作用范围 |
pageContext(PageContextImpl类) | 当前jsp页面范围 |
request(HttpServletRequest类) | 一次请求内 |
session(HttpSession类) | 一个会话范围内(打开浏览器访问服务器,直到关闭浏览器) |
application(ServletContext类) | 整个web工程范围内有效(只要web工程不停止,数据都在) |
在EL表达式中也一样,当四个域中都有相同的key数据时,EL表达式会根据这四个域的从小到大顺序去搜索,找到就输出, 优先级从小到大顺序:
- pageContext
- request
- session
- application
2 关于EL表达式与Bean对象
2.1 什么是Java Bean?
JavaBean(是java类)是一种JAVA语言写成的可重用组件(Component)。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
一个JavaBean由3部分组成:
1属性(properties)
JavaBean提供了高层次的属性概念,属性在JavaBean中不只是传统的面向对象的概念里的属性,它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如,可能bean有一个名字属性,这个属性的值可能需要调用String getName()方法读取,而写入属性值可能要需要调用void setName(String str)的方法。
每个JavaBean属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性,然后查询或修改属性值,对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean,如果改变时钟的时区属性,则时钟会立即重画,显示当前指定时区的时间。
2方法(method)
JavaBean中的方法就是通常的Java方法,它可以从其他组件或在脚本环境中调用。默认情况下,所有bean的公有方法都可以被外部调用,但bean一般只会引出其公有方法的一个子集。
由于JavaBean本身是Java对象,调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑,不让外部世界访问其任何字段(没有public字段)。这样,方法调用是接触Bean的唯一途径。
但是和普通类不同的是,对有些Bean来说,采用调用实例方法的低级机制并不是操作和使用Bean的主要途径。公开Bean方法在Bean操作中降为辅助地位,因为两个高级Bean特性–属性和事件是与Bean交互作用的更好方式。
因此Bean可以提供要让客户使用的public方法,但应当认识到,Bean设计人员希望看到绝大部分Bean的功能反映在属性和事件中,而不是在人工调用和各个方法中。
3事件(event)
Bean与其他软件组件交流信息的主要方式是发送和接受事件。我们可以将bean的事件支持功能看作是集成电路中的输入输出引脚:工程师将引脚连接在一起组成系统,让组件进行通讯。有些引脚用于输入,有些引脚用于输出,相当于事件模型中的发送事件和接收事件。
事件为JavaBean组件提供了一种发送通知给其他组件的方法。在AWT事件模型中,一个事件源可以注册事件监听器对象。当事件源检测到发生了某种事件时,它将调用事件监听器对象中的一个适当的事件处理方法来处理这个事件。
由此可见,JavaBean确实也是普通的Java对象,只不过它遵循了一些特别的约定而已。
2.2 使用EL表达式输出复杂Bean对象
首先,我们先创建一个学生类,包括相应的set、get方法:
Student.java
在EL表达式中也一样,当四个域中都有相同的key数据时,EL表达式会根据这四个域的从小到大顺序去搜索,找到就输出, 优先级从小到大顺序: pageContext request session application 2 关于EL表达式与Bean对象 2.1 什么是Java Bean? JavaBean(是java类)是一种JAVA语言写成的可重用组件(Component)。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。 一个JavaBean由3部分组成: 属性(properties) JavaBean提供了高层次的属性概念,属性在JavaBean中不只是传统的面向对象的概念里的属性,它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如,可能bean有一个名字属性,这个属性的值可能需要调用String getName()方法读取,而写入属性值可能要需要调用void setName(String str)的方法。 每个JavaBean属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性,然后查询或修改属性值,对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean,如果改变时钟的时区属性,则时钟会立即重画,显示当前指定时区的时间。 方法(method) JavaBean中的方法就是通常的Java方法,它可以从其他组件或在脚本环境中调用。默认情况下,所有bean的公有方法都可以被外部调用,但bean一般只会引出其公有方法的一个子集。 由于JavaBean本身是Java对象,调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑,不让外部世界访问其任何字段(没有public字段)。这样,方法调用是接触Bean的唯一途径。 但是和普通类不同的是,对有些Bean来说,采用调用实例方法的低级机制并不是操作和使用Bean的主要途径。公开Bean方法在Bean操作中降为辅助地位,因为两个高级Bean特性–属性和事件是与Bean交互作用的更好方式。 因此Bean可以提供要让客户使用的public方法,但应当认识到,Bean设计人员希望看到绝大部分Bean的功能反映在属性和事件中,而不是在人工调用和各个方法中。 事件(event) Bean与其他软件组件交流信息的主要方式是发送和接受事件。我们可以将bean的事件支持功能看作是集成电路中的输入输出引脚:工程师将引脚连接在一起组成系统,让组件进行通讯。有些引脚用于输入,有些引脚用于输出,相当于事件模型中的发送事件和接收事件。 事件为JavaBean组件提供了一种发送通知给其他组件的方法。在AWT事件模型中,一个事件源可以注册事件监听器对象。当事件源检测到发生了某种事件时,它将调用事件监听器对象中的一个适当的事件处理方法来处理这个事件。 由此可见,JavaBean确实也是普通的Java对象,只不过它遵循了一些特别的约定而已。 2.2 使用EL表达式输出复杂Bean对象 首先,我们先创建一个学生类,包括相应的set、get方法: Student.java ———————————————— 版权声明:本文为CSDN博主「兴趣使然黄小黄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_60353039/article/details/127487256
jsp代码及EL表达式如下:
<%@ page import="com.hxh.expressionlanguage.Student" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Map" %><%-- Created by IntelliJ IDEA. User: 26510 Date: 2022/10/24 Time: 10:31 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% Student student = new Student(); student.setName("黄小黄"); student.setPhones(new String[]{"15325367485", "18811026589"}); List<String> cites = new ArrayList<>(); cites.add("北京"); cites.add("上海"); cites.add("天津"); cites.add("西安"); student.setCites(cites); Map<String, Object> map = new HashMap<>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); student.setMap(map); //存放到域对象中 pageContext.setAttribute("s", student); %> <%-- EL表达式获取值,并输出 --%> 输出student: ${s}<br> 输出student的name: ${s.name}<br> 输出student的phones数组的值: ${s.phones[0]}<br> 输出student的cites集合中的元素: ${s.cites}<br> 输出student的map集合: ${s.map}<br> 输出Map集合中某个key值: ${s.map.key1}<br> </body> </html>
结果如下:
注意事项:
EL表达式输出对象值,不是直接查找对应的属性,而是通过对应属性的get方法获取值, 也就是说,如果只声明了属性,而没有在对应类中提供相应的get方法,则无法通过EL表达式获取该属性值!
3 EL表达式的运算
3.1 关系运算
语法格式如下:
${运算表达式}
3.2 逻辑运算
3.3 算术运算
3.4 empty运算
empty运算可以判断一个数据是否为空,若为空,输出true,不为空,输出false。 以下几种情况为空(在原本的key之前加empty关键字):
- 值为null、空串
- 值为Object类型的数组且长度为0 (注:其他类型的长度为0的数组值为非空)
- List、Map集合元素个数为0