• Java Web----EL(表达式语言)详解


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

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

    一、EL概述

    1、EL简介

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

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


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

              ${username}

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

              ${expression}

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

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

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

    EL有以下几个特点:

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

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

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

           1)、使用斜杠””

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

           2)、使用page指令

           使用JSPpage指令也可以禁用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>
    


    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)、获取数组元素(只能使用[],不能用.)

    <%
    
           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 ? “”: “错“}

    三、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个用于访问作用域范围的隐含对象,即pageScoperequestScopesessionScopeapplicationScope。应用这4个隐含对喜爱那个指定要查找的标识符的作用域后,系统将不再按照默认的顺序(pagerequestsessionapplication)来查找相应的标识符。他们与JSP中的pagerequestsessionapplication内置对象类似。只不过这4个隐含对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。

           1)、pageScope隐含对象

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

    新建JavaBeanUserInfo

    package com;
    
    public class UserInfo {
    
           private String name ="";
    
           public void setName(Stringname) {
    
                  this.name = name;
    
           }
    
           public String getName() {
    
                  return name;
    
           }
    
    }

    Index.jsp添加:

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


           2)、requestScope隐含对象

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

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


           3)、sessionScope隐含对象

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

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


           4)、applicationScope隐含对象

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

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


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

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

           1)、param对象

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

    <formaction="" method="get" name="form1"  >
    
           <input name="user" type="text"value="小武灵灵">
    
           <input type="submit">
    
    </form>
    
    ${param.user}
    


           2)、paramValues对象

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

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


           3)、headerheaderValues对象

           用于获取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。例如:

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


    四、定义和使用EL函数

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

  • 相关阅读:
    内置对象,监听器,过滤器
    20169201 使用Metaspoit攻击MS08-067实验
    20169201 2016-2017-2《网络攻防》课程总结
    20169201 2016-2017-2 《网络攻防》第十四周作业
    20169201 2016-2017-2 《网络攻防实践》第11周学习总结
    20169201 2016-2017-2 《移动平台开发实践》第10周学习总结
    20169201 2016-2017-2 《网络攻防实践》第10周学习总结
    20169201 实验三 敏捷开发与XP实践报告
    20169201 2016-2017-2 《网络攻防实践》 实验二
    20169201 2016-2017-2 实验一 网络攻防实验环境的搭建与测试
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3260622.html
Copyright © 2020-2023  润新知