1. EL的作用:
1) 即Expression Language的缩写,即表达式语言的意思;
2) 最主要用来简化一些简单的属性、请求参数、标头、Cookie等信息的获取,在设置JavaBean方面比JSP标准标签更加简洁;
3) 可以进一步减少页面中Scriptlet的分量;
4) 语法上是使用${ }包裹的表达式;
5) 所有EL表达式在JSP中的返回值都是纯字符串;
2. 获取请求参数并进行运算:
1) 要使用EL的隐式对象param来获取,然后用.运算符来存取指定的属性,比如${param.name},就是获取请求参数中名为"name"的参数的值;
2) 可以做加法运算,例如:${param.a + param.b},这里就用到了EL的算术运算符+,得到的结果是"3"这个字符串;
!!其实param.a等表达式在EL表达式中返回的也是字符串值,在这里如果param.a是"1",param.b是"2",那么上述的EL表达式实际上是${"1" + "2"},那这样就不是两个字符串相加了吗?结果应该是"12"啊?!
!!EL的算数运算符有一个特性,就是如果运算符的两个操作数刚好都是纯数字,例如"1"、"2.3"、"1.3e-4"等(所有C语言支持的常数写法JSP的EL都支持),就是做算数运算而不是字符串连接,然后将运算结果转化为字符串返回!!
3) 字面值与字符串:
i. 在JSP中字面值和字符串是有区别的,字符串必须是以" "括起来的;
ii. 字面值特指数字等,例如1就是一个字面值(没有" "),而"1"就是一个字符串;
iii. EL运算符在进行计算时会先判断左右两边是不是字符串(即"xxx"),如果是字符串则再判断可不可以转换成纯数字字面值,如果可以则转换成字面值(例如将"1.23"转换成1.23),最后再进行运算,最后将结果再转换为字符串返回给JSP页面;
iv. 计算过程举例:${param.a + param.b} -> ${"1.2" + "3.4"} -> ${1.2 + 3.4} -> ${4.6} -> "4.6";
3) 其次EL可以优雅地处理null空值的情况:
i. 在上述例子中,如果param.a没有出现在请求参数中,而param.b给出了值,那么param.a就自动变成null值,做运算时会直接忽略param.a(计算时直接当成0来处理);
ii. 其实在内部运算时,EL就是直接把null当做0来处理的,因此像${4 / null}或者${5 / 0}得到的结果就是Infinity(也是JSP的一种常数字面值),而${null + null}的结果就是0;
iii. 在EL中允许直接使用null,null其实和Infinity一样,也是一种常数字面值,例如${3 + null}等,在运算表达是中所有的null都会被当成0来处理;
!!! 可以看到在EL中即使操作数为空值也不会抛出异常,这通常在Java中很难办到:
a. 因为${param.a + param.b}如果要用Scriptlet来实现则需要这样编写:
<%
String a = request.getParameter("a");
String b = request.getParameter("b");
out.write(Integer.parseInt(a) + Integer.parseInt(b));
%>
b. 在这里如果a和b中有null值则parseInt方法会直接抛出空指针异常!!!
4) EL算术运算符的要求:
i. 上述EL的算术运算符像+、-、*、/等只能用作数学运算;
ii. 不能想当然地认为+可以用作字符串连接!!像${"sle" + "12x"}等,会直接抛出异常!!!
iii. EL算数表达式只能避免null值异常,但不能避免这种无法转换成数字字面值的异常!!!
3. .运算符的更多作用:
1) 不仅可以提取某个对象的属性,也可以调用对象的getter:
i. 例如获取EL隐式对象pageContext的request,则可以这样写:${pageContext.request};
ii. 其实pageContext并没有request这一属性,但是pageContext有getRequest这一getter,因此该EL表达式会被转译成pageContext.getRequest();
2) .运算符存取属性的规则:以target.xxx为例
i. 先在target中寻找有没有名为"xxx"的属性,如果有则直接返回;
ii. 如果没有,则寻找是否有名为getXxx的getter,如果有则变成调用getXxx方法;
3) .运算符可以连续存取对象并自动完成类型转换:
i. 例如用Java代码来编写获取当前请求方法的语句就是:<%= ((HttpServletRequest)pageContext.getRequest()).getMethod() %>
ii. 但是用EL表达式可以简化成这样:${pageContext.request.method},不仅可以连续调用getter,更能完成自动的类型转换!!!
4. 关闭EL:
1) 有时候在页面中使用了某种模板ÿ