EL表达式学习笔记

一、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不具有对字符串进行处理的能力,连简单的字符串拼接都不行

上一篇:【数据分析-学术前沿趋势分析】 Task2 论文作者统计


下一篇:Sklearn实现主成分分析