EL表达式
什么是EL表达式
EL,Expression Language,表达式语言,是一种在JSP页面中获取数据的简单方式,通过${变量名}的方式可以获取到值,需要注意的是EL只能从 pageConext、request、session、application 四大域属性空间中获取数据。
使用EL表达式获取数据
下面不能成功取值
<% int sum = 88; %> <!-- 该值取不出来,因为没有放在四大域属性空间中 --> ${sum }
可以将这个值存放到四大域属性空间中的任意一个中。然后访问其存放时的 key即可。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "henu"); request.setAttribute("name", "henu"); session.setAttribute("name", "henu"); application.setAttribute("name", "henu"); %> EL表达式获取的值: ${name} </body> </html>
EL底层是从最小范围的pageContext依次查找,直到查找到最大范围 application。这期间,只要查找到了,则直接获取,不再去后面的范围中查找了,若最终没有查找到,则什么也不输出。因此这里输出的结果是先从pageContext空间域取出的。
从指定域中获取数据
从 pageContext 依次查找到 application 域空间,会降低执行效率。若属性确定存放在某个域空间时,则可指定直接从该空间中查找。此时需要借助 EL 的四个域属性空间相关的内置对象。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("name", "pageContext"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> EL表达式获取的值:<br> ${pageScope.name}<br> ${requestScope.name}<br> ${sessionScope.name}<br> ${applicationScope.name} </body> </html>
访问 Bean 的属性
EL 可以通过 ${key .属性}的方式获取到指定对象的属性值。其底层实际调用的是该对象的相应属性的 get 方法。也可以使用${key[“属性”]的方式获取。该方式不常用。
创建一个Student类,该类在scm包下。(这里有一个注意点稍后提及)
package scm; public class Student { private String name; private int age; public Student() {} public Student(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; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="scm.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Student stu = new Student("张三", 22); request.setAttribute("stu", stu); %> 获取bean对象中属性的两种方法: ${requestScope.stu.name} ${requestScope.stu["name"] } </body> </html>
在JSP中我们声明了Student对象,并向request域中传递。然后使用EL表达式接收bean对象传来的参数。
访问JSP页面输出结果:
获取bean对象中属性的两种方法: 张三 张三
在上边我们说到一个注意点:细心的会看到在JSP页面中,我们导入了scm包,我们声明Student对象时一定要导包(血淋淋的教训),或者会抛出异常。
若要访问一个对象的域属性的值,则可多次使用点号运算符,依次取出相应的属性值。
创建一个School类,同样在scm包下,Student类同上即可。(注意导包)
package scm; public class School { private String schoolName; private Student student; public School() {} public School(String schoolName,Student student) { this.schoolName = schoolName; this.student = student; } public String getSchoolName() { return schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } }
编写JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="scm.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Student st = new Student("李四",21); School s = new School("河南大学",st); request.setAttribute("s",s); %> ${requestScope.s.schoolName} ${requestScope.s.student.name} ${requestScope.s.student.age} </body> </html>
访问JSP页面输出结果:河南大学 李四 21
获取数组中的元素
EL 可以通过 ${key[索引]} 的方式获取到指定索引的元素。不过,需要注意的是,若数组中不存在该指定索引的元素,系统并不会抛出数组越界异常。
<% String[] names = {"张三","李四","王五","赵六"}; request.setAttribute("names", names); %> <!-- 输出李四 --> ${names[1] } <!-- 没有输出也不会报错 --> ${names[50] }
获取 List 中的元素
与获取数组中的元素相同,通过 ${key[索引]} 的方式可以获取 List 中指定索引的元素。若 List 中不存在该指定索引的元素,系统并不会抛出越界异常。
创建List集合并存入Student对象(Student类同上),导入scm和java.util.*包。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.* "%> <%@ page import="scm.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% List<Student> stList = new ArrayList(); stList.add(new Student("张三",20)); stList.add(new Student("李四",21)); stList.add(new Student("王五",22)); request.setAttribute("stList", stList); %> <!-- 输出李四 21 --> ${stList[1].name } ${stList[1].age} <!-- 没有输出也不会报错 --> ${stList[50].name} ${stList[50].age} </body> </html>
EL 无法输出 Set 集合中的元素。因为 Set 集合中的元素是无序的,即没有索引的概念,所以无法通过索引获取元素。
获取 Map 中的元素
EL 通过 ${attributeName.mapKey} 的方式可以获取指定 Map 的指定 key 的值。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.* "%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% Map<String,String> map = new HashMap(); map.put("name", "张三"); map.put("age", "30"); request.setAttribute("map", map); %> <!-- 根据Map的键获取值 --> ${map.name} ${map.age} </body> </html>