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

news/2023/10/4 0:07:06
 Java Web中的EL(表达式语言)详解

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

一、EL概述

1、EL简介

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

[php] view plaincopy
print?
  1. <%if(session.getAttribute(“username”)!= null){  
  2.   
  3.        out.println(session.getAttribute(“username”).toString());  
  4.   
  5. }%>  


       而是用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>元素

[html] view plaincopy
print?
  1. <jsp-config>  
  2.   
  3.        <jsp-property-group>  
  4.   
  5.               <url-pattern>*.jsp</url-pattern>  
  6.   
  7.               <el-ignored>true</el-ignored>  
  8.   
  9.        </jsp-property-group>  
  10.   
  11. </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)、获取数组元素(只能使用[],不能用.)

[html] view plaincopy
print?
  1. <%  
  2.   
  3.        String[] str = {"一号" , "二号" , "三号" , "四号" , "五号"};  
  4.   
  5.        request.setAttribute("user",str);  
  6.   
  7. %>  
  8.   
  9. <%  
  10.   
  11.        String[] str1 =(String[])request.getAttribute("user");  
  12.   
  13.        for(int i=0; i < str1.length; i++){  
  14.   
  15.               request.setAttribute("rt",i);  
  16.   
  17. %>  
  18.   
  19.        ${rt}: ${user[rt] }<br>  
  20.   
  21. <% }%>  


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

      

[html] view plaincopy
print?
  1. <%  
  2.   
  3.        List<String> list = newArrayList<String>();  
  4.   
  5.        list.add("一号");  
  6.   
  7.        list.add("二号");  
  8.   
  9.        list.add("三号");  
  10.   
  11.        session.setAttribute("user",list);  
  12.   
  13. %>  
  14.   
  15. <%  
  16.   
  17.        List<String> list1 =(List<String>)session.getAttribute("user");  
  18.   
  19.        for(int i = 0 ; i < list1.size() ;i++){  
  20.   
  21.               request.setAttribute("rt",i);  
  22.   
  23. %>  
  24.   
  25.        ${rt}: ${user[rt] }<br>  
  26.   
  27. <%  }%>  


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}

例如:

[html] view plaincopy
print?
  1. <%request.setAttribute("user" , "");%>  
  2.   
  3.          <%request.setAttribute("user1"  , null);%>  
  4.   
  5.          <%request.setAttribute("user2"  , 2);%>  
  6.   
  7.          ${emptyuser}       //返回值为true  
  8.   
  9.          ${emptyuser1}     //返回值为true  
  10.   
  11.          ${emptyuser2}    //返回值为false  


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

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

[html] view plaincopy
print?
  1. <%  
  2.   
  3.        request.setAttribute("userName","小武");  
  4.   
  5.        request.setAttribute("pwd","123456");  
  6.   
  7. %>  
  8.   
  9. userName= ${userName }<br>  
  10.   
  11. pwd= ${pwd }<br>  
  12.   
  13. \${userName!= "" and (pwd == "asd" )}  
  14.   
  15. ${userName!= "" and (pwd == "asd" )}<br>  
  16.   
  17. \${userName== "小武" and pwd == "123456" }  
  18.   
  19. ${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:

[java] view plaincopy
print?
  1. package com;  
  2.   
  3. public class UserInfo {  
  4.   
  5.        private String name ="";  
  6.   
  7.        public void setName(Stringname) {  
  8.   
  9.               this.name = name;  
  10.   
  11.        }  
  12.   
  13.        public String getName() {  
  14.   
  15.               return name;  
  16.   
  17.        }  
  18.   
  19. }  

Index.jsp添加:

[html] view plaincopy
print?
  1. <body>  
  2.   
  3. <jsp:useBeanidjsp:useBeanid="user" scope="page" class="com.UserInfo"type="com.UserInfo"></jsp:useBean>  
  4.   
  5. <jsp:setPropertypropertyjsp:setPropertyproperty="name" name="user" value="小武灵灵" />  
  6.   
  7. ${pageScope.user.name}  
  8.   
  9. </body>  


       2)、requestScope隐含对象

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

[html] view plaincopy
print?
  1. <%  
  2.   
  3. request.setAttribute("userName","小武灵灵");  
  4.   
  5. %>  
  6.   
  7. ${requestScope.userName }  


       3)、sessionScope隐含对象

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

[html] view plaincopy
print?
  1. <%  
  2.   
  3. session.setAttribute("userName","小武灵灵");  
  4.   
  5. %>applicationapplication  
  6.   
  7. ${sessionScope.userName }  


       4)、applicationScope隐含对象

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

[html] view plaincopy
print?
  1. <%  
  2.   
  3. application.setAttribute("userName","小武灵灵");  
  4.   
  5. >  
  6.   
  7. {applicationScope.userName }  


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

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

       1)、param对象

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

[html] view plaincopy
print?
  1. <formactionformaction="" method="get" name="form1"  >  
  2.   
  3.        <input name="user" type="text"value="小武灵灵">  
  4.   
  5.        <input type="submit">  
  6.   
  7. </form>  
  8.   
  9. ${param.user}  


       2)、paramValues对象

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

[html] view plaincopy
print?
  1. <formactionformaction="" method="get" name="form1"  >  
  2.   
  3.        <input type="checkbox"name="affect" id="affect" value="1">  
  4.   
  5.        <input type="checkbox"name="affect" id="affect" value="2">  
  6.   
  7.        <input type="checkbox"name="affect" id="affect" value="3">  
  8.   
  9.        <input type="checkbox"name="affect" id="affect" value="4">  
  10.   
  11.        <input type="submit">  
  12.   
  13. </form>  
  14.   
  15. <%request.setCharacterEncoding("GB18030"); %>  
  16.   
  17. 选择的是:${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。例如:

[html] view plaincopy
print?
  1. <%  
  2.   
  3. Cookie cookie = new Cookie("user", "xiaowu");  
  4.   
  5. response.addCookie(cookie);  
  6.   
  7. %>  
  8.   
  9. ${cookie.user.value }  


四、定义和使用EL函数

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.yaotu.net/news/605601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PowerDesigner入门教程

PowerDesigner安装方法:http://dev.firnow.com/course/3_program/java/javajs/20090908/174375.html安装完这2个软件了,接着就开始使用吧,还是和以前一样,先提出需求,再做实例,因为我们之所以使用它们,肯定是因为它们能巧妙的解决某种问题,不然我们干嘛花那么多时间和硬盘空间安…

PowerDesigner(一)-PowerDesigner概述(系统分析与建模)

PowerDesigner概述 PowerDesigner是Sybase公司推出的一个集成了企业架构&#xff0c;UML(统一建模语言)和数据库的CASE(计算机辅助软件工程)工具。它不仅可以用于系统设计和开发的不同阶段(即业务分析&#xff0c;概念模型设计&#xff0c;物理模型设计以及面向对象开发阶段)&a…

PowerDesigner(二)-项目和框架矩阵

项目和框架矩阵 项目是PowerDesigner 15的新概念&#xff0c;通过项目系统分析/设计人员可以对模型以及各类文档进行分组。项目也可以包含框架矩阵&#xff0c;以表格的形式体现各个模型之间的关系。 项目和框架矩阵解决了如何对模型进行统一管理的问题。 1.创建框架矩阵(FEAF-…

PowerDesigner(三)-企业架构模型

企业架构模型(Enterprise Architecture Model,EAM)是PowerDesigner 15新增的功能&#xff0c;它能够以图形的方式展现企业架构&#xff0c;从而取代文字描述&#xff1b;以偏向非技术性的表达方式&#xff0c;从不同层面表达不同的图示结果。 企业架构模型从业务层&#xff0c;…

PowerDesigner(四)-业务处理模型

业务处理模型 业务处理模型(Business Process Model,BPM)以业务需求作为出发点&#xff0c;用图形的方式描述系统的任务和业务流程&#xff0c;注重的是处理过程中数据流程。业务处理模型是从业务人员的角度对业务逻辑和规则进行详细描述的概念模型&#xff0c;并使用流程 图表…

PowerDesigner(五)-概念数据模型(CDM生成LDM,PDM和OOM)

概念数据模型 概念数据模型(Conceptual Data Model,CDM)&#xff1a;表达的是数据整体逻辑结构&#xff0c;该结构独立于任何软件和数据存储结构&#xff0c;即它只是系统分析人员&#xff0c;应用程序设计人员&#xff0c;维护人员和用户之间相互理解的共同语言&#xff0c;并…

PowerDesigner(六)-物理数据模型(PDM逆向工程)

物理数据模型PDM 物理数据模型(Physical Data Model,PDM):在数据库的逻辑结构设计好之后&#xff0c;就需要完成其物理设计&#xff0c;PDM就是为实现这一目的而设计的。 物理数据模型是以常用的DBMS(数据库管理系统)理论为基础&#xff0c;将CDM/LDM中所建立的现实世界模型生…

PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)

面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型&#xff0c;它从不同角度实现系统的工作状态。这些图形有助于用户&#xff0c;管理人员&#xff0c;系统分析人员&#xff0c;开发人员&#xff0c;测试人员和其他人员之间进行信息交流。这里主要…

PowerDesigner(九)-模型文档编辑器(生成项目文档)

模型文档编辑器 PowerDesigner的模型文档(Model Report)是基于模型的&#xff0c;面向项目的概览文档&#xff0c;提供了灵活&#xff0c;丰富的模型文档编辑界面&#xff0c;实现了设计&#xff0c;修改和输出模型文档的全过程。 模型文档的功能如下&#xff1a; 为各个模型…

JNDI学习总结(一)——JNDI数据源的配置

一、数据源的由来 在Java开发中&#xff0c;使用JDBC操作数据库的四个步骤如下&#xff1a; ①加载数据库驱动程序(Class.forName("数据库驱动类");)②连接数据库(Connection con DriverManager.getConnection();)③操作数据库(PreparedStatement stat con.prepa…

JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源

一、C3P0下载 C3P0下载地址&#xff1a;http://sourceforge.net/projects/c3p0/files/?sourcenavbar 下载完成之后得到一个压缩包。 二、使用C3P0配置JNDI数据源 Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池&#xff0c;Tomcat6.x使用DBCP连接池配置JN…

java 消息机制 ActiveMQ入门实例

1.下载ActiveMQ 去官方网站下载&#xff1a; http://activemq.apache.org/我下载的时候是 ActiveMQ 5.8.0 Release版 2.运行ActiveMQ 解压缩apache-activemq-5.8.0-bin.zip&#xff0c;然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。 启动ActiveMQ以后&…

JavaSE基础12笔记常见对象

12.01_常见对象(Scanner概述及其方法介绍) A.Scanner概述 B.Scanner构造方法原理 ​ Scanner(Inputstream source) ​ System下面有个字段 ​ public static final Inputstream in;标准输入流,对应键盘录入 C.一般方法 ​ hasNextxxx() 判断是否还有下一个输入项 ​ ne…

spring integeration主要概念

1目标和原则 SpringIntegration主要有如下两个目标&#xff1a; l提供一个简单的模型来实现复杂的企业集成解决方案 l为基于Spring的应用添加异步的、消息驱动的行为&#xff0c;让Spring用户可以直观的、增量的采用 SpringIntegration基于两个原则&#xff1a; l组件应该松耦合…

Spring Integration入门

为什么使用Spring Integration Spring Integration是Spring框架创建的又一个API&#xff0c;面向企业应用集成&#xff08;EAI&#xff09;。说到集成&#xff0c;并不缺“解决办法”&#xff1a;硬编码的Java客户端、其它ESB产品&#xff0c;还有消息队列等更加传统的应用集成…

dispatcherservlet详解

3.1、DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现&#xff0c;提供Spring Web MVC的集中访问点&#xff0c;而且负责职责的分派&#xff0c;而且与Spring IoC容器无缝集成&#xff0c;从而可以获得Spring的所有好处。 具体请参考第二章的图2-1。 Dispa…

理解本真的REST架构风格

引子 在移动互联网、云计算迅猛发展的今天&#xff0c;作为一名Web开发者&#xff0c;如果您还没听说过“REST”这个buzzword&#xff0c;显然已经落伍了。夸张点说&#xff0c;甚至“出了门都不好意思跟别人打招呼”。尽管如此&#xff0c;对于REST这个泊来品的理解&#xff0…

JavaSE基础21笔记IO流

22.01_IO流(序列流)(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方式 整合两个: SequenceInputStream(InputStream, InputStream) FileInputStream fis1 n…

深入浅出REST

不知你是否意识到&#xff0c;围绕着什么才是实现异构的应用到应用通信的“正确”方式&#xff0c;一场争论正进行的如火如荼&#xff1a;虽然当前主流的方式明显地集中在基于SOAP、WSDL和WS-*规范的Web Services领域&#xff0c;但也有少数人用细小但洪亮的声音主张说更好的方…

TeamViewer和Configure Virtual Serial Port Driver进行远程桌面控制

TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制&#xff0c;桌面共享和文件传输的简单且快速的解决方案。为了连接到另一台计算机&#xff0c;只需要在两台计算机上同时运行 TeamViewer 即可&#xff0c;而不需要进行安装&#xff08;也可以选择安装&#xff0c;安…
最新文章