浅谈EL

 

一、了解EL


  1、EL是从 JavaScript 脚本语言得到启发的一种表达式语言,它借鉴了 JavaScript 多类型转换无关性的特点。在使用 ELscope 中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。 Web 服务器对于 request 请求参数通常会以 String 类型来发送,在得到时使用的 Java 语言脚本就应该是 request.getParameter(“XXX”) ,这样的话,对于实际应用还必须进行强制类型转换。而 EL 就将用户从这种类型转换的繁琐工作脱离出来,允许用户直接使用 EL 表达式取得的值,而不用关心它是什么类型。

2、EL的功能:

  • 可以访问jsp中不同域的对象
  • 可以访问JavaBean中的属性
  • 可以访问集合元素
  • 可以支持简单操作符运算

二、EL变量


   

   1、EL存取变量数据的方法很简单,例如:${goodsList}。它的意思是取出某一范围中名称为username的变量。  因为我们并没有指定哪一个范围的goodsList,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到goodsList,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。假如goodsList是一个集合对象,则该集合中的对象的属性可以通过点或者[]获取其属性值。例如该集合存放的是goods对象,而goods对象中有name 和id属性。用jstl标签forEach

获取集合对象时:<c:forEach items="${goodsList}" var = "goods">, 则可以通过${goods.id},${goods.name}来获取属性值。通过该方法获取时goods类必须有get方法如果没有就会出现javax.el.PropertyNotFoundException: Property 'goodPhoto' not found on type java.lang.String错误,具体参考该博文

    EL的表达式:${expression}  例如:${param.name} 它等同于 <%=request.getParameter("name") %>   

 2、EL的变量。

 ①EL的隐式变量包括pageScope,requestScope,sessionScope,applicationScope,任何再起作用与范围内的JavaBean的实例都可以当作EL来表达。

< %
    request.setAttribute("age",20) ;
    session.setAttribute("name","yang");
%>
//调用其变量
${requestScope.age}
${sessionScope.age}

②隐含变量param、paramValues,param是取得某一个参数,paramValues失去的某个参数的集合(即为表单中数个控件的name值相同,传过来的是一个参数数组)。例如:表单传过3个参数名同为firstName的参数分别为yang,wang,li。当参数传过来以后存储在paramValue数组中可以通过 ${paramValue.firstName[1] } 获得姓氏为wang的参数。简单演示如下

<html> 
 <body> 
      <form action="name.jsp"> 
        <input type="text" name="firstName" value="yang"> 
        <input type="text" name="firstName" value="wang"> 
        <input type="text" name="firstName" value="li"> 
        <input type="text" name="secondName" value="bo"> 
        <input type="submit" value="Submit"> 
  <!--获取相应参数的方法
    ${paramValue.firstName[1] }
    ${param.secondName }
  -->
</form> </body> </html>

③其他变量。诸如header,headerValue,cookie,initParam,pageContext等使用与上边两种相同

    注意:除过pageContext其与变量都是映射值

三、EL ( .)与[]使用

1、(.)的使用

 (.)的左边必须是一个映射值也可以是一个bean得性质(如果第一个变量是javabean的属性)。点号右边必须符合命名规则必须以字母、_或$开头,如上边给出的代码映射键均可以通过点号获取其映射值。只有当左边是映射键或者bean属性时才可以用点号,另一种el的使用方式将更加灵活。

2、[]能让你有更多的选择,比如是一个数组,list,或map的一个值(其键对应的值可能不符合命名规则此时只能用该形式)。下面将展示几种[]的用法以及所要注意的点

①对数组使用[]

    

      <%
           String name[] = {yang, wang, li, han};
           request.setAttribute("name", name);
       %>
       第一个姓氏为:${name }       <!-- 返回一个Stirng数组的toString值 -->
       第一个姓氏为:${name[0] }      <!-- 其值为yang -->
       第一个姓氏为:${name["0"] }    <!-- 同样显示值为yang -->

你可能会问为什么一个加引号一个不加引号为什么会得出相同的值?

  原因在于List和String中的索引会强制转化为int

②对于bean和数组点号和[]都可以使用

③当[]中没有引号时即不是String直接量时会进行计算,搜索与该名字绑定的属性,并替换为该属性的值。下面来一一小段代码进行演示

   <%
           HashMap name =  new HashMap();
           name.put("zhang", "san");
           name.put("li", "si");
           name.put("wang", "mazi");
           request.setAttribute("name", name);
           request.setAttribute("li", "zhang");  
   %>    
           姓李的人为: ${name["li"] } <!-- 获得值为si -->
           姓李的人为: ${name[li] }   <!-- 获得的值为san -->
           <!-- 第二个参数li没有引号,则搜索与该值绑定的属性的值,与其绑定的值为zhang,故zhang会替换li,所以最终获得的值为san -->

注意:el中都是表达式,可以是嵌套表达式,深度不限。可以将一个复杂表达式放在另外一个复杂表达式

四、禁用EL

 


 

   EL是在JSP2.0以后才有的新特性,因此将JSP版本设置为较低时(Servlet2.3或者更早)其将不再支持EL标签

  在单个页面禁用使用如下命令

  

<%@page isELIgnoreD = "true" %>

 

posted @ 2017-03-17 22:02  短腿的兔子跑得快  阅读(394)  评论(0编辑  收藏  举报