[关闭]
@cxm-2016 2016-12-27T15:15:31.000000Z 字数 3854 阅读 2412

Java Web (六)——EL表达式

Web

版本:1
作者:陈小默
声明:禁止商用,禁止转载


EL表达式

EL表达式的全程是Expression Language

最初出现的目的是为了替换JSP脚本表达式。其主要的作用有:

获取数据

获取常量数据

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>index</title>
  5. </head>
  6. <body>
  7. ${"hello world"}
  8. ${1024}
  9. ${true}
  10. </body>
  11. </html>

获取域中的数据

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>index</title>
  5. </head>
  6. <%
  7. pageContext.setAttribute("key", 1, PageContext.PAGE_SCOPE);
  8. pageContext.setAttribute("key", 2, PageContext.REQUEST_SCOPE);
  9. pageContext.setAttribute("key", 3, PageContext.SESSION_SCOPE);
  10. pageContext.setAttribute("key", 4, PageContext.APPLICATION_SCOPE);
  11. %>
  12. <body>
  13. ${key}
  14. </body>
  15. </html>

对于上面的示例,我们向四个作用域中都存放了一个名为Key的属性。此时,程序运行后的结果将会是1。因为EL在搜寻值的过程中会优先查找最小的域,如果没有再向范围更大的域中查找。

作用范围:page < request < session < application

获取数组数据

  1. <%
  2. String[] names = {"Jack", "Sam", "Sun", "Sheldon", "Raj"};
  3. pageContext.setAttribute("names", names);
  4. %>
  5. ${names[3]}

获取集合中的数据

  1. <%
  2. ArrayList<String> list = new ArrayList<>();
  3. list.add("A");
  4. list.add("B");
  5. list.add("C");
  6. pageContext.setAttribute("list", list);
  7. %>
  8. ${list[2]}

获取Map中的数据

  1. <%
  2. HashMap<String,Object> user = new HashMap<>();
  3. user.put("name","jack");
  4. user.put("age",19);
  5. user.put("male",true);
  6. pageContext.setAttribute("user", user);
  7. %>
  8. <body>
  9. name:${user["name"]}<br>
  10. age:${user.age}<br>
  11. <%
  12. pageContext.setAttribute("name", "male");
  13. %>
  14. male:${user[name]}

如果我们在[]中输入的是使用""引用的字符串,那么EL就会将这个字符串直接当做key来查询数据。如果[]中传入的是变量,那么它会先从这个变量中获取字符串,然后再将这个字符串当做key去获取值。

${user["name"]}等同于${user.name}。而${user[name]}等同于${user["${name}"]}

获取JavaBean的属性

JavaBean是一个遵循特定写法的Java类:

JavaBean在Java开发中通常用于数据封装。

  1. <%!
  2. public class Person {
  3. private String name;
  4. private int age;
  5. public Person() {
  6. }
  7. public Person(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. }
  24. %>
  25. <%
  26. Person user = new Person("Jack",21);
  27. pageContext.setAttribute("user", user);
  28. %>
  29. ${user.name} <%-- ${user.name}=> user.getName()--%>

通常我们使用如下方式来在程序中替代直接使用应用名

  1. ${pageContext.request.contextPath}

执行运算

算术运算

  1. ${1+2}

如果有非数字参与运算,EL会先将非数字转换为数字再进行运算。转换失败时会抛出异常。

所以下面的示例是可以运行的。

  1. ${1+"3.1415926"}

下面的例子将会抛出异常

  1. ${1+"0x12345"}

比较运算

  1. ${1+2!=3}

在JSP中如果直接使用<>等符号可能会产生歧义,那么我们可以使用以下符号进行替换

那么上面的例子可以改成

  1. ${1+2 ne 3}

逻辑运算

  1. ${not(true and (3 lt 2))}

三元运算

  1. ${10 lt 9 ? "A":"B"}

empty运算

用于判断一个对象 是否为NULL,或字符串或集合中 是否没有任何内容

  1. ${empty("")}

得到的结果是true

常用开发对象

EL中内置了11个对象:

调用Java方法

EL表达式语法允许自定义函数,以调用Java类的方法。但是只能调用Java的静态方法,并且必须在TLD文件中进行描述。

使用方法流程如下:

在任意的Java文件中声明一个公共静态方法

  1. public class DateUtil {
  2. public static String getDate() {
  3. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4. return format.format(new Date());
  5. }
  6. }

在WEB-INF文件夹下创建一个tld文件,并在文件中对方法进行描述

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  5. version="2.1">
  6. <tlib-version>1.0</tlib-version>
  7. <short-name>DateUtil</short-name>
  8. <uri>http://tld.smart.com/date</uri>
  9. <!-- Invoke 'Generate' action to add tags or functions -->
  10. <function>
  11. <name>getDate</name>
  12. <function-class>com.github.cccxm.smart.DateUtil</function-class>
  13. <function-signature>java.lang.String getDate()</function-signature>
  14. </function>
  15. </taglib>

在JSP文件中引入tld文件

  1. <%@ taglib uri="http://tld.smart.com/date" prefix="util" %>

使用EL表达式

  1. ${util:getDate()}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注