携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第九天,点击查看活动详情 >>
EL表达式
01 关于EL表达式
- Expression Language(表达式语言)
- EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。
- JSP中夹杂着各种java代码,例如<% java代码 %>、<%=%>等,导致JSP文件很混乱,不好看,不好维护。所以才有了后期的EL表达式。
- EL表达式可以算是JSP语法的一部分。EL表达式归属于JSP。
02 EL表达式在JSP中的作用:
从某个作用域中取数据,然后将其转换成字符串,然后将其输出到浏览器。这就是EL表达式的功效。
-
第一功效:从某个域中取数据。
四个域:
- pageContext
- request
- session
- application
-
第二功效:将取出的数据转成字符串。
如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。
-
第三功效:将字符串输出到浏览器。
和这个一样:<%= %>,将其输出到浏览器。
03 EL表达式的使用
3.1 EL表达式基本的语法格式及简单使用
语法格式:${表达式}
将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。数据是必须存储到四大范围之一的。
<%
// 创建User对象
User user = new User();
user.setUsername("jackson");
user.setPassword("1234");
user.setAge(50);
request.setAttribute("userObj", user)
%>
使用EL表达式取
${这个位置写什么????这里写的一定是存储到域对象当中时的name}
要这样写:${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>
你不要这样写:${"userObj"}
3.2 {"abc"}的区别是什么?
{"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。
3.3 ${userObj} 底层是怎么做的?
从域中取数据,取出user对象,然后调用user对象的toString方法,(没有get方法无法拿到,可以不使用驼峰原则)转换成字符串,输出到浏览器。
3.4 如何输出对象的属性值?
{userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。 {userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。 EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。 注意:如果没有对应的get方法,则出现异常。报500错误。
${userObj.addr222.zipcode} 以上EL表达式对应的java代码:user.getAddr222().getZipcode()
3.5 EL表达式优先从小范围中读取数据。
pageContext < request < session < application
3.6 EL表达式中有四个隐含的隐式的范围:
- pageScope 对应的是 pageContext范围。
- requestScope 对应的是 request范围。
- sessionScope 对应的是 session范围。
- applicationScope 对应的是 application范围。
3.7 EL表达式取数据的时候有两种形式:
- 第一种:. (大部分使用这种方式)
- 第二种:[ ] (如果存储到域的时候,这个name中含有特殊字符,可以使用 [ ])
- request.setAttribute("abc.def", "zhangsan");
- ${requestScope.abc.def} 这样是无法取值的。
- 应该这样:${requestScope["abc.def"]}
EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。
3.8 EL表达式怎么从集合和数组中取数据?
从Map集合中取数据:${map.key}
从数组和List集合中取数据:
- ${数组[0]}
- ${数组[1]}
- ${list[0]}
3.9 page指令中忽略EL表达式的属性
<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
isELIgnored="true" 表示忽略EL表达式
isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
isELIgnored="true" 这个是全局的控制忽略EL表达式。
${username} 使用反斜杠进行局部控制忽略EL表达式。
3.10 EL表达式中其他的隐式对象:
由于EL中没有内含request对象,所以通过pageContext.request获取
pageContext
-
<%=request.contextPath()%> -
${pageContext.request.contextPath} //获取应用的根
param
-
<%=request.getParameter("xxx")%> -
${param.xxx}
paramValues
-
<%=request.getParameters("xxx")%> -
${paramValues.xxx[0]} ${paramValues.xxx[1]}
initParam
-
<%=application.getInitParameter("xxx")%> //application是jsp的九大内置对象,对应ServiceContext -
${initParam.xxx}
3.11 EL表达式的运算符
算术运算符 +、-、*、/、%
+号不会做字符串拼接,永远做的是加法运算,{10+"abc"}(转不成数字报500错误)
关系运算符 == eq != > >= < <=
==、eq、!= 都会调用equals方法,字符串比较与字符串常量池无关,只是重写了equals方法 {"abc"}=${"abc"}
逻辑运算符 ! && || not and or
有运算级,!记得加括号
条件运算符 ? :
取值运算符 [ ] 和 .
empty运算符
- empty运算符的结果是boolean类型
- ${empty param.username}
- ${not empty param.username}
- ${!empty param.password}