@cxm-2016
2016-12-27T15:15:31.000000Z
字数 3854
阅读 2405
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()}