EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。


注意:有些Tomcat服务器如不能使用EL表达式

(1)升级成tomcat6

(2)在JSP中加入<%@ page isELIgnored="false" %>


最初出现的目的是用来取代jsp页面中的jsp脚本表达式.但是随着el的发展el的功能已经不限于此了

${el表达式}


(1)获取数据:不能设置值

使用中括号的地方都可以使用点号替代,除了中括号中是数字或者中括号中包含特殊字符(- . )的情况除外

在中括号中如果不用双引号引起来则是变量先找变量的值再拿变量的值使用

如果用双引号则是常量直接使用常量

1获取常量

字符串/数字/布尔类型直接写在el表达式中,el直接进行输出

2获取域中的变量

如果el中写的是一个变量的名,el会调用pageContextfindAttribute方法,在四大作用域中以给定的名字找对应的属性值,找到后进行输出,如果四个域中都找不到,什么都不输出

3获取数组中的数据

4获取集合中的数据

5获取Map中的数据

6获取javabean的属性

  <h1>获取javabean的属性</h1><hr>
  <%
      Person p = new Person();
      p.setName("芙蓉姐姐");
      p.setAge(17);
      pageContext.setAttribute("p",p);
   %>
   ${p.name }${p.age }   //p.getName()  p.getAge()
   <img src="${pageContext.request.contextPath }/1.jpg"/> 
      //pageContext.getRequest().getContextPath()
  
  
  <h1>获取Map中的数据</h1><hr>
  <%
      Map<String,String> map = new HashMap();
      map.put("name","奥巴马");
      map.put("age","17");
      map.put("gender","男");
      map.put("addr","白宫");
      map.put("name.xiao","小黑黑");
      pageContext.setAttribute("map",map);
      pageContext.setAttribute("name","age");
   %>
       ${map"name" }  ${map"addr" }  
       ${map.gender }   ${map.age }  //使用中括号的地方,可以使用点号替代
       ${map"name.xiao" }  //包含特殊字符(- . ),只能用
       ${mapname }  //= ${map“age” },pageContext.findAttribute(name)=”age” 

       
       
  <h1>获取集合中的数据</h1><hr>
  <%
      List<String> list = new ArrayList<String>();
      list.add("甄嬛");
      list.add("安玲荣");
      list.add("凤姐");
      pageContext.setAttribute("L",list);
   %>
      ${L0 }   //中括号中是数字,只能使用
  
 
 
  <h1>获取数组数据</h1><hr>
  <%
      String  names = {"容嬷嬷","紫薇","金锁","小燕子"};
      pageContext.setAttribute("names",names);
   %>
        ${names2} 
  
  
  <h1>获取域中的变量数据</h1><hr>
  <%
      String name = "灭绝师太";
      pageContext.setAttribute("name",name);
  %>
      ${name }
 
 
  <h1>获取常量数据</h1><hr>
      ${"哈哈哈" }  ${199 }  ${true } //字符串/数字/布尔类型,页面直接显示

EL_执行运算_获取常用开发对象

(2)执行运算:

算数运算  +-*/

逻辑运算  && || !   and , or , not

比较运算 == eq  > gt>= ge  < lt   <= le  != ne

三元运算符    10>9? "yes" : "no"

empty运算符   

  <h1>empty 运算符 : 判断一个对象是否为null或字符串是否为空,字符串或集合内容是否为空或域中是否没有任何属性</h1><hr>
  <%
  String str = "";
  pageContext.setAttribute("str",str);
  List list = new ArrayList();
  pageContext.setAttribute("list",list);
   %>
   ${empty str }   //true 字符串为空
   ${empty list}   //true 集合内容为空
   ${empty pageScope }  //false
 
  <h1>三元运算</h1><hr>
${10>9? "yes" : "no" }  
  
  <h1>逻辑运算</h1><hr>
  ${not (3>2 and 1<2 or 10>3) }
  <h1>比较运算</h1><hr>
  ${1 eq 1 } ${3 ge 2 } ${5+3 lt 3 }
  <h1>算术运算:如果有非数字参与算数运算,el表达式会试图将非数字转换为数字后参与运算</h1><hr>
  ${1+1 }
  ${1-2 }
  ${1+"2" }
${1+”a”}  //字符串a 不能转换未数字,服务器报错

 

(3)获取常用开发对象: 

el中内置了11个内置对象,这些对象el内置的,不需要提前定义就可以直接在el中使用 

1*pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象

2*pageScope -- page域中属性组成的Map

*requestScope -- request域中属性组成的Map

*sessionScope -- session域中属性组成的Map

*applicationScope --application域中属性组成的Map

3*param -- 所有请求参数组成的Map<String,String>

paramValues -- 所有请求参数的Map<String,String[]>对象,它对于某个请求参数,返回的是一个string[]

 

4header -- 所有请求头组成的Map<String,String>

headerValues -- 所有请求头组成的Map<String,String[]>

5*cookie -- 所有cookie信息组成的Map<String,Cookie>

6initParam -- 所有web应用的初始化参数组成Map

  <%
  pageContext.setAttribute("name","wang");
  request.setAttribute("name","li");
   %>
  ${requestScope.name}
  ${param.name } ${paramValues.like2 }
    ${header"Accept-Language" }
  ${cookie.JSESSIONID.name }  ${cookie.JSESSIONID.value }
  ${initParam.name2 }

EL_获取常用开发对象_调用java方法

(4)使用EL调用Java方法

    EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。

        示例:${prefix:method(params)}

    在EL表达式中调用的只能是Java类的静态方法。

    这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。

    EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。


调用方法的过程3步骤:

1写一个类其中包含要被el调用的方法,这个方法必须是静态的方法

2写一个tld文件在其中对要被调用的静态方法进行一下描述 (myeclipse导入的schemal地址有问题)

3jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法


    编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。 

    TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。

        <function>元素用于描述一个EL自定义函数,其中:

        <name>子元素用于指定EL自定义函数的名称。

        <function-class>子元素用于指定完整的Java类名,

        <function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。


JSTL中的常用EL函数

    由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。

    这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示:

    在页面中使用JSTL定义的EL函数:

        <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>



不需要大家自己会写调用方法的过程,只要会调用别人写好的标签库就可以了——fn标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
${fn:toUpperCase("asdfasdfKJKJKJdsagHIHidsfgGUGu") }