1.EL表达式介绍
- EL(Expression Language ),表达式语言。是一种在JSP页面中 获取数据的简单方式。EL表达式的基本语法很简单:在JSP页面的任何静态部分均可以通过 ${experssion} 的形式获取指定表达式的值。
- EL表达式只能处理四大域中的属性值以及常量
2. EL表达式获取数据方式
- EL只能从四大域中获取数据。 其查找顺序是:依此按照由小到大的范围从四大域名中查找指定名称的属性值。
- 四大域名的范围大小:application>session>request>pageContext
- 注意:在Servlet中只有三个作用域,没有pageContext作用域。
<% String username = "今天天气不错"; %> username = ${username } <br> <%--获取不到这个username属性值--%> <% String username = "今天天气不错"; pageContext.setAttribute("username",username); request.setAttribute("username",username); %> username = ${username }<br> <%--输出结果:username=--%> <% pageContext.setAttribute("username","北京"); request.setAttribute("username","上海"); session.serAttribute("username","重庆"); application.setAttribute("username","武汉"); %> username = ${username }<br> <%---输出结果:username=北京--%> 复制代码
3.使用EL表达式提供的作用域别名来获取数据
- JSP中为四大作用域提供了作用域别名
<% pageContext.setAttribute("username","北京"); request.setAttribute("username","上海"); session.serAttribute("username","重庆"); application.setAttribute("username","武汉"); %> username = ${pageScope.username}<br> <%---输出结果:username=北京--%> username = ${sessionScope.username}<br> <%--输出结果:username=重庆--%> 复制代码
4.获取对象的属性值
- 定义一个student类,在JSP文件中使用EL表达式来获取student的属性
注意:EL表达式中的这个属性并不是student类中的成员变量名,而是getName()、getAge()去掉get以及括号将Age改为小写age,这个才是EL表达式的属性值,一般情况下属性值等于student类中的成员变量名,但是boolean类型的属性值和成员变量的不相等的。boolean类型的成员变量的获取成员变量的方式是isSex(),所以对应的EL表达式的属性值是sex。
<body> <% Student student = new Student("张三",23); pageConntext.setAttribute("student",student); %> student = ${student} <%--可以获取到student的信息(重写了toString()方法)--%> <%--EL表达式属性值要和student类中的属性相对应--%> name = ${student.name} <%--获取到student对象的name值--%> age = ${student.age} <%--获取到student对象的name值--%> name = ${student['name']} <%--获取到student对象的name值--%> age = ${student['age']} <%--获取到student对象的name值--%> </body> 复制代码
5.几种特殊的属性值
- 当一个类不存在的时候,要获取这个类中属性。此时不会抛出空指针异常,其仅仅是不显示而已。
name = ${student1.name} <%--此时的输出结果是:name= --%> 复制代码
- 当student类中声明了一个school类的时候,要获取到school类中的属性值,此时使用多次点的方式。
school = ${student.school.sname} <%-- 此时获取到的是student类中调用的school类中的snames属性值--> 复制代码
6. EL访问数组(Array)
- 访问普通的数组
<% String[] name = new String[]{"李四","张三","王五"}; pageContext.setAttribute("names",name); %> name[1] = ${names[1]} <%--取出的数据为:张三--%> <%--若访问的数组元素的下标超过了数组下标最大值,EL不会输出下标越界异常--%> name[5] = ${name[5]} 复制代码
- 访问对象数组
<% Student[] students = new Student[2]; students[0] = new Student("张三",20); student[1] = new Student("李四",30); pageContext.setAttribute("students",students); %> student[0].name = ${student[0].name} <%--输出的结果为:张三--%> student[1].age = ${student[1].age} <%--输出的结果为:30--%> 复制代码
7. EL访问集合(List)
- EL表达式可以通过索引访问List集合,但无法访问Set。因为Set中不存在索引。
<% List<Sting> names = new ArrayList<>(); names.add("张三"); names.add("李四"); names.add("王五"); pageContext.setAttribute("names",names); %> <%--第一个输出结果为王五,和上边一样,不会报下标越界异常--%> name[2] = ${name[2]} name[200] = ${name[200]} 复制代码
8. EL访问Map集合(map)
- Map中可以使用key来获取到values值
<% // map集合中存储的是Object类型。可以存储任意类型 Map<String,Object> map = new HashMap<>(); map.put("student",new Student("张三",age)); map.put("mobile","123456"); map.put("age",20); pageContext.setAttribute("map",map); %> <%--这里发生了一个类型的向下转型,将Object类型转换为student类型--%> student.name = ${mpa.student.name} mobile = ${map.mobile} age = ${map.age} 复制代码
9.EL表达式中的运算符
- EL表达式支持的运算符
- 除了上述运算符之外,非常重要的运算符 empty,这个运算符用于判断变量值是否为空,其用法为${empty 变量},如果变量为空则返回true
- 若变量为定义,返回值是 true
- 若变量为String类型,且其值为空串,则返回 true
- 若变量为引用和类型,且其值为null,则返回 true
- 若变量为集合类型,且不包含任何元素,则返回true
10. EL内置对象
- 就像JSP一样代码以及表达式中可以使用九个内置对象一样,EL表达式中,同样也存在内置对象,并且存在11个内置对象。
10.1 pageContext内置对象
- 该pageComtext与JSP内置对象中的pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。 注意:这些对象不是EL中的内置对象。这些对象只能pageContext获取。
- 在EL表达式中可以通过 ${pageContext.request}获取request对象。 其底层实际调用的pageContext.getRequest()方法。同理,也可以通过类似的方式获取到其他对象。
- 在这些获取的对象中,有一个是实际工程中最常用的: ${pageContext.request.contextPath},用于获取当前项目的发布到服务器的名称。一般用在JSP页面的路径前。
- ${pageContext.reuquest.contextPath}代表是的当前的项目,registerServler代表的是将该JSP文件中的数据提交到的位置文件。
- 注意:EL表达式只能用于JSP文件。
- 在EL表达式的11个内置对象中,除了pageContext外,其他10个内置对象,其类型均为java.util.Map类型
10.2 EL表达式中与参数相关的内置对象
10.2.1 param对象
- ${param.属性值}:底层调用的是 request.getParameter()方法,这个方法获取到的是一个属性对应的一个值。
- param对象用来获取请求信息中的参数信息。
- 使用form提交表单可以将请求参数传递到任何的文件(Java、JSP都可以)
<%--提交界面--%> <body> <form action=""${pageContext.request.contextPath}/show.jsp" method="get"> 姓名:<input type="text" name="name"/><br> 年龄:<input type="text" name="age"/><br> <input type="submit" value="注册"/> </form> </body> 复制代码
- 在提交界面中给定请求参数的属性值
<%--获取请求参数界面,获取请求中的指定参数值,其底层实际调用的是request.getParameter--%> name = ${param.name}<br> age = ${param.age}<br> 复制代码
- 在结果界面(show.jsp)中显示获取到的请求参数值
10.2.1 paramValues对象
- ${paramValue.属性值}:这个属性底层调用的是 req.getParameterValues(),这个方法获取到的属性的属性值有多个,获取到的是一个结果的集合。
11. EL表达式不支持对字符串的处理
${"ab" + "c"} <%--会报错--%> 复制代码
12. EL表达式总结
- EL不能出现在Java代码块、表达式块等JSP动态部分。
- EL只能从pageContext、request、session、application四大域属性空间中获取数据。
- EL表达式只能获取数据,不可以修改数据。
- EL表达式不会抛出空指针异常,若访问一个null对象的属性,则什么也不显示。
- EL不会抛出数组下标越界已异常,若访问一个数组中的不存在的元素,则什么也不显示。
- EL不具备对字符串进行处理的能力,旧连简单的字符串拼接都不可以(此时需要使用JSTL中提供的标准标签中的方法来处理字符串。)