在没有学会EL表达式之前,我们想在JSP文件中获取servlet或者其他JSP页面传来的值,通常都是在JSP页面中编写java代码来实现。而在jsp页面编写Java 代码,这种做法时不规范的,将会产生许多的弊端,如:

  1、代码的可维护性差,给人员的分工带来了许多麻烦;

  2、降低了代码的可读性;

  3、降低了程序的安全性;

  而在JSP中,有另一种语法,代替了java代码来获取request域中的值,它就是EL表达式。

首先我们来看一个样例:

  以下是两个javaBean,分别为Student和Address,而在Student中有一个Address类型的属性: 

 //学生类
public class Student { private String name; //姓名
private int age; //年龄
private Address address; //地址,它是另外一个javaBean类型 public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
} } //地址类
public class Address {
private String homeAddress; //家庭地址
private String schoolAddress; //学校地址 public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
public String getSchoolAddress() {
return schoolAddress;
}
public void setSchoolAddress(String schoolAddress) {
this.schoolAddress = schoolAddress;
} }

  在一个servlet中,我们使用以下代码向jsp页面发送请求:

 Student student = new Student();  //创建一个学生对象
student.setName("学生1");
student.setAge(18);
Address a = new Address(); //创建一个地址对象
a.setHomeAddress("shanghai");
a.setSchoolAddress("beijing");
student.setAddress(a); //将地址对象设置给学生对象
request.setAttribute("student", student); //将student对象放入request

这样,我们就能在请求转发到的jsp页面获取到这个对象了。而使用EL表达式如何来做呢?

一、EL表达式的格式:

  EL表达式的格式是以‘$’开头,后面跟着一个大括号{ },而括号中内容,则可以理解为我们要获取的值的路径,而在括号里面的写法却用两种:

  1、使用点连接:

  第一种方式比较简单,就是使用点来连接各个属性,最终确定某个属性的值。假设我们要获取刚刚请求转发的student对象的name属性的值,它是当前request域中的student这个对象的属性,则EL表达式的写法为:

${requestScope.student.name }

  而若是想要获取student对象的address属性中的homeAddress属性的值,则写法类似:

${requestScope.student.address.homeAddress }

  这里的requestScope表示我们要取的值在request域中,第一个参数就是区域名+Scope,而后面就是这个区域的哪个对象,若是要获取对象的属性,则使用"."连接,和java代码中 对象.属性 的写法类似。

  2、使用中括号连接

  第二种使用EL表达式获取值的方式就是使用中括号[ ]代替点“.”,中括号中写入属性名,并且属性名用双引号或者单引号括起来,例如,还是取出上面的两个取值,使用中括号的写法如下:

${requestScope['student']['name'] } <!-- 在中括号中使用单引号或者双引号将属性名括起来 -->
${requestScope["student"]["address"]["homeAddress"] }

  使用中括号代替点,区域名写法不变,获取request域中的数据还是通过requestScope(区域名+Scope),而后面属性名却是写在中括号中,并且使用双引号或者单引号括住。

  3、点与中括号混合使用

  在EL表达式中,点与中括号可以混合使用,如下面的EL表达式,依然是获取request域中的student对象的address属性的homeAddress属性:

<!-- 即使用了点连接,也使用了中括号,且同时使用了双引号和单引号 -->
${requestScope["student"]['address'].homeAddress }

  当然,这种写法并不推荐,降低了代码的可读性,容易出错。

二、在EL表达式中,中括号的一些特殊作用:

  通过上面的例子,一般给我们感觉都是使用点来连接属性更加简单,但是中括号的功能却比点更加强大。下面就来举例说明。

  1、EL表达式通过中括号,获取名字中带有特殊符号的属性值

  假设在request域中,一些值的名称带有特殊符号,那使用点连接的EL表达式将无法成功获取到它的值,使用中括号却能,如下面代码所示:

//向request域中传入名字为"a-a"的值
request.setAttribute("a-a", "aaa");

   上面这个名字为“a-a”的属性被传入了request域,而分别通过点和中括号两种方式进行获取:

${requestScope["a-a"] }   <!-- 使用中括号的方式获取 -->
${requestScope.a-a } <!-- 使用点的方式获取 -->

  以下是获取结果:

  

  2、EL表达式通过中括号获取数组的值

  在EL表达式中,若向request域中传入了一个数组或者ArrayLIst容器,则可以通过中括号的方式,获取数组中的每一个值。如下代码向request域中传入一个数组和一个ArrayList:

 //向request域传入一个数组
int array[] = {1,2,3,4};
request.setAttribute("array", array); //向request域传入一个ArrayList
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
request.setAttribute("list", list);

  使用EL表达式在JSP中获取数组以及ArrayList中的每一个元素的值:

 *************使用中括号el表达式获取数组的值********************<br>
<!-- 通过下标获取数组的值 -->
${requestScope.array[0] }<br>
${requestScope.array[1] }<br> *************使用中括号el表达式获取ArrayList的值********************<br>
<!-- 通过下标获取ArrayList的值 -->
${requestScope.list[0] }<br>
${requestScope.list[1] }<br>

  可以看到,上面的EL表达式通过 “.”获取到了request域中的array和list,在通过【下标】的方式获取数组中的每一个值。,结果如下:

  3、在EL表达式中通过中括号获取Map容器中的值

  若向request域中传入一个Map容器,通过EL表达式也可以获取Map容器中的值,方式与获取数组的值类似,也是通过中括号,但是中括号中写的不是下标,而是key-value中的key。如下代码向request域中传入了一个HashMap容器:

 HashMap<String,String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
request.setAttribute("map", map);

  在JSP页面中,通过EL表达式来获取map中的值:

 *************使用EL表达式获取Map容器中的值**************<br>
${requestScope.map.key1 } <br> <!-- 通过点的方式获取,点后面根key -->
${requestScope.map["key2"] } <br> <!-- 通过中括号的方式获取,中括号中为key -->

  使用EL表达式获取Map容器中值,不仅仅可以使用中括号,使用点也能够做到,上面代码的第一种方式就是使用点来实现的,点后面跟map中元素的key的值;而只用中括号,中括号中放入的也是map中元素的key值。运行结果如下:

三、EL表达式中的算术运算符与逻辑运算符:

  EL表达式中支持大部分Java的逻辑运算符与算术运算符,可以使用符号或单词缩写两种形式,如百分号可以是%,也可以是mod,如下图:

  使用上面的运算符,根据运算结果,将会在页面上显示true或false,如下代码:

${1<2 } 或 ${1 lt 2 } <br>
${1< 2 || 1>2 } 或 ${1 lt 2 || 1 gt 2 } <br> ${empty requestScope.aaa } <br><!-- request中不存在叫做aaa的属性,将在页面打印true -->
${empty requestScope.map } <br><!-- request中存在叫做map的属性,将在页面打印false -->

  

四、EL表达式中的隐式对象:

  在JSP中,存在九大隐式对象,也叫九大内置对象,request,response,out,session......。而在EL表达式中,同样存在隐式对象,如下所示:

  

  EL表达式中的隐式对象大致分为三类:

  1、作用域访问对象

  即pageScope,requestScope,sessionScope以及applicationScope四个,表示的含义如上图,也就是各自表示一个作用域。上面我们用的都是requestScope,因为都是将值存入request域,并从request域中取出。下面我们来演示另外一个,将数据存入session域,并从session域中取出。将数据存入session域的代码如下:

request.getSession().setAttribute("sessionKey", "sessionValue");

  使用EL表达式中的sessionScope从session域中取出数据,代码如下:

${sessionScope.sessionKey }

  不难看出,使用方法域requestScope一样,只是操作的区域不同而已。另外两个作用域访问对象也是如此。而作用域之间也存在大小关系,四个作用域访问对象的大小关系是:pageScope < requestScope < sessionScope < applicationScope。知道这个有什么用呢?用处就在于EL表达式取值的默认机制。当我们取值时不指定作用域时,默认将从小到大依次寻找四个作用域,看是否存在这个值,若存在则取出第一个找到的值。如下代码分别在request域和session域中都传入了一个名称相同的数据:

 request.getSession().setAttribute("Key", "Value");
request.setAttribute("Key", "Value2");

  在JSP页面中获取名为Key的值,且不使用作用域访问参数指定作用域,代码如下:

获取名为Key的值:${Key }

  结果显示如下图:

  可以看到,获取到的时传入request域中的Value2,因为request域小于session域,默认先从小的域中去找。

  2、参数访问对象:

  参数访问对象中使用比较多的就是param以及paramValues,它们的作用就是获取与request.getParameter()一样,用来获取表单中提交的数据。param用来获取单个数据,而paramValues用来获取多个数据,即为数组中的数据。如下代码是一个form表单,其中有一个text类型的输入框,用来测试param,一个checkbox类型的复选框,用来测试paramValues:

 <form action="index2.jsp">
姓名:<input type="text" name="name"/>
爱好:<input type="checkbox" name="hobbies" value="pingpong"/>乒乓球
<input type="checkbox" name="hobbies" value="basketball"/>篮球
<input type="checkbox" name="hobbies" value="football"/>足球
<input type="submit" value="submit"/>
</form>

  运行结果如下:

  我们在输入框中输入“测试”,复选框选中其中的两个,并在JSP页面中获取,paramValues获取值的方式与数组相同,获取代码如下:

姓名:${param.name }<br>
爱好:
${paramValues.hobbies[0] },
${paramValues.hobbies[1] }, <%--EL表达式中,若值为null,将不显示,而不是报异常 --%>
${paramValues.hobbies[2] },

  在页面中显示的结果如下,注意,显示的不是<input>标签外面的中文,而是<input>中value属性的值:

  这里有有一点值得注意,在结果页面,爱好这一行最后有两个逗号,这是因为看上面EL代码可知,我在JSP中使用paramValues获取了三个复选框的值,但是提交的时候只选择了两个,也就是说没有第三个的值,${paramValues.hobbies[2] }为null,而在EL表达式中,null值将不显示,而不是像java代码一样报异常,这也是EL的好处之一。这也就导致只显示出最后的逗号,而没有值。

  除了获取表单中的值,param也能获取超链接中传来的值,如:http://localhost:8080/ELProject/index2.jsp?aa=1,在链接中传入了一个aa,值为1,则也可以使用param获取到aa的值,使用${param.aa}。

  3、JSP隐式对象:

  EL表达式中也包含JSP的隐式对象,就是pageContext,通过它可以获得所有JSP的隐式对象,方法如下:

 ${pageContext.request }   <!-- 获取jsp的request对象 -->
${pageContext.response} <!-- 获取jsp的response对象 -->
${pageContext.session} <!-- 获取jsp的session对象 -->

  也可以通过级联的方式使用:

${pageContext.request.serverPort }<!-- 级联方式获取端口号 -->

  以上就是EL表达式的一些基本的使用方式。

快速学会在JSP中使用EL表达式的更多相关文章

  1. jsp中的el表达式没有解析

    今天发现jsp中的el表达式没有解析,把解决的过程记录一下 在web.xml的web-app节点的版本改成2.4以上

  2. SSH 框架controller向jsp传递List jsp中使用el表达式获取

    mvc可以使用ModelAndViev传递数据选择跳转的视图 controller中的代码, 把一个模拟的表单studentListSimulate传给ModelAndView @RequestMap ...

  3. JSP中的EL 表达式

    JSP中的EL 表达式 什么是 EL 表达式,EL 表达式的作用? EL 表达式的全称是:Expression Language.是表达式语言. EL 表达式的什么作用:EL 表达式主要是代替 jsp ...

  4. JavaWeb -- Jsp中的 EL表达式

    lEL 全名为Expression Language.EL主要作用: l获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.(某个web ...

  5. JSP中使用EL表达式

    EL表达式 :EL 全名为Expression Language,就是为了替代<%= %>脚本表达式. EL主要作用: 获取数据: EL表达式主要用于替换JSP页面中的脚本表达式,以从各种 ...

  6. Jsp中的EL表达式

    EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!! 语法: ${变量或表达式} 可以通过page指令来设置EL表示是否启用,false是不启用,true是启用,默认是true &l ...

  7. Java基础82 jsp中的EL表达式(网页知识)

    1.EL表达式的作用 EL表达式的作用:向浏览器输出域对象中的变量值或者表达式计算结果.语法:${变量或者表达式} 注: Jsp的核心语法:jsp的表达式<%= %>和jsp的脚本< ...

  8. JSP中的EL表达式详细介绍

    一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素.它们通常用于对象操作以及执行那些 ...

  9. JSP中,EL表达式向session中取出一个attribute和JSP脚本访问session取出一个attribute,写法有何不同?(转自百度知道)

    EL表达式使用起来会更简洁,假如session中有一个属性A(attrA),那么EL和jsp脚本取值的方式如下: EL表达式:${ sessionScope.attrA } JSP脚本:<%=s ...

随机推荐

  1. java 解析命令行参数

    下载地址: https://jcenter.bintray.com/org/apache/commons/com.springsource.org.apache.commons.cli/1.2.0/ ...

  2. Android Studio 连接天天、海马、逍遥模拟器

    adb connect 127.0.0.1:6555 取消连接 adb disconnect 127.0.0.1:6555 连接海马模拟器(未测试)  adb connect 127.0.0.1:26 ...

  3. MySQL+Navicat for MySQL安装

    一.安装MySQL 1.下载MySQL http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-winx64.zip 2.安装 2.1解压安装包 ...

  4. HashCode的理解

    一.hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构 ...

  5. 第八章 高级搜索树 (b1)B-树:动机

  6. 使用VisualStudio开发php的图文设置方法[xyytit]

    早先在asp横行的年代,php和asp一样,大都都是html中夹杂代码,说实话,这时候IDE的确用处不是很大,倒是类似于dw之类的设计器甚为上手.   现在,三层.mvc之类的思想遍地开花,使得代码和 ...

  7. windows下用tcc编译Lua

    脚本来源:Demon's Blog,http://demon.tw/software/compile-lua-with-tcc.html 版权归原作者所有 使用方法: 1.下载tcc编译器,本文解压目 ...

  8. PythonQt在windows下的编译

    笔者最近在做Qt方面的开发工作,然后需要用到脚本程序对程序内部进行扩展,就很自然的想到了Python,度娘一下发现了一款神器,也就是今天给大家介绍的主角:PythonQt 今天首先给大家介绍下Pyth ...

  9. Linux dkpg命令

    一.简介 dpkg 是Debian Package 的简写,是Debian系列系统下的一个软件安装.更新及移除工具. 二.常用指令 1.查询功能 查看软件包信息: dpkg -info xxx.deb ...

  10. db2 sql调优

    当我们发现某个SQL语句执行很慢时,可以通过查看它的访问计划来定位原因,如是否执行了合适的索引.是否采用了正确的连接方法等.但是我们发现很多用户对访问计划的生成和解释工具的使用存在很多疑惑,本文通过一 ...