一、EL 与 JSTL 作用:
? 简化JSP文件上java代码开发步骤
二、JSP的主要开发任务:
? 将域对象中数据读取并写入到响应体
三、在JSP文件上使用java命令,将域对象中数据读取并写入到响应体开发步骤
<%
String value = (String)request.getAttribute("key");
out.write(value);
%>
<%=value%>
1、从域对象读取数据
2、对得到数据进行类型转换
3、将最终结果写入到响应体
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- 制造测试数据 -->
<%
request.setAttribute("key","abc");
%>
<%--java命令读取request数据并写入到响应体中--%>
<%
String value = (String)request.getAttribute("key");
//out.write(value);
%>
Java 命令写入的结果:<%=value%><br/>
EL 表达式写入的结果:${requestScope.key}
</body>
</html>
四、EL工具包
? 1、是一个由java开发的工具包
? 2、专门用于从域对象中数据读取并写入到响应体开发任务
? 3、语法格式:路径格式、类似于jQuery中选择器和过滤器语法
? 4、EL工具包自动存在Tomcat的lib中(el-api.jar)
? 开发时,可以直接使用,不需要额外导包
五、EL的标准格式:
? &{域对象别名.关键字} : 到指定域对象读取对应关键字的内容,并自动将内容写入到响应体中。
六、JSP文件中域对象:
? 1.application:全局作用域对象
? 2.session: 会话作用域对象
? 3.request: 请求作用域对象
? 4.pageContext:当前页作用域对象 (作用:1、用于初始化其他域 2、获取其它八大隐式对象,可以认为是一个入口对象。
? 3、获取其所有域中的数据)
七、EL表达式域对象别名
?
JSP | EL |
---|---|
application | applicationScope |
session | sessionScope |
request | requestScope |
pageContext | pageScope |
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!-- 制造测试数据 -->
<%
application.setAttribute("sid",10);
session.setAttribute("sname","mike");
request.setAttribute("sex","man");
pageContext.setAttribute("home","北京");
%>
学员编号:${applicationScope.sid}<br/>
学员姓名:${sessionScope.sname}<br/>
学员性别:${requestScope.sex}<br/>
学员住址:${pageScope.home}
</body>
</html>
八、EL表达式将高级对象属性写入到响应体中
? ${域对象别名.关键字.属性名}
? EL表达式使用反射机制,通过调用当前属性对应的get方法读取属性内容
九、EL表达式简化版:
? ${关键字}:可以省略域对象
[工作原理]:
? 首先到[pageContext]定位关键字,如果有读取输出并结束执行
? 如果[pageContext]没有找到关键字,到[request]定位关键字,如果有读取输出并结束执行
? 如果[request]没有找到关键字,到[session]定位关键字,如果有读取输出并结束执行
? 如果[session]没有找到关键字,到[application]定位关键字,如果有读取输出并结束执行
? 如果[application]没有找到关键字,返回null
[弊端]:
? 1、增加运行时间
? 比如数据存放application,使用${key}
? 执行轨迹:pageContext---request----session----application
? 2、定位错误
[使用场景]:专门为pageContext读取数据并写入响应体做准备
? ${key}
十、EL表达式支持的运算
? 1、数学运算
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--制造测试数据--%>
<%
pageContext.setAttribute("key1","100");
pageContext.setAttribute("key2","200");
%>
<%--java--%>
<%
String num1 = (String)pageContext.getAttribute("key1");
String num2 = (String)pageContext.getAttribute("key2");
int sum = Integer.valueOf(num1) + Integer.valueOf(num2);
%>
Java 命令的运算结果:<%=sum%><br/>
EL 表达式运算结果:${key1+key2}
? 2、关系运算 > >= < <= == !=
? 别名: gt ge lt le eq !=
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--制造测试数据--%>
<%
request.setAttribute("age",23);
%>
<%--java--%>
<%
Integer age = (Integer) request.getAttribute("age");
if(age>=18)
out.write("欢迎光临");
else
out.write("谢绝入内");
%><br>
EL 表达式运算结果:${age ge 18?"欢迎光临":"谢绝入内"}
? 3、逻辑运算 && || !
十一、EL表达式中其他的内置对象
1、param:
? [使用]:${param.请求参数名}
? [作用]:读取请求协议包参数内容
? [代替]:String value = request.getParameter("请求参数名");
? out.write(value);
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
访问网址时,后面直接带有参数
http://localhost:8080/EL_01_war/test_05.jsp?uname=smith&password=123
--%>
登录名:${param.uname}<br>
密码:${param.password}
2、paramValues:
? [作用]:读取请求协议包中关联多个值的请求参数
? 将参数内容保存到数组
? [使用]:${paramValues.请求参数名}
? [代替]:String array[] = request.getParameterValues("key");
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
访问网址时,后面直接带有参数
http://localhost:8080/EL_01_war/test_06.jsp?empNo=10&empNo=20
--%>
第一个职员的编号:${paramValues.empNo[0]}<br>
第二个职员的编号:${paramValues.empNo[1]}
3、initParam
? [代替]: String value = application.getInitParamter("driver");
? out.write(value);
? [使用]: ${initParam.共享数据名}
<!-- web.xml 中的共享数据内容 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在jsp中利用EL表达式进行读取--%>
来自于 web.xml 的共享数据:${initParam.driver}
十二、相对路径与绝对路径
? 1、二者的区别
? 1)相对路径:以当前文件位置为起点,定位其他的资源文件
? 2)绝对路径:以网站的根目录为起点,定位其他的资源文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>相对路径定位</h1>
<a href="test_01.jsp">test_01.jsp</a><br>
<a href="../index.jsp">index.jsp</a><br>
<h1>绝对路径定位</h1>
<a href="/EL_01_war/test/test_01.jsp">test_01.jsp</a><br>
<a href="/EL_01_war/index.jsp">index.jsp</a>
</body>
</html>
2、如何禁止相对路径,如何简化绝对路径写法
<base href="/根目录/">
3、如何动态获得网站运行时的根目录
<%
String root = request.getContextPath(); // /EL_01_war
%>
<base href = "<%=root%>"/>
十三、EL表达式缺陷
1、只能读取域对象数据,不能向域对象中写入数据和更改数据
2、不支持控制语句,例如:if 判断 ,while 循环
如果单独使用 EL表达式 ,无法确保 JSP文件 中所有的 Java命令 都被替换掉