EL表达式有无双引号的区别

时间:2022-08-31 11:22:41

最近做项目时发现原来对EL表达式理解太浅,通过一个springMVC项目,加深了对其的理解,下面总结一下,如发现有不对之处,请批评指正:

  1.在单独的js文件中,EL表达式无效,如:var type="${type}",此时type获取的值就为字符串“${type}”,而并非后台type指向的值;非要单独的JS文件中获取El值的话,可在jsp中定义一个全局变量var type,且加上$(function(){ type="${type}" });此时在单独的JS文件中就可以获取type指向的值了;当然,如果把所有的JS代码写到JSP中就更可以了(猜想:EL表达式在服务器端生成值并替换JSP中的El时,不对单独的JS文件进行扫描,只对jsp中的JS代码进行了扫描,所以在JS文件中无效,而在JS代码中有效,该猜想没有证实!);

2.单独的js文件中,EL表达式无效,即使一定要用它,也必须用双引号或单引号引起来,不然就会报错;

  3.之前经常看到有人说js是客房端的,EL是服务端的,不能在js中使用EL表达式----真是扯淡,EL表达式作为服务器端的变量在返回到客户端的时候已经被显示成变量内容,所以在那都是可以使用的,只是要正确的使用它!如果使用不对,就会出错!如在jsp中的js代码部分写入 var aa=${type},alert(aa),虽然controller从后台传入type="add",但运行到浏览器时就会报错“add”未定义,仔细查看页面错误代码发现var aa=add,而add没有定义,顾报此错误;再进一步分析,EL表达式在服务端就执行完毕,在服务端运行时,后台会扫描EL表达式,并把值替代EL表达式,所以此时var aa=${type}变为var aa=add,如果后台传入type=1时;前台就变为var aa=1;alert(aa),此时没有错误;如果后台没有传type值时,var aa=${type}变为var aa=,直接报错,而如果在EL表达式中加入双引号,再后台运行,var aa="${type}"变为var aa="add",所以在Js代码中使用EL表达式不一定非要加上双引号了,如果后台传入的字符串时,则需要加上双引号,如果是数字时,则加与不加,视情况而定,加了双引号,就变为字符型,没加,则为数字型,如果后台传入集合时,请参照下述;

4.在JS代码中获取集合或数组元素时,EL表达式引用双引号,前端自动将其转换为一个JSON字符串形式,如果不加,其值为一个变量,区别非常大,例如后台传值List<String> alist,alist中有两个值1、2,前端var aa=“${alist}”,则aa是一个值为“[1,2]”,length为5的字符串的变量,aa[0]的值是“[”,而如果var aa=${alist}时,则aa为一个1、2的数组变量,其length为2,此时aa[0]为值是1;进一步,以后如果想通过el表达式获取集合元素时,一种方法:

var aa=${alist};for(int i=0;i<aa.length;i++){ var b=aa[0]};

另一种方法:

for(int i=0;i<${fn:length(alist)};i++){var b=${alist[i]}

所以此时,如果后台没有传入alist,前台将报错,而如果加上双引号,也可以获取集合值,但会额外获取一些诸如“[”,",","","]"等垃圾值;

所以在js代码中使用el表达式时不一定非要加上双引号,只能视情况而定。