EL表达式
1、作用
在JSP中取得作用域、请求、标头与Cookie里的值,以及做一些简单的运算或判断。
2、环境
直接编写。
可以使用page指示元素的isELIgnored属性(默认是false),来设置JSP网页是否使用EL。也可以在web.xml中设置<el-ignored>标签为true来决定不使用EL。
<?xml version="1.1" encoding="UTF-8"?> <web-app 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-app_3_0.xsd" version="3.0"> <display-name>Web Application</display-name> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> </web-app>
会这么做的原因可能在于,网页中已含有与EL类似的${}语法功能存在,例如使用了某个模板(Template)框架之类。
3、语法
${param.a + param.b}
EL是使用${与}来包括所要进行处理的表达式,可使用点运算符(.)指定要存取的属性,使用加号(+)运算符进行加法运算。
4、优点
简洁、自动转换类型
5、EL隐式对象
(1)pageContext:对应于PageContext类型,通过点运算符之后接上xxx名称,表示调用getXxx()方法,比如:
${pageContext.request}
(2)与作用域相关的有pageScope、requestScope、sessionScope与applicationScope,分别可以取得对应作用域中已设置的值。如果不指定作用范围,则默认以pageScope、requestScope、sessionScope与applicationScope的顺序来寻找,比如:
${user.name} <%-- 表示user.getName() --%>
(3)与请求参数相关的有param与paramValues。
${param.user} 相当于 <%=request.getParameter("user")%>
${paramValues. favorites[0]} 相当于 <%= request.getParameterValues("favorites")[0] %>
(4)与Header相关的有header、headerValues。
${header["User-Agent"]} 相当于 <%=request.getHeader("User-Agent")%>
(5)cookie隐式对象可以用来取得已设置的Cookie值。如果在Cookie中设置了username属性,则可以使用:
${cookie.username}
(6)initParam初始参数隐式对象,可以用来取得web.xml中设置的ServletContext初始参数,也就是在<context-param>中设置的初始参数。
${initParam.initCount} 相当于 <%= servletContext.getInitParameter("initCount")%>
6、demo
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> ${param.a} + ${param.b} = ${param.a + param.b} </body> </html>
测试:127.0.0.1/index.jsp?a=3&b=5 响应结果:3 + 5 = 8
测试:http://127.0.0.1/index.jsp?a=3&b= 响应结果:3 + = 3
EL优雅地处理了null值的情况,对于null值直接以空字符串加以显示,而不是直接显示null值,在进行运算时,也不会因此发生错误而抛出异常。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
请求方法:${pageContext.request.method}
<%-- 请求方法:${request.method} 这种写法根本就是错误的,因为EL里只有requestScope隐式对象,根本就没有request隐式对象 --%>
<%-- 请求方法:${requestScope.method} 这种写法也是错误的,因为在request作用域里没有setAttribute过method这个属性--%>
</body>
</html>
测试:127.0.0.1/index.jsp 响应结果:请求方法:GET
点运算符与[]运算符
点运算符左边可以是JavaBean或Map对象
[]运算符左边可以是JavaBean、Map、数组或List对象
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <% String[] names = {"Mike", "Tom", "Jim"}; session.setAttribute("students", names); %> 姓名:${sessionScope.students[0]} </body> </html>
测试:127.0.0.1/index.jsp 响应结果:姓名:Mike
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<%@page import="java.util.Map, java.util.HashMap" %>
<%
Map<String, String> user = new HashMap<String, String>();
user.put("name", "Mike");
user.put("age", "18");
user.put("sex", "男");
session.setAttribute("user", user);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p>${user.name}</p>
<p>${user["name"]}</p>
<p>${user[param.index]}</p>
<p>${user[param[index]]}</p> <%-- 这一行没有输出,但这种方法没错,只是[]左边不支持使用param --%>
</body>
</html>
测试:http://127.0.0.1/index.jsp?index=age
响应:
Mike
Mike
18
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <p>1:${1 == 2 ? true : false}</p> <p>2:${true and false}</p> <p>3:${true or false}</p> <p>4:${not true}</p> <p>5:${1 < 2}</p> <p>6:${2 > 3}</p> <p>7:${2 >= 3}</p> <p>8:${2 <= 3}</p> <p>9:${2 == 3}</p> <p>10:${2 != 3}</p> </body> </html>
测试:http://127.0.0.1/index.jsp
响应:
1:false
2:false
3:true
4:false
5:true
6:false
7:false
8:true
9:false
10:true