EL表达式取值原理,遇到问题的解决方法

EL表达式

 

一,简介:

    EL :Expression Language 中文意思:表达式语言,就是在页面上取后台值的方式,,,,说白了就是只读操作。。。

JSP 2.0的一个主要特性

二,语法:

    ${} 以 " ${ " 开头 以 " } " 结束 。。。中间是表达式

由于EL表达式的语法以“${”开头,所以如果在JSP页面中要显示“${”字符串,必须在前面加上“\”符号,即“\${” 也就是用表达式来输出“${”符号。

三,作用:

1、获取数据

    EL表达式主要用于替换JSP页面中的脚本表达式,方便快捷的从各种类型的web域中检索java对象、获取数据。什么是各种类型的web域啊?就是不同的作用域

2、执行运算

    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。三目:${postNum == null ? 0 : postNum}

3、获取web开发常用对象

    EL 表达式定义了一些隐式对象,利用这些隐式对象,开发可以轻松获得对web常用对象的引用,从而获得这些对象中的数据。其实和第一点差不多。获取内置的隐含对象并且获取对象的参数

4、调用Java方法

    EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

四,之前的取值方式和EL表达式

之前的方式:下图举例子。

EL表达式取值原理,遇到问题的解决方法

 

EL表达式的方式:

 

EL表达式取值原理,遇到问题的解决方法

 

EL表达式取值原理,遇到问题的解决方法

总结:el表达式更加简单,代码简洁不至于一个jsp页面那么老长。也不需要导包。使用的时候

与 setAttribute设置的key保持一致。如果是对象那么 属性名和页面上的属性名也要保持一致。

例如:user对象 uname 属性。那么页面上就一定是${user.uname}。

运行原理:

EL表达式会根据uname去user类里寻找这个uname的getter方法,此时会自动把uname首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回return的值。 (提示:不用大写也是可以的,自测过了)重点是开发的时候遇到这种问题多留意下提到的这几点。但是getset方法是必须要有的。

所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的getter方法。且return返回的值要正确。(必须使用快捷键方式创建setter和getter方法)

EL表达式取值原理,遇到问题的解决方法转存失败重新上传取消

EL表达式取值原理,遇到问题的解决方法

题外话,此处涉及到的不光是EL表达式。

如果开发过程中遇到了 控制器返回json,页面上没有拿到值。那么一定要留意控制器返回的json是不是经过 一系列的处理或者字符串处理之后,属性名或者key名 有所变化。。。页面上要与处理后的保持一致。

比如:因为一个首字母大小写发生的问题,页面获取不到值了。这种情况一般不会出现,但是遇到过这种问题。比如::::java返回的字符串和 java类的属性 大小写有所变化。

放大镜调用的也是实体类的 get set方法。

EL表达式取值原理,遇到问题的解决方法转存失败重新上传取消

EL表达式取值原理,遇到问题的解决方法

重点:::下图解释EL表达式取值原理,遇到问题的解决方法

EL表达式取值原理,遇到问题的解决方法转存失败重新上传取消

 

item="${... 空格}"   可以通过

uitem="空格${}空格 " 报错

五,EL表达式作用域取值的顺序

EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。可是并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null,EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。

也可以直接指示从哪个作用域进行取值。如下图

EL表达式取值原理,遇到问题的解决方法转存失败重新上传取消

EL表达式取值原理,遇到问题的解决方法

图中的 pageScope,requestScope,sessionScope,applicationScope都是EL的隐含对象名称

使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。

El 的语法:${隐式对象名称}  , ${隐式对象名称.属性} :获得对象的引用 并且获取参数。

一共有11个隐含对象:不需要去记,

EL表达式取值原理,遇到问题的解决方法转存失败重新上传取消

EL表达式取值原理,遇到问题的解决方法

只需要知道取值时候的顺序,以及如何从某个作用域取值就够了。

六, . 和 []

1. EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:

${sessionScope.user.sex}等于${sessionScope.user["sex"]}

都是要获取 user对象 sex属性的值。此时没有区别。

2. 如果对象的属性带有特殊字符 如 . 或者 - 就一定要使用 []

例如:${user.My-Name }。。。。这样是错误的

应当改为:${user["My-Name"] } 获取user对象 的 My-Name 属性的值。

3. 如果要单纯的获取一个变量,而这个变量的值是 对象的属性的时候。也就是说此时是动态的获取值。动态,动态,动态,动态,动态,动态,动态,动态,动态

EL表达式取值原理,遇到问题的解决方法

在页面上 ${sessionScope.user[aaa]} 。

此时,aaa是一个变量,它的值为 name 那上述的例子等于${sessionScope.user.name};

总结:一般使用[] 进行获取 含有特殊字符的 对象属性 。获取正常情况下的属性一般使用 点 .

动态取值也不会用到它,使用jstl进行判断之后动态取值。或者直接在java代码写好逻辑。

. 方便 [] 强大。

七,EL逻辑运算,,,和JSTL标签库一起使用。

 

EL表达式取值原理,遇到问题的解决方法

EL表达式取值原理,遇到问题的解决方法

 

三目:

${postNum == null ? 0 : postNum}

 

判空的运算:

<h3>非空判断</h3>

${empty user} <!-- if(user==null){} -->

${not empty user} <!-- if(user!=null){} -->

 

 

现在的服务器不会出现不支持的情况了。以前会出现el表达式在低版本的web服务器环境下不能使用问题。

如何解决el表达式不能使用的问题:

1. 升级Web服务器,比如tomcat5升级到7。xsd的版本

2. 修改isELIgnored 为false

在page 页面的指令中的 isELIgnored属性用来指定是否忽略。格式为: <%@ page isELIgnored="true|false"%> 如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式${2000 % 20}, 在isELIgnored="true"时输出为${2000 % 20},而isELIgnored="false"时输出为100。Web容器默认isELIgnored="false"。

3. xsd的版本 在web.xml配置文件上,web.xml声明部分一般分为如下版本的xsd, 

web-app_2_2.xsd 

web-app_2_3.xsd 

web-app_2_4.xsd 

web-app_2_5.xsd 

在xsd  2.4版本之前的版本,isELIgnored默认为true,所以只能在JSP页面设置这个属性为false才可以。2.4版本中isELIgnored属性默认为false,因此EL表达式可以直接使用。 

EL表达式取值原理,遇到问题的解决方法

现在的版本已经很高了

附图:Tomcat7.0.90的web版本都到了3.0 了

EL表达式取值原理,遇到问题的解决方法

附图:Tomcat8.5.42的web版本都到了3.1 了

EL表达式取值原理,遇到问题的解决方法