Java Web中的EL(表达式语言)详解

表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发Java Web应用的新途径。下面对EL的语法、运算符及隐含对象进行详细介绍。

一、EL概述

1、EL简介

EL没出现之前,开发JavaWeb应用程序时,经常需要将大量的Java代码片段嵌入到JSP页面中,这会使页面开起来很乱,如下例子:

  1. <%if(session.getAttribute(“username”)!= null){
  2. out.println(session.getAttribute(“username”).toString());
  3. }%>

而是用EL则只需要下面的依据代码即可实现:

${username}

通过上面的例子我们可以知道,EL表达式的语法非常简单,它以”${”开头,以”}”结束,中间为合法的表达式,具体的语法格式为:

${expression}

expression用于指定要输出的内容,可以使字符串,也可以是由EL运算符组成的表达式。

例如在EL表达式中要输出一个字符串,可以将此字符串放在一对单引号或双引号内:

${‘我叫小武灵灵’}  或${“我叫小武灵灵”}

EL有以下几个特点:

  • EL可以与JSTL结合使用,也可以与JavaScript语句结合使用;
  • EL中会自动进行类型转换。如果想通过EL输入两个字符串型数值的和,可以直接通过”+”号进行连接,如${num1+num2};
  • EL不仅可以访问一般变量,还可以访问JavaBean中的属性以及嵌套属性和集合对象;
  • 在EL中可以获得命名空间(PageContext对象,它是页面中所有其他内置对象的最大范围的集成对象,通过它可以访问其他内置对象);
  • 在使用EL进行除法运算时,如果除数为0,则返回无穷大Infinity,而不是错误;
  • 在EL中可以访问JSP的作用域(request、session、application以及page);
  • 扩展函数可以与Java类的静态方法进行映射。

2、与低版本的环境兼容——禁用EL

目前只要安装的Web服务器能够支持Servlet 2.4/JSP 2.0,就可以在JSP页面中直接使用EL。由于在JSP2.0以前版本中没有EL,所以JSP为了和以前的规范兼容,还提供了禁用EL的方法。有以下三种方法:

1)、使用斜杠”\”

只需要在EL的起始标记“$”前加上”\”即可;

2)、使用page指令

使用JSP的page指令也可以禁用EL表达式,语法格式如下;

<%@ page isELIgnored=”布尔值”%>   true为禁用EL

3)、在web.xml文件中配置<el-ignored>元素

  1. <jsp-config>
  2. <jsp-property-group>
  3. <url-pattern>*.jsp</url-pattern>
  4. <el-ignored>true</el-ignored>
  5. </jsp-property-group>
  6. </jsp-config>

3、保留的关键字

EL中保留的关键字如下,在为变量命名时,应该避免使用这些关键字:

and

eq

gt

instanceof

div

or

le

false

empty

not

Lt

ge

二、EL的运算符使用

EL的运算符在按照从左向右的计算原则下,优先级如下:

1、通过EL访问数据

通过EL提供的”[]”和”.”运算符可以访问数据。通常情况下这两个运算符是等价的,可以相互代替。

但也不是所有情况下都可以相互代替,例如当对象的属性名中包含一些特殊的符号(-或.)时,就只能使用[]来访问对喜爱那个的属性。例如${userInfo[user-id]}是正确的,而${userInfo.user-name}是错误的。

下面给出通过这两运算符访问数据的例子:

1)、获取数组元素(只能使用[],不能用.)

  1. <%
  2. String[] str = {"一号" , "二号" , "三号" , "四号" , "五号"};
  3. request.setAttribute("user",str);
  4. %>
  5. <%
  6. String[] str1 =(String[])request.getAttribute("user");
  7. for(int i=0; i < str1.length; i++){
  8. request.setAttribute("rt",i);
  9. %>
  10. ${rt}: ${user[rt] }<br>
  11. <% }%>

2)、List集合元素的获取(只能使用[],不能用.)

  1. <%
  2. List<String> list = newArrayList<String>();
  3. list.add("一号");
  4. list.add("二号");
  5. list.add("三号");
  6. session.setAttribute("user",list);
  7. %>
  8. <%
  9. List<String> list1 =(List<String>)session.getAttribute("user");
  10. for(int i = 0 ; i < list1.size() ;i++){
  11. request.setAttribute("rt",i);
  12. %>
  13. ${rt}: ${user[rt] }<br>
  14. <%  }%>

2、在EL中进行算术运算

运算符

功能

示例

结果

+

${1+1}

2

-

${1-1}

0

*

${2*2}

4

/或div

${2/1}或${2 div 1}

2

${2/0}或${2 div 0}

Infinity

%或 mod

求余

${3%2}或${3mod2}

1

${3%0}或${3 mod0}

异常:java.lang.ArithmeticException:/by zero

3、在EL中判断对象是否为空

通过empty运算符实现,用来确定一个对象或比那辆是否为null或空,格式如下:

${empty expression}

例如:

  1. <%request.setAttribute("user" , "");%>
  2. <%request.setAttribute("user1"  , null);%>
  3. <%request.setAttribute("user2"  , 2);%>
  4. ${emptyuser}       //返回值为true
  5. ${emptyuser1}     //返回值为true
  6. ${emptyuser2}    //返回值为false

4、在EL中进行逻辑关系运算

在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。其使用方法都差不多,下面给出一个例子:

  1. <%
  2. request.setAttribute("userName","小武");
  3. request.setAttribute("pwd","123456");
  4. %>
  5. userName= ${userName }<br>
  6. pwd= ${pwd }<br>
  7. \${userName!= "" and (pwd == "asd" )}
  8. ${userName!= "" and (pwd == "asd" )}<br>
  9. \${userName== "小武" and pwd == "123456" }
  10. ${userName== "小武" and pwd == "123456" }<br>

5、在EL中进行条件运算

在EL中进行条件运算,唯一的优点在于其非常简单方便,和Java语言中的用法完全一致,其语法格式如下:

${条件表达式? 表达式1 : 表达式2}

例如:${1==1 ? “对”: “错“}

三、EL的隐含对象

为了能够获得Web应用程序中的相关数据,EL提供了11个隐含对象,这些对象类似于JSP的内置对象,也是直接通过对象名进行操作。

1、页面上下文对象

pageContext用于访问JSP内置对象和servletContext。在获取到这些内置对象后,就可以获取器属性值。这些属性与对象的gexxx()方法相对象,在使用时,去掉方法名中的get,并将首字母改为小写即可。下面介绍如何应用页面上下文对象访问你JSP的内置对象和servletContext对象。

1)、访问request对象——${pageContext.request}

获取到request对象后,就可以通过该对象获取与客户端相关的信息。例如要访问getServerPort()方法,可以使用下面的代码:

${pageContext.request.serverPort}

注意不可以通过pageContext对象获取保存到request范围内的变量。

2)、访问response对象——${pageContext.response}

3)、访问out对象——${pageContext.out}

4)、访问session对象——${pageContext.session}

5)、访问exception对象——${pageContext.exception}

6)、访问page对象——${pageContext.page}

7)、访问servletContext对象——${pageContext.servletContext}

2、访问作用域范围的隐含对象

在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对喜爱那个指定要查找的标识符的作用域后,系统将不再按照默认的顺序(page、request、session及application)来查找相应的标识符。他们与JSP中的page、request、session及application内置对象类似。只不过这4个隐含对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。

1)、pageScope隐含对象

pageScope对象用于返回包含page(页面)范围内的属性的集合,返回值为java.util.Map对象。下面是一个具体例子,通过pageScope对象读取page范围内的JavaBean属性值。

新建JavaBean为UserInfo:

  1. package com;
  2. public class UserInfo {
  3. private String name ="";
  4. public void setName(Stringname) {
  5. this.name = name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. }

Index.jsp添加:

  1. <body>
  2. <jsp:useBeanidjsp:useBeanid="user" scope="page" class="com.UserInfo"type="com.UserInfo"></jsp:useBean>
  3. <jsp:setPropertypropertyjsp:setPropertyproperty="name" name="user" value="小武灵灵" />
  4. ${pageScope.user.name}
  5. </body>

2)、requestScope隐含对象

用于返回包含request范围内的属性值的集合,返回值为java.util.Map对象。例如:

  1. <%
  2. request.setAttribute("userName","小武灵灵");
  3. %>
  4. ${requestScope.userName }

3)、sessionScope隐含对象

用于返回包含session范围内的属性值的集合。例如:

  1. <%
  2. session.setAttribute("userName","小武灵灵");
  3. %>applicationapplication
  4. ${sessionScope.userName }

4)、applicationScope隐含对象

用于返回包含application范围内的属性值的集合。例如:、

  1. <%
  2. application.setAttribute("userName","小武灵灵");
  3. >
  4. {applicationScope.userName }

3、访问环境信息的隐含对象

EL中提供了6个访问环境信息的隐含对象,分别为:

1)、param对象

用于获取请求参数的值,应用在参数值只有一个的情况,返回结果为字符串。例如:

  1. <formactionformaction="" method="get" name="form1"  >
  2. <input name="user" type="text"value="小武灵灵">
  3. <input type="submit">
  4. </form>
  5. ${param.user}

2)、paramValues对象

如果一个请求参数名对应多个值,则需要使用paramValues对象获取请求参数的值,该对象返回的结果为数组。例如:

  1. <formactionformaction="" method="get" name="form1"  >
  2. <input type="checkbox"name="affect" id="affect" value="1">
  3. <input type="checkbox"name="affect" id="affect" value="2">
  4. <input type="checkbox"name="affect" id="affect" value="3">
  5. <input type="checkbox"name="affect" id="affect" value="4">
  6. <input type="submit">
  7. </form>
  8. <%request.setCharacterEncoding("GB18030"); %>
  9. 选择的是:${paramValues.affect[0]}${paramValues.affect[1]}${paramValues.affect[2]}${paramValues.affect[3]}

3)、header和headerValues对象

用于获取HTTP请求的一个具体的header值,当同一个header存在多个值时需使用headerValues对象。例如:

${header[“connection”]}获取HTTP请求的header的是否需要持久连接这一属性

4)、initParam对象

用于获取Web应用初始化参数的值。例如:

在web.xml文件中设置一个初始化参数user:

<context-param>

<param-name>user</param-name>

<param-value>小武</param-value>

</context-param>

使用EL获取该参数:

${initParam.user}

5)、cookie对象

用于访问由请求设置的cookie。例如:

  1. <%
  2. Cookie cookie = new Cookie("user", "xiaowu");
  3. response.addCookie(cookie);
  4. %>
  5. ${cookie.user.value }

四、定义和使用EL函数

EL允许定义和使用函数,但是eclipse好像不能自动生成tld文件,我嫌麻烦,而且EL函数不常用,所以这里不介绍了。

java----EL表达式的更多相关文章

  1. 【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL

    2018.10.14 BUG原因: 在较早期的代码中,容易出现 JS 拼接 HTML 代码字符串的情况.如 // 页面 test.jsp 内部的 JS 代码 // ${} JSP中EL语法,内部为Ja ...

  2. java el表达式报空指针异常(nullpointexception)

    最近在使用el表达式的时候,用到了int型变量,因为,很多时候,变量不会被赋初值,后面考虑了下,应该将声明由int 改为integer,改了之后就一直报空指针异常,后面仔细查看,我的getter和se ...

  3. Ruby页面,循环赋值方法(类似java EL表达式赋值)

    ------------前台代码--------------- <% @form_hash.each_with_index do |f,index| %> <% item = f[: ...

  4. java EL表达式中${param.name}详细

    在浏览器地址输入,表示传入一个参数test,值为123 URL:http://localhost:8888/Test/index.jsp?test=123 <body> ${test} $ ...

  5. java web学习总结(三十一) -------------------EL表达式

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

  6. Java Web技术之JSP与EL表达式

    1,jsp是用来干嘛的? JSP技术是用来解决在Servlet中需要书写大量的拼接html标签.以及框架的代码 2,jsp的三种脚本元素 a.JSP的脚本声明(定义) 格式: <%! 书写Jav ...

  7. java、el表达式中保留小数的方法

    Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; p ...

  8. Java实战之04JavaWeb-04JSP、EL表达式、JSTL标签库

    一.jsp部分 只要是与页面显示相关的都是重点 1.jsp的脚本 <%java代码%>:被翻译到service方法内部,局部变量,局部的功能 <%=表达式或变量%>:翻译成se ...

  9. jsp不解析el表达式,不识别jstl标签,找不到http://java.sun.com/jsp/jstl/core

    问题描述: jsp页面中el表达式,例如:${pageContext.request.contextPath},原样呈现,未被解析. 解决方案: 为jsp页添加page指令如下: <%@ pag ...

  10. Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)

    一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...

随机推荐

  1. 【Android】读取sdcard上的图片

    Android读取sdcard上的图片是很easy的事情,以下用一个样例来说明这个问题. 首先,在sdcard上有一张已经准备好的img25.jpg 以下,须要做的是把这张图片读取到app中显示. 做 ...

  2. 亲热接触Redis-第二天(Redis Sentinel)

    简单介绍 经过上次轻松搭建了一个Redis的环境并用Java代码调通后.这次我们要来看看Redis的一些坑以及Redis2.8以后带来的一个新的特性即支持高可用特性功能的Sentinel(哨兵). R ...

  3. java接口的高级应用

    直接上菜 /*接口类*/ public interface MsgListener{ public void afterMsgRecived(String msgData); } /*工具类*/ pu ...

  4. HBase建立二级索引的一些解决方式

    HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索. 假设我们相对hbase里面列族的列列进行一些组合查询.就须要採用HBase的二级索引方案来进行多条件的查询. 常见的二级索引 ...

  5. 基于Java的在线聊天室

    概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...

  6. 演示unity内存管理机制的缺陷

    概述 这是最近做项目时发现的一个内存管理机制上的一个缺陷,但是我并不知道这究竟是不是一个bug,因为他可以造成内存泄漏,但是却能避开野指针. 详细 代码下载:http://www.demodashi. ...

  7. MySQL学习记录一

    1.MySQL join操作 left join以左表为基础,其记录会全部表示出来,而右表只显示满足搜索条件的记录.right join以右表为基础,其记录会全部显示出来,而左表只显示满足搜索条件的记 ...

  8. Linux命令-目录处理命令:rmdir

    rmdir /tmp/shijiazhuang/yuhuaqu 删除一个子目录(必须是空目录) rmdir /tmp/shijiazhuang 删除一个不为空的目录会失败

  9. Linux环境源码编译安装SVN

    zhoulf 2015/2/28 原创 安装说明 安装环境:Red Hat Enterprise Linux 安装方式:源码安装 软件:apr-1.5.0.tar.gz.apr-iconv-1.2.1 ...

  10. C++二维数组讲解、二维数组的声明和初始化

    我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...