一、为何使用EL表达式?
在MVC体系结构中,JSP页面只是用来显示数据,但它不能直接对隐式对象中某对象的属性进行显示,需要配合Scriptlet才能显示数据。
如果在JSP页面中使用EL表达式将大大简化JSP页面中的Java代码,在配合JSP标准动作,JSTL,可达到真正的JSP无脚本。
二、概念
EL(Expression Language)表达式语言,语法:${表达式}。
例如:${"Hello"}则在JSP页面输出Hello,相当于JSP脚本中的<%="Hello"%>,在EL表达式中的“'”和“"”功能是一样的,表示一个字符串。
在JSP页面中我们可以禁用EL表达式,需要配置page指令的isELIgnored属性,属性值若为true则支持EL表达式,若为false则禁用表达式,默认情况下是支持EL表达式的。
三、从隐式对象中获得数据
我们知道内置对象:application、session、request、page
在el中,内置对象被封装为:applicationScope、sessionScope、requestScope、pageScope
. 是我们最常用的,作用相当于执行Bean中的get方法。
问题来了: SP和EL中 pageContext.request 和 requestScope 的区别?
回答: pageContext.request是一个具体的对象,在你的http请求过程中存在。
requestScope是一个Map,这个Map中存放了在request作用域中的属性键值对,就这么简单而已,它不是request对象,而是request对象属性的封装,pageContext.request才是真正的request对象。
EL中你可以在这个周期中放置、获取对象。(当然,其实真正的操作也是针对request对象的)。
比如${requestScope.a},其实就是要表明我告诉jsp要到requestScope这个声明周期中获取对象a。而背后的实现就是从request.getAttribute("a"),然后根据表达式得到相应的a对象。
使用:
pageScope
例如:${pageScope.user.userName}相当于<%=page.getAttribute("user").getUserName%>
requestScope
例如:${requestScope.books} 相当于<%=request.getAttribute("books")%>
sessionScope
例如:${sessionScope.lastURL}相当于<%=session.getAttribute("lastURL")%>
${sessionScope.user.userName}意思是:在会话中得到名称为user的Bean对象,通过“.”运算符执行getUserName();方法,返回存放在Bean中的用户名属性的值。
applicationScope
例如:${applicationScope.provice}相当于<%=application.getAttribute("provice")%>
或者访问JSP页面中的内置对象:
pageContext
例如:${pageContext.request}在EL表达式中我们是不能直接使用JSP页面的内置对象,但可以是用pageContext间接得到这些内置对象,再来使用。
四、从请求头获得数据
header
例如:${header.referer}得到请求过来的URL
五、EL运算
1.算术运算符
注意:在EL表达式中的‘+’只有数学运算的功能,没有连接符的功能,它会试着把运算符两边的操作数转换为数值类型,进而进行数学加法运算,最后把结果输出。若出现${'a'+'b'}则会出现异常。 例如:${6+6}
- 例如:${4-3}
* 例如:${4*3}
/ 例如:${9/3}
2.关系运算符
>例如:${8>9}
>=例如:${45>=9}
<例如:${4<9}
<=例如:${9<=8}
== 例如:${4==4}
!= 例如:${4!=3}
3.逻辑运算符
&&例如:${false && false}
|| 例如:${true || false}
! 例如:${!true}相当于${false}
4.三元运算符
? : 例如:${3>2?'是':'不是'}
5:在EL表达式中还有一些特殊运算符:
empty
判断EL表达式中的表达式是否为空,例如:${empty sessionScope.user}