一、EL表达式
1.EL,Expression Language,是一种在JSP页面中获取数据的简单方式
2.基本语法
在JSP页面的静态部分均可用${expression}的形式获取到指定表达式的值
3.EL只能从四大域中获取数据,其查找数据的顺序是,依次按照从小到大的范围从四大域中查找指定名称的属性值
从小到大:pageContext -> request -> session -> application
4.EL定义好的四个内置对象
pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
String username = "abc";
//pageContext.setAttribute("username", username);
//request.setAttribute("username", username);
//session.setAttribute("username", username);
application.setAttribute("username", username);
%>
username = ${username}<br>
<%-- 从application域中获取数据使用applicationScope --%>
username = ${applicationScope.username}<br>
<%
//pageContext.setAttribute("address", "page");
//request.setAttribute("address", "request");
//session.setAttribute("address", "session");
application.setAttribute("address", "application");
%>
address = ${applicationScope.address}<br>
</body>
</html>
5.EL访问属性值
1)采用对象名+“.”的方式访问
2)若访问为null的对象的属性,EL不会抛出空指针异常,只是不显示而已
jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="Servlet.*"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
Student s1 = new Student("zhangsan",100);
pageContext.setAttribute("stu", s1);
%>
stuName = ${stu.name }<br>
stuAge = ${stu.age }<br>
</body>
</html>
6.EL访问数组
若访问的数组元素下标超出了数组下标上界,EL不会抛出异常
jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
String[] names = {"a","b","c"};
pageContext.setAttribute("names", names);
%>
names[0] = ${names[0] }<br>
names[1] = ${names[1] }<br>
names[2] = ${names[2] }<br>
</body>
</html>
7.EL访问List
与访问数组的相同
EL可以通过索引访问List,但无法访问Set,因为Set中没有索引的概念
8.EL访问MAP
同样使用对象+“.”就可以了
9.EL中的运算符
重点:empty运算符
empty对于没有定义的变量的运算结果为true
empty对于为null的引用的运算结果为true
empty对于为空串的String引用的运算结果为true
empty对于没有元素的数组或集合的运算结果为true
jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<%
String name = "Jack";
pageContext.setAttribute("name", name);
String age = null;
String s = "";
%>
name = ${name }<br>
<%-- 结果为true --%>
empty id = ${empty id }<br>
<%-- 结果为false --%>
name = ${empty name }<br>
<%-- 结果为true --%>
age = ${empty age }<br>
<%-- 结果为true --%>
s = ${empty s }<br>
</body>
</html>
10.EL的内置对象
1)EL*有11个内置对象
2)常用的内置对象
a)四个域对象:pageScope,requestScope,sessionScope,applicationScope
b)pageContext:
El中的pageContext和jsp中的pageContext对象是同一个
应用:配置路径,使其更直观
c)参数相关内置对象
param:获取请求中的指定参数值
底层实际调用的是request,getParameter();方法
paramValues:获取请求中指定参数的所有值
底层实际调用的是request,getParameterValues();方法
initParam:获取对应的初始化参数
底层实际调用的是:servletContext的getInitParameter();方法
jsp代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<%-- 使用这种方式写路径更直观易懂,且不容易出错 --%>
<form action="${pageContext.request.contextPath }/register" method="post">
姓名:<input type="text" name="names" /><br>
密码:<input type="password" name="pwd" /><br>
<input type="submit" value="注册" />
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<%-- 在show.jsp中获取用户输入的数据 --%>
<%-- 使用el的内置对象param --%>
<form action="${pageContext.request.contextPath }/show.jsp" method="post">
姓名:<input type="text" name="names" /><br>
密码:<input type="password" name="pwd" /><br>
爱好:
<input type="checkbox" name="hobby" value="swim" />游泳
<input type="checkbox" name="hobby" value="climb" />爬山
<input type="checkbox" name="hobby" value="read" />阅读
<br>
<input type="submit" value="注册" />
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取用户输入的数据</title>
</head>
<body>
name = ${param.names }<br>
password = ${param.pwd }<br>
hobby[0] = ${paramValues.hobby[0] }<br>
hobby[1] = ${paramValues.hobby[1] }<br>
hobby[2] = ${paramValues.hobby[2] }<br>
address = ${initParam.address }<br>
website = ${initParam.website }<br>
</body>
</html>
11.自定义EL函数
设计了一个类,用来自定义EL函数
该类及其函数需要在一个拓展名为.tld的XML文件中进行注册
tld全称叫tag library definition 标签库定义
XML文件是需要约束的,即需要配置文件头部。这个头部约束可以从以下文件中进行复制:
在Tomcat的安装目录下:tomcat-9\webapps\examples\WEB-INF\jsp2
文件名为:jsp2-example-taglib.tld
这个.tld的XML文件,需要定义在当前Web项目的WEB-INF目录下
public class ELFunctions
{
//定义一个可以将字符串小写转换成大写的函数
public static String lowerToUpper(String s)
{
return s.toUpperCase();
}
}
<?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">
<!-- 定义标签库信息 -->
<tlib-version>1.0</tlib-version>
<short-name>myFunction</short-name>
<uri>http://www.baidu.com/jsp/el</uri>
<!-- 注册函数 -->
<function>
<name>lowerToUpper</name>
<function-class>Servlet.ELFunctions</function-class>
<function-signature>java.lang.String lowerToUpper( java.lang.String )</function-signature>
</function>
</taglib>
12.JSTL的EL函数库
JSTL:JSP Standard Tag Library JSP标准标签库
要使用JSTL,首先需要将jar包导入
两个jar包:
jstl.jar和standard.jar
以下代码使用其中的substring方法
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL函数库</title>
</head>
<body>
${fn:substring("abcdefg",2,5) }<br>
</body>
</html>
13.EL总结:
1)EL不能出现在Java代码块、表达式块等jsp的动态部分
2)EL只能从pageContext、request、session、application四大域属性空间中获取数据
3)EL不会抛出空指针异常。若访问一个null对象的属性,则什么也不显示
4)EL不会抛出数组访问越界异常。若访问一个数组中不存在的元素,则什么也不显示
5)EL不具有对字符串进行处理的能力,连简单的字符串拼接都不行