一、了解EL


1、EL是从 JavaScript 脚本语言得到启发的一种表达式语言,它借鉴了 JavaScript 多类型转换无关性的特点。在使用 EL 从 scope 中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。 Web 服务器对于 request 请求参数通常会以 String 类型来发送,在得到时使用的 Java 语言脚本就应该是 request.getParameter(“XXX”) ,这样的话,对于实际应用还必须进行强制类型转换。而 EL 就将用户从这种类型转换的繁琐工作脱离出来,允许用户直接使用 EL 表达式取得的值,而不用关心它是什么类型。

2、EL的功能:

  • 可以访问jsp中不同域的对象
  • 可以访问JavaBean中的属性
  • 可以访问集合元素
  • 可以支持简单操作符运算

二、EL变量


   

  1、EL存取变量数据的方法很简单,例如:${goodsList}。它的意思是取出某一范围中名称为username的变量。  因为我们并没有指定哪一个范围的goodsList,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到goodsList,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。假如goodsList是一个集合对象,则该集合中的对象的属性可以通过点或者[]获取其属性值。例如该集合存放的是goods对象,而goods对象中有name 和id属性。用jstl标签forEach

获取集合对象时:<c:forEach items="${goodsList}" var = "goods">, 则可以通过${goods.id},${goods.name}来获取属性值。通过该方法获取时goods类必须有get方法如果没有就会出现javax.el.PropertyNotFoundException: Property 'goodPhoto' not found on type java.lang.String错误,具体参考该博文

EL的表达式:${expression}  例如:${param.name} 它等同于 <%=request.getParameter("name") %>   

 2、EL的变量。

 ①EL的隐式变量包括pageScope,requestScope,sessionScope,applicationScope,任何再起作用与范围内的JavaBean的实例都可以当作EL来表达。

< %
request.setAttribute("age",20) ;
session.setAttribute("name","yang");
%>
//调用其变量
${requestScope.age}
${sessionScope.age}

②隐含变量param、paramValues,param是取得某一个参数,paramValues失去的某个参数的集合(即为表单中数个控件的name值相同,传过来的是一个参数数组)。例如:表单传过3个参数名同为firstName的参数分别为yang,wang,li。当参数传过来以后存储在paramValue数组中可以通过 ${paramValue.firstName[1] } 获得姓氏为wang的参数。简单演示如下

<html>
<body>
<form action="name.jsp">
<input type="text" name="firstName" value="yang">
<input type="text" name="firstName" value="wang">
<input type="text" name="firstName" value="li">
<input type="text" name="secondName" value="bo">
<input type="submit" value="Submit">
  <!--获取相应参数的方法
    ${paramValue.firstName[1] }
    ${param.secondName }
  -->
</form>
</body>
</html>

③其他变量。诸如header,headerValue,cookie,initParam,pageContext等使用与上边两种相同

    注意:除过pageContext其与变量都是映射值

三、EL ( .)与[]使用

1、(.)的使用

 (.)的左边必须是一个映射值也可以是一个bean得性质(如果第一个变量是javabean的属性)。点号右边必须符合命名规则必须以字母、_或$开头,如上边给出的代码映射键均可以通过点号获取其映射值。只有当左边是映射键或者bean属性时才可以用点号,另一种el的使用方式将更加灵活。

2、[]能让你有更多的选择,比如是一个数组,list,或map的一个值(其键对应的值可能不符合命名规则此时只能用该形式)。下面将展示几种[]的用法以及所要注意的点

①对数组使用[]

    

      <%
String name[] = {yang, wang, li, han};
request.setAttribute("name", name);
%>
第一个姓氏为:${name } <!-- 返回一个Stirng数组的toString值 -->
第一个姓氏为:${name[0] } <!-- 其值为yang -->
第一个姓氏为:${name["0"] } <!-- 同样显示值为yang -->

你可能会问为什么一个加引号一个不加引号为什么会得出相同的值?

  原因在于List和String中的索引会强制转化为int

②对于bean和数组点号和[]都可以使用

③当[]中没有引号时即不是String直接量时会进行计算,搜索与该名字绑定的属性,并替换为该属性的值。下面来一一小段代码进行演示

   <%
HashMap name = new HashMap();
name.put("zhang", "san");
name.put("li", "si");
name.put("wang", "mazi");
request.setAttribute("name", name);
request.setAttribute("li", "zhang");
%>
姓李的人为: ${name["li"] } <!-- 获得值为si -->
姓李的人为: ${name[li] } <!-- 获得的值为san -->
<!-- 第二个参数li没有引号,则搜索与该值绑定的属性的值,与其绑定的值为zhang,故zhang会替换li,所以最终获得的值为san -->

注意:el中都是表达式,可以是嵌套表达式,深度不限。可以将一个复杂表达式放在另外一个复杂表达式

四、禁用EL


  EL是在JSP2.0以后才有的新特性,因此将JSP版本设置为较低时(Servlet2.3或者更早)其将不再支持EL标签

  在单个页面禁用使用如下命令

  

<%@page isELIgnoreD = "true" %>

浅谈EL的更多相关文章

  1. 浅谈EL与JSTL

    讲道理,自己在博大精深的Java世界里还只是一个很小很小的菜鸟.处于成长与学习之中,但学习一个漫长的过程.尤其对于那些知识点我觉得总结是尤为重要的.反正在我看来这段时间里虽然过了很多知识但却是一脸懵逼 ...

  2. 浅谈Vue.js

    作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...

  3. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  4. 浅谈padding

    浅谈padding padding是CSS盒子模型的一部分,代表盒子模型的内边距. 用法 padding属性有四个值,分别代表上.右.下.左的内边距. .box { padding: 10px 5px ...

  5. 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM

    前端性能优化--为什么DOM操作慢?   作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...

  6. 浅谈Vue下的components模板

    浅谈Vue下的components模板在我们越来越深入Vue时,我们会发现我们对HTML代码的工程量会越来越少,今天我们来谈谈Vue下的 components模板的 初步使用方法与 应用 我们先来简单 ...

  7. 浅谈Vue中计算属性(computed)和方法(methods)的差别

    浅谈Vue中计算属性(computed)和方法(methods)的差别 源码地址 methods方法和computed计算属性,两种方式的最终结果确实是完全相同 计算属性是基于它们的响应式依赖进行缓存 ...

  8. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  9. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

随机推荐

  1. firefox浏览器相关的2个坑

    今天遇到一个bug,找回密码的功能在google浏览器正常,在firefox浏览器不正常.在排查该bug的过程中遇到2个坑.先总结一下: 1.firefox浏览器无法debug,“脚本”面板提示:本页 ...

  2. [html5] 学习笔记-Canvas标签的使用

    Canvas通过JavaScript来绘制2D图形.Canvas是逐像素渲染的.在Canvas中,一旦图形被绘制完成,它就不会继续得到浏览器的关注.如果其位置发生变化,那么整个场景也需要重新绘制,包括 ...

  3. shell编程其实真的很简单(三)

    通过前两篇文章,我们掌握了shell的一些基本写法和变量的使用,以及基本数据类型的运算.那么,本次就将要学习shell的结构化命令了,也就是我们其它编程语言中的条件选择语句及循环语句. 不过,在学习s ...

  4. <C++Primer>第四版 阅读笔记 第四部分 “面向对象编程与泛型编程”

    继承和动态绑定与数据抽象一起成为面向对象编程的基础. 模板使我们能够编写独立于具体类型的泛型类和泛型函数. 第15章 面向对象编程 面向对象编程基于三个基本概念:数据抽象.继承和动态绑定.在C++中, ...

  5. 初探Lambda表达式/Java多核编程【1】从集合到流

    从集合到流 接上一小节初探Lambda表达式/Java多核编程[0]从外部迭代到内部迭代,本小节将着手使用"流"这一概念进行"迭代"操作. 首先何为" ...

  6. sonarqube+Scanner代码质量管理工具

    本文相关描述基于sonarqube 6.2版本. 下载地址: sonarqube下载网址:https://www.sonarqube.org/downloads/ Scanner下载网址(用于扫描项目 ...

  7. 解决maven 下载 hadoop-client 客户端 报错的问题

    第一.pom.xml配置: <dependency> <groupId>org.apache.hadoop</groupId> <artifactId> ...

  8. 特殊的string类型

    1.前言 string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢? 原因就是.Net考虑到假如大量的操作string对象的时候,大量 ...

  9. Linux系统(三)系统基础扫盲大全

    序言 如果大家都爱装逼,一般会偏爱使用安装最小化的liunx系统,那么你的系统就不带图形化的桌面功能,这样对于一个想装B的初学者来说,Liunx就是黑漆马虎,一望无际的黑屏,黑屏,如何快速的对liun ...

  10. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...