零. 概述
EL 全名为Expression Language。EL主要作用:
1. 获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2. 执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3. 获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4. 调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
一. 获取数据
格式:${expression}
EL表达式语句在执行时,会调用pageContext.findAttribute()方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回“”,EL把null值直接以空字符串进行显示,避免了运算时发生错误而抛出异常
1..获取bean的属性
<%
User u = new User();
u.setAge(20);
request.setAttribute("person",u);
%>
年龄:${person.age}
2..获取数组或列表元素
<%
List userlist = new ArrayList();
User u = new User();
u.setAge(20);
userlist.add(u);
request.setAttribute("userlist", userlist);
%>
年龄:${userlist[0].age}
3..获取map中元素(两种方式均可)
<%
Map<String,String> map = new HashMap<String,String>();
map.put("user","nic");
map.put("role", "admin");
request.setAttribute("login", map);
%>
USER: ${login.user} <br>
ROLE: ${login["role"]}
大多数情况下.运算符和[]运算符是通用的,以下情况之内用[]:
1)包含特殊字符
${user[first-name]}
2)通过变量动态取值
${user[param]}
二. 执行运算
包括算术运算,逻辑运算和关系运算等
三. 获取web开发常用对象
EL提供了11个隐式对象,其中除了pageContext隐式对象对应pageContext外,其他隐式对象都是对应其Map类型。使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
- pageContext隐式对象 : 对应于JSP页面中的pageContext对象,其本身就是一个Javabean,只要是getXxx()方法,就可以用
${pageContext.xxx}
获取到 - initParam隐式对象 : 表示一个保存了所有web应用初始化参数的map对象,可以取得web.xml中设置的ServletContext初始参数,即
<context-param>
中设置的初始参数,例如${initParam.initCount}
相当于<%=servletContext.getInitParameter("initCount") %>
- cookie隐式对象 :可通过
${cookie.cookiename}
获取cookie中对应的值 - 属性范围相关隐式对象 : pageScope , requestScope , sessionScope , applicationScope分别对应Jsp隐式对象 pageContext , request , session , application的setAttribute()方法所设置的属性对象,如果不对作用范围进行指定,则默认按照page、request、session、application的顺序进行查找。需要注意的式,EL表达式中的这个四个对象,仅仅代表作用范围,并不等同于Jsp中的四个对象
- 请求参数相关隐式对象 : 例如
${param.user}
相当于<%=request.getParameter("user") %>
, 而 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[],所以往往通过下标指定具体的参数 - 标头相关隐式对象: 如果要获取用户请求的表头数据,可以通过 header 或 headerValues 隐式对象 , 例如
${header["User-Agent"]}
相当于<%=request.getHeader("User-Agent")%>
,headerValues 则对应 getHeaders() 方法
四. 调用Java方法
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。
例如:定义一个求集合大小的函数,在Jsp页面中调用
step1.. 在一个public类中完成这个静态方法:
package util;
public class Util {
public static String sayHello(String name){
return "Hello " + name;
}
}
step2.. 提供tld描述文件,此文件可以放到WEB-INF下或其目录下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>EL Function</short-name>
<!--对应引用处的uri,可以随便写-->
<uri>/ELfunction</uri>
<function>
<description>打印hello+姓名</description>
<!--子元素用于指定EL自定义函数的名称-->
<name>sayHello</name>
<!--子元素用于指定完整的Java类名-->
<function-class>util.Util</function-class>
<!--子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。-->
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
</taglib>
step3..在jsp页面中使用taglib引入函数库
<%@ taglib prefix="util" uri="/ELfunction" %>
step4..以${prefix:method(params)}
的格式使用该函数
${util:sayHello("nic")}