JavaEE--EL表达式(六)

一、EL表达式

1. EL简介:

表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性。

2. EL有以下几个特点:

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

3. 与低版本的环境兼容——禁用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>元素

<jsp-config>  
       <jsp-property-group>  
              <url-pattern>*.jsp</url-pattern>  
              <el-ignored>true</el-ignored>  
       </jsp-property-group>  
</jsp-config> 

二、EL的语法

${  EL exprission }
${  bean.name } 或  ${  bean['name'] }
<%@ page isELIgnored ="true|false" %>

三、EL运算符

算术运算符有五个:+、-、*或$、/或div、%或mod
关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
逻辑运算符有三个:&&或and、||或or、!或not
其它运算符有三个:Empty运算符、条件运算符、()运算符

1、通过EL访问数据

  通过EL提供的”[]”和”.”运算符可以访问数据。通常情况下这两个运算符是等价的,可以相互代替。
  但也不是所有情况下都可以相互代替,例如当对象的属性名中包含一些特殊的符号(-或.)时,就只能使用[]来访问对喜爱那个的属性。例如{userInfo[user-id]}是正确的,而{userInfo.user-name}是错误的。
下面给出通过这两运算符访问数据的例子:

1)、获取数组元素(只能使用[],不能用.)
<%  
       String[] str = {"一号" , "二号" , "三号" , "四号" , "五号"};  
       request.setAttribute("user",str);  
  
%>  
<%  
       String[] str1 =(String[])request.getAttribute("user");  
       for(int i=0; i < str1.length; i++){  
              request.setAttribute("rt",i);  
%>  
       ${rt}: ${user[rt] }<br>  
<% }%> 
2)、List集合元素的获取(只能使用[],不能用.)
<%  
       List<String> list = newArrayList<String>();  
       list.add("一号");  
       list.add("二号");  
       list.add("三号");  
      session.setAttribute("user",list);  
%>  
<%  
       List<String> list1 =(List<String>)session.getAttribute("user");  
       for(int i = 0 ; i < list1.size() ;i++){  
             request.setAttribute("rt",i);  
%>  
       ${rt}: ${user[rt] }<br>  
<%  }%>  

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}
<%request.setAttribute("user" , "");%>  
         <%request.setAttribute("user1"  , null);%>  
         <%request.setAttribute("user2"  , 2);%> 
         ${emptyuser}       //返回值为true  
         ${emptyuser1}     //返回值为true  
         ${emptyuser2}    //返回值为false  

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

   在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。
<%  
       request.setAttribute("userName","张三");  
       request.setAttribute("pwd","123456");  
  
%>  
userName= ${userName }<br>  
pwd= ${pwd }<br>  
\${userName!= "" and (pwd == "asd" )}  
${userName!= "" and (pwd == "asd" )}<br>  
\${userName== "张三" and pwd == "123456" }  
${userName== "张三" and pwd == "123456" }<br>  

5、在EL中进行条件运算

   在EL中进行条件运算,唯一的优点在于其非常简单方便,和Java语言中的用法完全一致,其语法格式如下:
   ${条件表达式? 表达式1 : 表达式2}
   例如:${1==1 ? “对”: “错“}

6. EL的隐含对象

查找的范围从page,request,session,application

隐式对象 作用
pageContext 对应于JSP页面中的pageContext对象
pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
param 表示一个保存了所有请求参数的Map对象
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数, 返回的是一个string类型数组
header 表示一个保存了所有http请求头字段的Map对象
headerValues 表示一个保存了所有http请求头字段的Map对象,返回string类型数组
cookie 表示一个保存了所有cookie的Map对象
initParam 表示一个保存了所有web应用初始化参数的map对象
1)pageContext对象
 EL表达式中的pageContext隐式对象与JSP页面中的pageContext对象相对应,EL表达式可以通过pageContext隐式对象访问其它JSP隐式对象,如访问request、response对象属性时,可以使用表达式${pageContext.request.requestURI}

表达式${pageContext.response.contentType}等。

2)代表特定域属性的隐式对象

  EL表达式中的pageScope、requestScope、sessionScope和applicationScope四个隐式对象分别用于访问JSP页面的page、request、session、application四个域中的属性。例如,表达式{pageScope.userName}返回page作用域中的userName属性的值,表达式{sessionScope.bookName}返回session作用域中的bookName属性的值。
  在EL表达式中也可以不使用这些隐式对象来指定查找域,而是直接引用这些域中的属性名称。例如,表达式${userName}就会在page、request、session、application这四个作用域内按顺序依次查找userName属性,直到找到为止。

3)代表请求参数的隐式对象

  EL表达式中的隐式对象param和paramValues用于获取客户端访问JSP页面时传递的请求参数的值,由于HTTP协议允许使用一个请求参数名出现多次,即一个请求参数可能会有多个值,所以,EL表达式提供了param和paramValues这两个隐式对象来分别获取请求参数的某个值和所有值。
  Param隐式对象用于返回一个请求参数的某个值,如果同一个请求参数有多个值,则返回第一个参数的值。paramValues隐式对象用于返回一个请求参数的所有值,返回结果为该参数的所有值组成的字符串数组,例如表达式${paramValues.username[0]}用于返回数组中第一个元素的值。

<form action="" method="get" name="form1"  >  
       <input name="user" type="text"value="张三">  
       <input type="submit">  
</form>  
${param.user}  
4)代表HTTP请求消息的隐式对象

  EL表达式中的隐式对象header和headerValues用于获取客户端访问JSP页面时传递的请求头字段的值。由于HTTP协议允许一些请求头字段出现多次,即一个请求头字段可能会有多个值,所以,EL表达式提供了header和headerValues两个隐式对象分别用于获取请求头字段的某个值和所有值。
  header隐式对象返回一个请求头字段的某个值,如果同一个请求头字段有多个值,则返回第一个值,例如,使用表达式${header.referer}可以非常方便的获取referer请求头字段的值。headerValues隐式对象用于返回一个请求头字段所有值组成的字符串数组。

${header[“connection”]}
5)cookie隐式对象

  EL表达式中的隐式对象cookie是一个代表所有Cookie信息的Map集合,Map集合中元素的关键字为各个Cookie的名称,值则为对应的Cookie对象。使用cookie隐式对象可以访问某个Cookie对象,这些Cookie对象则是通过调用HTTPServletRequest.getCookies()方法得到的,如果多个Cookie共用一个名称,则返回Cookie对象数组中的第一个Cookie对象。例如,要访问一个名为userName的Cookie对象,可以使用表达式${cookie.userName}。

6)initParam隐式对象

  EL表达式中的initParam是一个代表Web应用程序中的所有初始化参数的Map对象,每个初始化参数的值是ServletContext.getInitParameter(String name)方法返回的字符串。Web应用程序的初始化参数可以通过两种方式来配置,分别是在server.xml文件中配置和在web.xml文件中配置,具体如下:
(1)在server.xml文件中配置Web应用程序的初始化参数:
(2)在web.xml文件中配置Web应用程序的初始化参数:
在web.xml文件中设置一个初始化参数user:

<context-param>
     <param-name>user</param-name>
      <param-value>张三</param-value>
</context-param>

使用EL获取该参数:

     ${initParam.user}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容