EL 全名为Expression Language。EL主要作用:
补充说明:EL表达式中$不能嵌套,只需要在最{}外面使用一个$即可。
使用EL表达式获取数据语法: ${标识符}
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找对应的对象,找到返回响应的对象,找不到则返回“”(注意是空字符串,不是null)
EL表达式也可以很轻松的获取JavaBean的属性,获取数组、Colleciton、Map的数据。
结合JSTL的foreach标签,使用EL表达式可以很轻松的迭代各种类型的数组或集合。
如何使用JSTL核心标签:
首先需要导入JSTL的jar包,访问https://tomcat.apache.org/download-taglibs.cgi 下载如下3个Jar包,导入到JaveWeb工程中:
Impl:taglibs-standard-impl-1.2.5.jar (pgp, sha512)
Spec:taglibs-standard-spec-1.2.5.jar (pgp, sha512)
EL:taglibs-standard-jstlel-1.2.5.jar (pgp, sha512)
在JSP中引用核心标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
uri的地址可以在taglibs-standard-impl-1.2.5.jar中的c.tld的uri标签中获取,所有的核心标签也在此文件中标注说明。
举例:
package javabean; public class Person { private String name; private int personAge; private Address address; public Person() { } public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return personAge; } public void setAge(int personAge) { this.personAge = personAge; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
package javabean; public class Address { private String city; public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
<%@ page import="javabean.Person" %> <%@ page import="javabean.Address" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>EL表达式获取数据</title> </head> <body> <b>获取字符串:</b><br> <% request.setAttribute("data", "requestDate"); %> data=${data}<br> <hr> <% Person p = new Person(); p.setName("zhangsan"); p.setAge(18); Address address = new Address(); address.setCity("beijing"); p.setAddress(address); request.setAttribute("person", p); %> <b>获取JavaBean的属性:</b><br> name = ${person.name}<br> age = ${person.age}<br> <!--可以看到这个是根据getAge方法进行匹配的,属性名是personAge --> address = ${person.address.city} <hr> <% List<Person> personList = new ArrayList<>(); Person p1 = new Person("zhangsan"); Person p2 = new Person("lisi"); personList.add(p1); personList.add(p2); request.setAttribute("personList", personList); %> <b>获取List中的数据:</b><br> person1 name = ${personList[0].name}<br> person2 name = ${personList[1].name}<br> <hr> <b>遍历List中的数据:</b><br> <c:forEach var="p" items="${personList}"> name=${p.name}<br> </c:forEach> <hr> <% Map<String, String> map = new HashMap<>(); map.put("aaa", "aaa"); map.put("bbb", "bbb"); map.put("111", "111"); request.setAttribute("map", map); %> <b>获取Map中的数据:</b><br> ${map.aaa}<br> ${map.bbb}<br> ${map["111"]} <!-- 数字不能使点号获取,需要使用[]获取。如果出现不能用点号获取数据的情况,可使用[]获取 --> <hr> <b>遍历Map中的数据:</b><br> <c:forEach var="entry" items="${map}" > ${entry.key} = ${entry.value}<br> </c:forEach> </body> </html>
运行结果:
语法:${运算表达式},EL支持如下运算符:
举例:
<%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>运算符</title> </head> <body> <% request.setAttribute("username","aaa"); request.setAttribute("password","124"); %> ${username==‘aaa‘ && password==‘123‘ } <br/>----------------empty运算符-------------------------<br/> <% request.setAttribute("list1",null); request.setAttribute("list2",new ArrayList()); %> ${empty(list1)}<br> ${empty(list2)} <br/>----------------二元运算符-------------------------<br/> ${user!=null ? user.username : ‘‘ } <br/>----------------二元运算符(数据回显)-------------------------<br/> <% request.setAttribute("gender","male"); %> <input type="radio" name="gender" value="male" ${gender==‘male‘?‘checked‘:‘‘ }>男 <input type="radio" name="gender" vlaue="female" ${gender==‘female‘?‘checked‘:‘‘ }>女 </body> </html>
运行结果:
EL表达式中定义了11个隐含对象,使用这些隐含对象可以很方便的获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称}
隐含对象的名称| | 描述 |
pageContext | JSP页面中的pageContext对象 |
pageScope | 代表page域中用于保存属性的Map对象 |
requestScope | 代表request域中用于保存属性的Map对象 |
sessionScope | 代表sessionScope域中用于保存属性的Map对象 |
applicationScope | 代表applicationScope域中用于保存属性的Map对象 |
param | 表示一个保存了所有请求参数的Map对象 |
paramValues | 表示一个保存了所有请求参数的Map对象,它对每个请求参数返回的是一个String[] |
header | 表示一个保存了所有请求头字段的Map对象 |
headerValues | 表示一个保存了所有请求头字段的Map对象,对每个请求头字段返回一个String[]。如果头面有"-",例如Accept-Encoding,这要使用headerValues["Accept-Encoding"] |
cookie | 表示保存了所有cookie的Map对象 |
initParam | 表示一个保存了所有web应用初始化参数的map对象 |
举例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>EL隐式对象</title> </head> <body> ${pageContext} <br/>----------------使用el隐式对象访问指定的域-------------------------<br/> <% pageContext.setAttribute("aa","11"); request.setAttribute("bb", "22"); session.setAttribute("cc", "33"); application.setAttribute("dd", "44"); %> ${pageScope.aa} ${requestScope.bb} ${sessionScope.cc} ${applicationScope.dd} <br/>----------------获取保存了所有请求参数的Map对象-------------------------<br/> ${param.name} 可以用于数据回显(使用reque跳转),分页的参数传递等<br> ${paramValues} ${paramValues.name[0]} ${paramValues.name[1]} <br/>----------------获取请求头-------------------------<br/> ${header.connection} ${header[‘Accept-Language‘] }<br> ${headerValues} <br/>---------------获取cookie-------------------------<br/> ${cookie.JSESSIONID.name }<br/> ${cookie.JSESSIONID.value }<br> <br/>---------------获取web应用初始化参数---------------<br/> dbType=${initParam.dbType } </body> </html>
运行结果:
EL表达式允许开发人员开发自定义函数,以调用Java类的方法。
示例:${prefix: method(params}
在EL表达式中调用的只能是Java类的静态方法
这个Java类的静态方法需要在TLD文件中描述,才可以个被EL表达式调用
EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
一般来说,EL自定义函数开发与应用包括以下三个步骤:
举例:
1. 增加一个类,并实现一个静态方法:
package com.utils; public class StringUtils { public static String addTwoString(String s1, String s2) { return s1 + s2; } }
2. 编写标签库描述符文件(tld),在tld文件中描述自定义函数
可以拷贝taglibs-standard-impl-1.2.5.jar中的fn.tld中的内容,再做适当删减。
<?xml version="1.0" encoding="UTF-8" ?> <taglib 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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>my functions library</description> <display-name>my functions</display-name> <tlib-version>1.1</tlib-version> <short-name>myfn</short-name> <!--定义当前文件的uri,用于在其他jsp中引用:<%@ taglib prefix="myfn" uri="/myELFunction" %> --> <uri>/myELFunction</uri> <!--使用<function>标签定义一个EL自定义函数 --> <function> <description>add two String</description> <name>addTwoString</name> <!-- 方法名称 --> <function-class>com.utils.StringUtils</function-class> <!-- 完整类名 --> <!-- 方法签名,也就是方法声明,必须致命方法的返回值类型以及各个参数的类型,各个参数之间使用逗号分隔 --> <function-signature>java.lang.String addTwoString(java.lang.String,java.lang.String)</function-signature> </function> </taglib>
3. 在JSP页面中导入和使用自定义函数
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="myfn" uri="/myELFunction" %> <html> <head> <title>调用Java方法</title> </head> <body> ${myfn:addTwoString("aaa", "bbb")} </body> </html>
运行结果:
1.4.2 开发EL函数注意事项
编写完标签库描述文件后,需要将它放置到WEB-INF目录中或者WEB-INF目录下的处理classes和lib目录之外的任意子目录中。
TLD文件中的<uri>元素用来指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。
<function>元素用于描述一个EL自定义函数,其中:
原文:https://www.cnblogs.com/songchj-bear/p/11143673.html