关于EL表达式
EL表达式
英文全称:Expression Language(表达式语言)
作用:EL表达式可以代替JSP中的java代码,让JSP文件中的程序看起来更加整洁,美观。EL表达式可以算是JSP语法的一
部分。EL表达式归属于JSP。
EL表达式的三大功效:
第一大功效:从四个作用域中取出数据。
第二大功效:将取出的数据转成字符串。
如果是一个java对象,也会自动调用java对象的toString方法将其转换成字符串。
第三大功效:将字符串输出到浏览器。与<%= %>的作用一样。
注意:EL表达式只负责从四大作用域中取数据,不负责存数据。
EL表达式基本的语法格式:
${表达式}
EL表达式的使用:(在JSP页面中)
<%
// 创建User对象
User user = new User();
user.setUsername("jackson");
user.setPassword("1234");
user.setAge(50);
// 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个作用域中取数据。
// 数据是必须存储到四大作用域之一的。
// 下行代码是将数据存放的请求作用域中
request.setAttribute("userObj", user);
%>
<%-- 下面是使用EL表达式来取出存放在请求作用域中的数据 --%>
${userObj} 等同于java代码:<%=request.getAttribute("userObj")%>
你不要这样写:${"userObj"}
面试题:
${abc} 和 ${"abc"}的区别是什么?
回答:${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定有这样的代码: 域.setAttribute("abc", 对象);${"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。
${userObj} 底层是怎么做的?
回答:从域中取数据,取出user对象,然后调用user对象的toString方法,转换成字符串,输出到浏览器。
<%--如果想输出对象的属性值,怎么办?--%>
${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。
注意:如果没有对应的get方法,则出现异常。报500错误。
${userObj.addr.zipcode}
以上EL表达式对应的java代码:user.getAddr().getZipcode()
EL表达式优先从小作用域中读取数据。
pageContext < request < session < application
EL表达式中有四个隐含的隐式的范围:
pageScope 对应的是 pageContext范围。
requestScope 对应的是 request范围。
sessionScope 对应的是 session范围。
applicationScope 对应的是 application范围。
注意:这里说的是隐含的范围,而不是隐含的对象
EL表达式对null进行了预处理。如果是null,则向浏览器输出一个空字符串。
EL表达式取数据的时候有两种形式:
第一种:. (大部分使用这种方式)
第二种:[ ] (如果存储到域的时候,name中含有特殊字符,可以使用 [ ])
比如:
request.setAttribute("abc.def", "zhangsan");
${requestScope.abc.def} 这样是无法取值的。
应该这样:${requestScope["abc.def"]},注意此时name外面的双引号不能省略,必须保留。
使用EL表达式从Map集合中取数据:
${map.key}
使用EL表达式从数组和List集合中取数据:
${数组[0]}
${数组[1]}
${list[0]}
page指令当中,有一个属性,可以忽略EL表达式
<%@page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
isELIgnored="true" 表示忽略EL表达式 这个是全局的控制,此时整个JSP页面都不能使用EL表达式
可以使用反斜杠进行局部控制:\\${username} 这样也可以忽略EL表达式。(这种方式使用较多)
isELIgnored="false" 表示不忽略EL表达式。(这是默认值)
通过EL表达式获取应用的根:
${pageContext.request.contextPath}
EL表达式中其他的隐式对象(内置对象):
1.pageContext
举例:获取应用的根路径 EL表达式的写法${pageContext.request.contextPath}
java代码的写法:<%=request.getContextPath%>
2.param
举例:
浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css
获取用户在 浏览器端的username请求参数
EL表达式的写法:${param.username}
java代码的写法:<%=request.getParameter("username")%>
上面的方法如果获取的是一个数组,那么取得的是数组的第一个元素。如果想获取数组中的所有元素需要使用内置对象paramValues
3.paramValues
举例:
浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css
获取用户在 浏览器端的aihao请求参数
EL表达式的写法:${paramValues.aihao[0]}、${paramValues.aihao[1]}、${paramValues.aihao[2]}
Java代码的写法:<%=request.getParameterValues("aihao")%>
4.initParam
举例:
在web.xml文件中设置Servlet上下文初始化参数
<context-param>
<param-name>pageSize</param-name>
<param-value>20</param-value>
</context-param>
<context-param>
<param-name>pageNum</param-name>
<param-value>6</param-value>
</context-param>
以下代码的目的是获取上面设置的pageSize与pageNum
在JSP页面中使用Java代码:
<%
String pageSize = application.getInitParameter("pageSize");
String pageNum = application.getInitParameter("pageNum");
%>
<%=pageSize%><br/>
<%=pageNum%><br/>
还可以写成:
<%=application.getInitParameter("pageSize");%>
<%=application.getInitParameter("pageNum");%>
还可以通过EL表达式写成:
${initParam.pageSize}<br/>
${initParam.pageNum}<br/>
在EL表达式中只有内置的pageContext对象,没有JSP中的其他八大内置对象,如果想用其他八大内置对象,需要使用pageContext对象来获取。
比如:获取request对象的方法:${pageContext.request}
EL表达式的运算符:
1.算术运算符
+、-、*、/、%
EL表达式中的算术运算符与Java中的算术运算符不同,他只是做算术运算,不做字符串的拼接,当算术运算符的两端不是数字的时候会自动转换成数字,然后进行算术运算;当不能正常转换成数字的时候,就会报错500
举例:
${10 + 20} 在浏览器页面中会展示出30
${10 + "20"} 在浏览器页面中同样会展示出30
${10 + "abc"} 此时就会报错500
${"a" + "b"} 此时也会报错500
其他运算符与+类似
2.关系运算符
== eq != > >= < <=
注意:这里的==、!=、eq在比较Java对象的时候底层都调用了Java对象的equals()方法
>、>=、<、<=不能用在Java对象的比较上,只能用于数字的比较。
3.逻辑运算符
! && || not and or
注意:这里的!和 not 都是取反,作用一样。
4.条件运算符
? :
举例:
浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css
${empty param.username ? "用户名不能为空" : "欢迎访问!"} <%-- 结果是"欢迎访问"--%>
浏览器端的请求是:http://localhost:8080/jsp/1.jsp
${empty param.username ? "用户名不能为空" : "欢迎访问!"} <%-- 结果是"用户名不能为空"--%>
5.取值运算符
[ ]和.
见上面:EL表达式取数据的时候有两种形式:
6.empty运算符
作用:判定是否为空 ,empty运算符的运算结果是boolean类型true|false,true表示结果为空,false不是结果不为空
举例:
浏览器端的请求是:http://localhost:8080/jsp/1.jsp?username=张三&aihao=java&aihao=html&aihao=css
${empty param.username} <%-- 结果为false,因为param.username 的结果是张三,不为空 --%>
${not empty param.username} <%-- 结果为true,因为not的作用是取反,将原本的false取反了 --%>
${!empty param.password} <%-- 结果为false,没有!的结果是true,但是有了!不是取反,所以变成了false --%>
${param.password == null} <%-- 结果是true --%>
${empty param.password == null} <%--结果是false ,因为==的左边是boolean类型,而==的右边不是boolean类型--%>