@cxm-2016
2016-12-27T07:15:31.000000Z
字数 3854
阅读 2914
Web
版本:1
作者:陈小默
声明:禁止商用,禁止转载
EL表达式的全程是Expression Language
最初出现的目的是为了替换JSP脚本表达式。其主要的作用有:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>index</title></head><body>${"hello world"}${1024}${true}</body></html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>index</title></head><%pageContext.setAttribute("key", 1, PageContext.PAGE_SCOPE);pageContext.setAttribute("key", 2, PageContext.REQUEST_SCOPE);pageContext.setAttribute("key", 3, PageContext.SESSION_SCOPE);pageContext.setAttribute("key", 4, PageContext.APPLICATION_SCOPE);%><body>${key}</body></html>
对于上面的示例,我们向四个作用域中都存放了一个名为Key的属性。此时,程序运行后的结果将会是1。因为EL在搜寻值的过程中会优先查找最小的域,如果没有再向范围更大的域中查找。
作用范围:page < request < session < application
<%String[] names = {"Jack", "Sam", "Sun", "Sheldon", "Raj"};pageContext.setAttribute("names", names);%>${names[3]}
<%ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");pageContext.setAttribute("list", list);%>${list[2]}
<%HashMap<String,Object> user = new HashMap<>();user.put("name","jack");user.put("age",19);user.put("male",true);pageContext.setAttribute("user", user);%><body>name:${user["name"]}<br>age:${user.age}<br><%pageContext.setAttribute("name", "male");%>male:${user[name]}
如果我们在[]中输入的是使用""引用的字符串,那么EL就会将这个字符串直接当做key来查询数据。如果[]中传入的是变量,那么它会先从这个变量中获取字符串,然后再将这个字符串当做key去获取值。
${user["name"]}等同于${user.name}。而${user[name]}等同于${user["${name}"]}
JavaBean是一个遵循特定写法的Java类:
getter/setter方法。JavaBean在Java开发中通常用于数据封装。
<%!public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}%><%Person user = new Person("Jack",21);pageContext.setAttribute("user", user);%>${user.name} <%-- ${user.name}=> user.getName()--%>
通常我们使用如下方式来在程序中替代直接使用应用名
${pageContext.request.contextPath}
${1+2}
如果有非数字参与运算,EL会先将非数字转换为数字再进行运算。转换失败时会抛出异常。
所以下面的示例是可以运行的。
${1+"3.1415926"}
下面的例子将会抛出异常
${1+"0x12345"}
${1+2!=3}
在JSP中如果直接使用<、>等符号可能会产生歧义,那么我们可以使用以下符号进行替换
> : gt< : lt>= : ge<= : le! : ne= : eq那么上面的例子可以改成
${1+2 ne 3}
&& : and|| : or! : not
${not(true and (3 lt 2))}
${10 lt 9 ? "A":"B"}
用于判断一个对象 是否为NULL,或字符串或集合中 是否没有任何内容
${empty("")}
得到的结果是true
EL中内置了11个对象:
Map<String,String[]>Map<Stirng,String[]>Map<Stirng,Cookie>EL表达式语法允许自定义函数,以调用Java类的方法。但是只能调用Java的静态方法,并且必须在TLD文件中进行描述。
使用方法流程如下:
在任意的Java文件中声明一个公共静态方法
public class DateUtil {public static String getDate() {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return format.format(new Date());}}
在WEB-INF文件夹下创建一个tld文件,并在文件中对方法进行描述
<?xml version="1.0" encoding="utf-8"?><taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><tlib-version>1.0</tlib-version><short-name>DateUtil</short-name><uri>http://tld.smart.com/date</uri><!-- Invoke 'Generate' action to add tags or functions --><function><name>getDate</name><function-class>com.github.cccxm.smart.DateUtil</function-class><function-signature>java.lang.String getDate()</function-signature></function></taglib>
在JSP文件中引入tld文件
<%@ taglib uri="http://tld.smart.com/date" prefix="util" %>
使用EL表达式
${util:getDate()}