今天课间跟同学们聊天的时候聊起最近几天上课的内容,同学们都感觉这几天压力很大,因为这几天上课讲解的东西都是一些基础的但是非常重点的东西,跟以后的课程的学习联系十分密切,这几天讲的东西学不好的话,等到后面学习三大框架会很吃力,有一个哥们用了一个比喻很贴切,他说现在每天都像是在打魔兽世界的副本“阿尔萨斯”,天天都在打一场攻坚战!今天上课主要讲解了EL表达式跟JSP自定义标签,留了作业要我们自己定义标签遍历set集合跟map集合,JSP自定义标签还有一部分没有讲完,所以今天就先把EL表达式的部分总结一下,等明天全部讲完了再总结JSP自定义标签。
EL表达式(Exception Language)
它原本是JSTL 1.0为方便存取数据所自定义的语言。当时EL只能在JSTL 标签中使用到了JSP 2.0之后,EL 已经正式纳入成为标准规范之一。因此,只要是支持Servlet 2.4 / JSP2.0 的Container,就都可以在JSP 网页中直接使用EL 了
格式:以${开始,以}结尾.
使用EL访问作用域属性
依次从page request session application查找
JSP中使用getAttribute()访问作用域中属性时如果无对应属性返回null
使用EL表达式访问作用域中时如果无对应属性 返回“”字符串
如果对象有同名属性,获得靠前的对象的属性值
属性范围在EL中的名称
JSP名称 EL中的名称
page pageScope 同页面作用域属性名称和值有关的 Map 类
request requestScope 同请求作用域属性的名称和值有关的 Map 类
session sessionScope 同会话作用域属性的名称和值有关的 Map 类
application applicationScope 同应用程序作用域属性的名称和值有关的 Map 类
EL中的隐含对象
EL中有11个隐含对象,常用的有6个,其中与范围有关的隐含对象applicationScope、sessionScope、requestScope、pageScope基本上就和JSP的pageContext、request、session和application一样,还有两个与输入有关的隐含对象:param和paramValues,一般在我们取得用户的请求参数时使用request.getParameter(String name),request.getParameterValues(String name),在 EL中则可以使用param和paramValues两者来取得数据,${param.name}、${paramValues.name}。
使用el表达式的内置对象pageContext时
如果调用的方法是以get开始,并且没有参数,getXxxx()在此时可以写成pageContext.xxxx,此${pageContext.xxxx}等价于pageContext.getXxxx(),并且支持连写.
如果调用的方法是isXxxx并且方法没有参数,也可使用
获取当前web应用的上下文EL:${pageContext.request.contextPath}
获取当前查询字符串EL:${pageContext.request.queryString}
获取请求的URIEL:${pageContext.request.requestURI}
获取请求方法EL:${pageContext.request.method}
获取sessionIDEL:${pageContext.session.id}
获取是否是新创建的sessionEL:${pageContext.session.new}
获取主机端的服务信息EL${pageContext.servletContext.serverInfo}
获取服务的web application 的名称EL${pageContext.request.contextPath}
EL 中.和[]的区别:
在EL 提供 . 和 [ ] 两种运算符来存取数据,两者可以混合使用。
(1) 当要存取的属性名称中包含一些特殊字符,如 . 或 – 等并非字母或数字的符号,就一定要使用 [ ],例如:${user.My-Name }是错误的,应用${user["My-Name"] }
(2) 当需要动态获取值的时候,要使用[].
EL中的运算符:
算术运算符 说 明 范 例 结 果
+ 加 ${ 17 + 5 } 22
- 减 ${ 17 - 5 } 12
* 乘 ${ 17 * 5 } 85
/ 或 div 除 ${ 17 / 5 } 或 ${ 17 div 5 } 3
% 或 mod 余数 ${ 17 % 5 } 或 ${ 17 mod 5 } 2
关系运算符 说 明 范 例 结 果
= = 或 eq 等于 ${ 5 = = 5 } 或 ${ 5 eq 5 } true
!= 或 ne 不等于 ${ 5 != 5 } 或 ${ 5 ne 5 } false
< 或 lt 小于 ${ 3 < 5 }或 ${ 3 lt 5 } true
> 或 gt 大于 ${ 3 > 5 }或 ${ 3 gt 5 } false
<= 或 le 小于等于 ${ 3 <= 5 }或 ${ 3 le 5 } true
>= 或 ge 大于等于 ${ 3 >= 5 }或 ${ 3 ge 5 } false
逻辑运算符 说 明 范 例 结 果
&& 或 and 交集 ${ A && B } 或 ${ A and B } true / false
|| 或 or 并集 ${ A || B } 或 ${ A or B } true / false
! 或 not 非 ${ !A } 或 ${ not A } true / false
除了以上三大类外还有几个很重要的运算符:
Empty 运算符 主要用来判断值是否为null 或空的,当使用该运算符判断集合属性时
可以判断是否存在该属性, 可以判断该属性对应的集合是否为空集合.
如果为空,返回 true. 不为空,返回false.
条件运算符 ${ A ? B : C}
当A 为true 时,执行B;而A 为false 时,则执行C。
括号运算符 主要用来改变执行优先权,例如:${ A * (B+C) }
至于运算符的优先权,如下所示(由高至低,由左至右):
[]、.
( )
- (负)、not、!、empty
*、/、div、%、mod
+、- (减)
<、>、<=、>=、lt、gt、le、ge
= =、!=、eq、ne
&&、and
最后还要注意的一点是EL可以自动转换类型,因为从窗体传来的数据类型一律是string,自动转换类型是很必要的!