[JSP]EL表达式语言

本文详细介绍了JSP中的EL(Expression Language)表达式语言,包括其作用、获取请求参数、运算规则、处理null值、.运算符的使用、关闭EL功能、属性存取、EL隐式对象和运算符等内容。EL简化了JSP中的属性和参数获取,提供了优雅的空值处理方式,并支持算术、逻辑和关系运算。同时,文中还探讨了如何自定义EL函数,使开发者能更便捷地调用Java静态方法。
摘要由CSDN通过智能技术生成

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) 有时候在页面中使用了某种模板ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值