JavaWeb 之 EL表达式
一、简介
1、概念
EL 表达式的全称:Expression Language 表达式语言。
EL 是 JSP 内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象,取得对象属性的值,或执行简单的运算或判断操作。
2、作用
EL表达式主要是替换和简化 jsp 页面中表达式脚本在jsp页面中进行数据的输出。
EL 表达式仅仅用来读取数据,而不能第数据进行修改。
3、特点
EL 在得到某个数据时,会自动进行数据类型的转换
EL 表达式输出数据时,如果有则输出数据,如果为 null 则什么也不输出。
4、EL 表达式与 JSP 表达式的区别
① 如果数据为 null,jsp 显示 null,EL 则什么也不显示;
② EL 显示的数据,必须存放在域对象或上下文对象中;
③ EL 可以自带数据类型转换的功能;
5、语法格式
${表达式}
6、注意事项
jsp 默认是支持 el 表达式的。
如果要忽略 el 表达式,有两种方式
(1)设置 jsp 中 page 指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
(2)\${表达式}:这种方式忽略当前这个 el 表达式,会在当前页面呈现原有格式。
7、案例
<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出 key 的值是:
<%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%><br/>
EL 表达式输出 key 的值是: ${key1}
</body>
注意:
EL 在表达式在输出 null 值的时候,输出的空串。
而 jsp 表达式脚本在输出 null 值的时候,输出的是 null 字符串。
二、EL 表达式搜索域数据的顺序
EL 表达式主要是在 jsp 页面中输出数据。主要是输出 域对象 中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
Demo:
<%
//往四个域中都保存了相同的 key 的数据。
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
${ key }
三、EL 表达式输出信息
创建一个 JavaBean,然后输出 JavaBean 类中的普通属性,数组属性,list集合和 map 集合属性。
JavaBean:
public class Person {
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map; public Person() {
} public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cities = cities;
this.map = map;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String[] getPhones() {
return phones;
} public void setPhones(String[] phones) {
this.phones = phones;
} public List<String> getCities() {
return cities;
} public void setCities(List<String> cities) {
this.cities = cities;
} public Map<String, Object> getMap() {
return map;
} public void setMap(Map<String, Object> map) {
this.map = map;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", phones=" + Arrays.toString(phones) +
", cities=" + cities +
", map=" + map +
'}';
}
}
1、输出 JavaBean 的普通属性
2、输出数组信息
3、输出 List 集合
4、输出 Map 集合
Demo:
<%
Person person = new Person(); person.setName("Hello EL");
person.setPhones(new String[]{"123","456","789"}); List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities); Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3"); person.setMap(map);pageContext.setAttribute("p", person);
%> 输出 Person: ${ p }<br/>
输出 Person 的 name 属性: ${p.name} <br>
输出 Person 的 phones 数组属性值: ${p.phones[2]} <br>
输出 Person 的 cities 集合中的元素值: ${p.cities} <br>
输出 Person 的 List 集合中个别元素值: ${p.cities[2]} <br>
输出 Person 的 Map 集合: ${p.map} <br>
输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br>
<%--输出 Person 的 age 属性: ${p.age} <br> --%>
%>
注意:
① 如果在 JavaBean 中只声明一个 age 变量,如果没有写 getAge() 方法,那么是无法通过 EL 表达式来读取该属性的;
② 如果在 JavaBean 中只是声明了一个 getAge() 方法,没有声明 age 这个变量,那么 EL 表达式也是可以读取;
③ EL 是通过JavaBean 对应的 getter() 方法来读取属性的,而不是直接通过属性的名字来读取(切记)
④ 这里的属性名是指 JavaBean 里面的 setter 和 getter 方法去掉 set或get,然后首字母变小写就是属性了。
⑤ 如果发生了下标越界,并不会报错,而是显示为空字符串。
四、EL表达式——运算
1、算数运算符
+、-、*、/(div)、%(mod)
注意:其中的除号可以用 div 来代替,取余可以用 mod 来代替。
算数运算符 | 说明 | 范例 | 结果 |
+ | 加法 | ${ 12 + 18 } | 30 |
- | 减法 | ${ 15 - 5 } | 10 |
* | 乘法 | ${ 2 * 10 } | 20 |
/ 或 div | 除法 | $( 24 / 2 ) 或 ${ 24 div 2 } | 12 |
% 或 mod | 取模 | ${ 14 % 4 } 或 ${ 14 mod 10} | 4 |
2、关系运算符
> < >= <= == !=
关系运算符:
关系运算符 | 说 明 | 范 例 | 结果 |
== 或 eq | 等于 | ${ 5 == 5 } 或 ${ 5 eq 5 } | true |
!= 或 ne | 不等于 | ${ 5 !=5 } 或 ${ 5 ne 5 } | false |
< 或 lt | 小于 | ${ 3 < 5 } 或 ${ 3 lt 5 } | true |
> 或 gt | 大于 | ${ 2 > 10 } 或 ${ 2 gt 10 } | false |
<= 或 le | 小于等于 | ${ 5 <= 12 } 或 ${ 5 le 12 } | true |
>= 或 ge | 大于等于 | ${ 3 >= 5 } 或 ${ 3 ge 5 } | false |
3、逻辑运算符
&&(and) ||(or) !(not)
逻辑运算符:
逻辑运算符 | 说 明 | 范 例 | 结果 |
&& 或 and | 与运算 | ${ 12 == 12 && 12 < 11 } 或 ${ 12 == 12 and 12 < 11 } | false |
|| 或 or | 或运算 | ${ 12 == 12 || 12 < 11 } 或 ${ 12 == 12 or 12 < 11 } | true |
! 或 not | 取反运算 | ${ !true } 或 ${not true } | false |
4、empty 空运算符
空运算符:empty
功能:用于判断一个数据是否为空,如果为空,则输出 true;不为空输出 false。
一下几种情况为空:
① 值为 null 值的时候,为空;
② 值为 空串 的时候,为空;
③ 值是 Object 类型的数据,长度为零的时候;
④ list 集合,元素个数为 零;
⑤ map 集合,元素个数为 零;
Demo:
${empty list}:判断字符串、集合、数组对象是否为null或者长度为0,为空或为0返回 true,不然返回 false
${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0;不为空或长度不为0返回 true,不然返回 false <body>
<%
// 1、 值为 null 值的时候, 为空
request.setAttribute("emptyNull", null); // 2、 值为空串的时候, 为空
request.setAttribute("emptyStr", ""); // 3、 值是 Object 类型数组, 长度为零的时候
request.setAttribute("emptyArr", new Object[]{}); // 4、 list 集合, 元素个数为零
List<String> list = new ArrayList<>();
// list.add("abc");
request.setAttribute("emptyList", list); // 5、 map 集合, 元素个数为零
Map<String,Object> map = new HashMap<String, Object>();
// map.put("key1", "value1");
request.setAttribute("emptyMap", map);
%>
${ empty emptyNull } <br/>
${ empty emptyStr } <br/>
${ empty emptyArr } <br/>
${ empty emptyList } <br/>
${ empty emptyMap } <br/>
</body>
5、三元运算符
格式:
表达式 1? 表达式 2: 表达式 3
说明:如果表达式 1 的值为真, 返回表达式 2 的值, 如果表达式 1 的值为假, 返回表达式 3 的值
Demo:
${ 12 != 12 ? "正确":"错误" }
6、"." 点运算 和 [] 中括号运算符
说明:
. 点运算,可以输出 JavaBean 对象中某个属性的值(其实是调用的 getter() 方法)
[ ] 中括号运算,可以输出有序集合中某个元素的值,并且中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值,key需要用引号(单引号或双引号)引起来
Demo:
<body>
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("a.a.a", "aaaValue");
map.put("b+b+b", "bbbValue");
map.put("c-c-c", "cccValue");
request.setAttribute("map", map);
%>
${ map['a.a.a'] } <br>
${ map["b+b+b"] } <br>
${ map['c-c-c'] } <br>
</body>
五、EL 表达式的 11 个隐含对象
EL 表达式中有 11 个隐含对象,是 EL 表达式自已定义的,可以直接拿来使用。
变量 | 类型 | 作用 |
pageContext | PageContextImpl | 它可以获取 jsp 中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取 pageContext 域中的数据 |
requestScope | Map<String,Object> | 它可以获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 它可以获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 它可以获取 ServletContext 域中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它也可以获取请求参数的值, 获取多个值的时候使用。 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息, 它可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的 Cookie 信息 |
initParam | Map<String,String> | 它可以获取在 web.xml 中配置的<context-param>上下文参数 |
六、使用隐含对象
1、pageContext 对象的使用
使用 pageContext 对象可以获取:
1. 协议:
2. 服务器 ip:
3. 服务器端口:
4. 获取工程路径:
5. 获取请求方法:
6. 获取客户端 ip 地址:
7. 获取会话的 id 编号:
8. 获取 jsp 其他的八个内置对象
Demo:
<body>
<%--
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<%
pageContext.setAttribute("req", request);
%>
<%=request.getScheme() %> <br>
1.协议: ${ req.scheme }<br>
2.服务器 ip: ${ pageContext.request.serverName }<br>
3.服务器端口: ${ pageContext.request.serverPort }<br>
4.获取工程路径: ${ pageContext.request.contextPath }<br>
5.获取请求方法: ${ pageContext.request.method }<br>
6.获取客户端 ip 地址: ${ pageContext.request.remoteHost }<br>
7.获取会话的 id 编号: ${ pageContext.session.id }<br>
</body>
2、EL 获取四个特定域中的属性
EL 表达式只能从域对象中获取值,依次从最小的域中查找是否有该键对应的值,直到找到为止
使用 域名称可以选择性地获取域对象中的数据
注意:如果在域中没有对应的键值对,会返回空字符串""
域名称 | 作用域 |
pageScope | pageContext域 |
requestScope | request域 |
sessionScope | session域 |
applicationScope | application(ServletContext)域 |
Demo:
<body>
<%
pageContext.setAttribute("key1", "pageContext1");
pageContext.setAttribute("key2", "pageContext2");
request.setAttribute("key2", "request");
session.setAttribute("key2", "session");
application.setAttribute("key2", "application");
%>
${ applicationScope.key2 }
</body>
3、获取参数的信息
说明:
param Map<String,String> 它可以获取请求参数的值
paramValues Map<String,String[]> 它也可以获取请求参数的值, 获取多个值的时候使用。
Demo:
请求地址:
http://localhost:8080/09_EL_JSTL/other_el.jsp?username=zs&password=666&hobby=java&hobby=cpp 输出请求参数 username 的值: ${ param.username } <br>
输出请求参数 password 的值: ${ param.password } <br>
输出请求参数 username 的值: ${ paramValues.username[0] } <br>
输出请求参数 hobby 的值: ${ paramValues.hobby[0] } <br>
输出请求参数 hobby 的值: ${ paramValues.hobby[1] } <br>
4、获取请求头的信息
说明:
header Map<String,String> 它可以获取请求头的信息
headerValues Map<String,String[]> 它可以获取请求头的信息, 它可以获取多个值的情况
Demo:
输出请求头【User-Agent】 的值: ${ header['User-Agent'] } <br>
输出请求头【Connection】 的值: ${ header.Connection } <br>
输出请求头【User-Agent】 的值: ${ headerValues['User-Agent'][0] } <br>
5、获取 cookie 信息
说明:
cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
Demo:
获取 Cookie 的名称: ${ cookie.JSESSIONID.name } <br>
获取 Cookie 的值: ${ cookie.JSESSIONID.value } <br>
6、获取配置参数信息
说明:
initParam Map<String,String> 它可以获取在 web.xml 中配置的<context-param>上下文参数
Demo:
web.xml 中的配置
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///test</param-value>
</context-param> 示例代码:
输出<Context-param>username 的值: ${ initParam.username } <br>
输出<Context-param>url 的值: ${ initParam.url } <br>
JavaWeb 之 EL表达式的更多相关文章
- JavaWeb基础—EL表达式与JSTL标签库
EL表达式: EL 全名为Expression Language.EL主要作用 获取数据(访问对象,访问数据,遍历集合等) 执行运算 获取JavaWeb常用对象 调用Java方法(EL函数库) 给出一 ...
- 【JavaWeb】EL表达式&过滤器&监听器
EL表达式和JSTL EL表达式 EL表达式概述 基本概念 EL表达式,全称是Expression Language.意为表达式语言.它是Servlet规范中的一部分,是JSP2.0规范加入的内容.其 ...
- javaWEB与EL表达式
EL表达式1. EL是JSP内置的表达式语言! * jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本! * EL替代的是<%= ... %>,也 ...
- Javaweb之EL表达式
1.EL表达式简介 EL全名为Expression Language.EL的主要作用为: 获取数据:EL表达式主要用于替换jsp页面中的脚本表达式,以从各种类型的web域中检索java对象,获取数据. ...
- IT兄弟连 JavaWeb教程 EL表达式中的运算
EL语言支持算符运算符.关系运算符和逻辑运算符等,以完成常见的数据处理操作.所有的运算符说明见表7.2. 表2 El表达式中的运算符
- IT兄弟连 JavaWeb教程 EL表达式中的内置对象
EL语言定义了11个隐含对象,它们都是java.util.Map类型,网页制作者可通过它们来便捷地访问Web应用中的特定数据.表1对这11个隐含对象做了说明. 1 EL表达式中的内置对象 这11个隐 ...
- IT兄弟连 JavaWeb教程 EL表达式获取对象的属性以及数组的元素
使用${对象名.属性名} EL表达式语言可以使用点号运算符"."来访问对象的属性,例如表达式${customer.name}表示customer对象的name属性. 使用${对象名 ...
- 【JavaWeb】EL表达式
EL表达式 EL表达式语言,用于简化JSP的输出: EL表达式的基本语法:${表达式}: 示例:<h1>学生姓名:${student.name}</h1> 作用域对象 忽略书写 ...
- 【JavaWeb+Echarts+EL表达式】用图表形式展示数据
1. Echarts环境配置 https://www.echartsjs.com/zh/download.html 选择需要的,然后等待Build完成之后,就会自动弹出下载框啦! 把下载好的js放在w ...
随机推荐
- PHP系列 | PDO::prepare(): send of 68 bytes failed with errno=32 Broken pipe
设计场景 1.开启Redis的键空间过期事件(键过期发布任务),创建订单创建一个过期的key,按照订单号为key,设置过期时间. 2.通过Redis的订阅模式(持久阻塞),获取到订单号进行组装. 3. ...
- groupby 的妙用(注意size和count)
Pandas的groupby()功能很强大,用好了可以方便的解决很多问题,在数据处理以及日常工作中经常能施展拳脚. 今天,我们一起来领略下groupby()的魅力吧. 首先,引入相关package: ...
- 平时没有怎么用Excel做 加减乘除 计算,猛地发现,其实Excel 是一个很好的简单计算器
平时没有怎么用Excel做 加减乘除 计算,猛地发现,其实Excel 是一个很好的简单计算器
- django入门8之xadmin引入富文本和excel插件
django入门8之xadmin引入富文本和excel插件 Xadmin引入富文本 插件的文档 https://xadmin.readthedocs.io/en/docs-chinese/make_p ...
- 如何分析redis中的慢查询
慢查询的两个参数配置 慢查询只记录命令执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求 ...
- element-ui 上传图片 后清空 图片 显示
使用element-ui组件,用el-upload上传图片,上传图片后再次打开还是会有原来的图片,想要清空原来上传的图片,只需要在组件上绑定ref,在提交成功后的方法里调用this.$refs.upl ...
- Springboot配置连接两个数据库
背景: 项目中需要从两个不同的数据库查询数据,之前实现方法是:springboot配置连接一个数据源,另一个使用jdbc代码连接. 为了改进,现在使用SpringBoot配置连接两个数据源 实现效果: ...
- go 单元测试框架介绍
最近项目在补充单元测试,这里介绍以下几个go里流行的单元测试框架. gomock gostub monkey Convey 下面介绍下各个框架的主要用途 convey 主要用途是用来组织测试用例的 g ...
- 修复Nginx报错:upstream sent too big header while reading response header from upstream
在 nginx.conf 的http段,加入下面的配置: proxy_buffer_size 128k; proxy_buffers 32k; proxy_busy_buffers_size 128k ...
- IntelliJ IDEA重新打开后把字母隐藏怎么办
默认Font的字体melno不行,r会隐形 解决方案:更换idea字体,点击apply按钮即可正常显示 修改Font为的consoleas Size:16 line spacing:1.25