文章目录
EL & JSTL
1、EL
1.1、介绍
-  EL与JSTL作用:简化JSP文件上java代码开发步骤 
-  JSP主要开发任务:将域对象中数据读取并写入到响应体 
-  在JSP文件上使用java命令,将域对象中数据读取并写入到响应体开发步骤: - 代码演示
 <% String value =(String)request.getAttribute("key"); //out.write(value) %> <%=value%>- 从域对象读取数据
- 对得到数据进行类型转换
- 将最终结果写入到响应体
 
1.2、EL工具包及其格式
- 是一个由java开发工具包
- 专门用于从域对象读取数据斌写入到响应体开发任务
- 语法格式:路径格式. 类似于jquery中选择器和过滤器
- EL工具包自动存在Tomcat中lib(el-api.jar) 
  - 开发时,可以直接使用不需要额外导包
 
${域对象别名.关键字}:到指定域对象读取对应关键字的内容,并将自动将内容写入响应体
1.3、域对象及其别名
- application:全局作用域对象
- session:会话作用域对象
- request:请求作用域对象
- pageContext:当前页作用域对象
个人理解:
 一般application存不用变动的值;(用户共存)
 session存用户的登录信息,一般打开浏览器就会出现,只要你不关闭浏览器,他还是他,这也就是说,比如你在bilibili上登录了账号,你关闭了bilibili,这时候你在打开,不用再登录了。(所以,你在写退出功能的servlet时,要把它删掉)
 request到了页面之后,如果没有被转发,它就消亡了。我们可以将一些信息存到request里,然后转发出去
| JSP | EL | 
|---|---|
| application | applicationScope | 
| session | sessionScope | 
| request | requestScope | 
| pageContext | pageScope | 
<%
pageContext.setAttribute("id",1);
request.setAttribute("name","李太白");
session.setAttribute("age",18);
application.setAttribute("home","神州天河");
%>
<pre>
编号:${pageScope.id}
名字:${requestScope.name}
年龄:${sessionScope.age}
籍贯:${applicationScope.home}
</pre>
2、EL表达式的使用
2.1、输出数据类型
<%
pageContext.setAttribute("id",1);
request.setAttribute("name","李太白");
session.setAttribute("age",18);
application.setAttribute("home","神州天河");
%>
<pre>
编号:${pageScope.id}
名字:${requestScope.name}
年龄:${sessionScope.age}
籍贯:${applicationScope.home}
</pre>
- ${域对象别名.关键字.属性名}
- EL表达式使用反射机制,通过调用当前属性对应的get方法读取属性内容
<%@ page import="been.Student" %><%--
  Created by IntelliJ IDEA.
  User: 铭先生
  Date: 2022/3/22
  Time: 22:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    Student stu =new Student("1","jack");
    session.setAttribute("stus",stu);
%>
<pre>
编号:${sessionScope.stus.id}
名字:${sessionScope.stus.name}
</pre>
2.2、EL表达式简化版
${关键字}:可以省略域对象别名
- 首先到[pageContext]定位关键字,如果有就读取输出并结束执行
- 如果[pageContext]没有找到关键字,到[request]定位关键字如果有就读取输出并结束
- 如果[requestt]没有找到关键字,到[session]定位关键字如果有就读取输出并结束
- 如果[session]没有找到关键字,到[application]定位关键字如果有就读取输出并结束
- 如果[application]没有找到关键字,返回null
-  增加运行时间 - 比如数据存放在application。使用${key}
- 执行轨迹
- pageContext–request–session–application
 
- 比如数据存放在application。使用
-  定位错误 
专门为pageContext读取数据并写入响应体做准备
2.3、EL表达式的运算
- 数学运算
- 关系运算 > >= < <= == != 
  - 运算符的别名: gt(>) ge(>=) lt(<) le(<=) eq(==) !=(!=)
 
- 逻辑运算 && || !
<%--
  Created by IntelliJ IDEA.
  User: 铭先生
  Date: 2022/3/23
  Time: 9:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
pageContext.setAttribute("key1","100");
pageContext.setAttribute("key2","200");
%>
<%
    String num1 =(String) pageContext.getAttribute("key1");
    String num2 =(String) pageContext.getAttribute("key2");
    int sum =Integer.valueOf(num1)+Integer.valueOf(num2);
%>
<pre>
    java代码书写:<%=sum%>
    EL表达式书写:${key1+key2}
<%--EL表达式判断有加号,会对其做一个自动类型装换--%>
</pre>
EL表达式内没有控制语句,使用用三目运算符
<%--
  Created by IntelliJ IDEA.
  User: 铭先生
  Date: 2022/3/23
  Time: 9:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
pageContext.setAttribute("age",23);
%>
<%
    Integer age =(Integer) pageContext.getAttribute("age");
    if(age>18){
        out.write("欢迎光临");
    }else{
        out.write("未成年人不能进入!");
    }
%>
${age ge 18?"欢迎光临":"未成年人不能进入!"}
2.4、EL表达式其他内置对象
-  [使用]: ${param.请求参数名}
-  [作用]: 读取请求协议包中参数内容 
-  [代替]: String value =request.getParameter("请求参数名"); out.write(value);
-  使用演示: 
<%--index_6.jsp?id=1&name=admin--%>
<pre>
id:${param.id}
name:${param.name}
</pre>
-  [作用]:读取请求协议包中关联对各值的请求参数,将参数内存保存到数组 
-  [使用]: ${paramValues.请求参数名}
-  [代替]: 
String array[] =request.getParamValues("ck");
- 使用演示:
<pre>
<%--index_6.jsp?empNo=1&empNo=2--%>
 0:${paramValues.empNo[0]}
 1:${paramValues.empNo[1]}
</pre>
- [代替]:
String value =application.getInitParameter("driver");
out.write(value)
- [使用]:${initparam.共享数据名}
拓展:路径
- 相对路径:以当前文件位置为起点,定位其他的资源文件
- 绝对路径:以网站根目录为起点,定位其他的资源文件
3、EL表达式缺陷
- 只能读取域对象数据,不能向域对象中写入数据更改数据
- 不支持控制语句 if判断 while循环
- 如果单独使用EL表达式,无法确保JSP文件的java命令被替换
4、JSTL标签工具类
4.1、介绍
- JSTL:jsp standrad Tag Lib;JSP中标准的标签工具类
- 是SUN公司提供
- 组成: 
  - 核心标签:java在jsp上基本功能的封装 if while
- sql标签:JDBC在JSP上使用功能
- xml标签:DOM4J在JSP使用功能
- Format标签:JSP文件格式转换
 
4.2、配置:
- 导入以来jar: jstl.jar、standrad.jar
- 在JSP文件引入JSTL中core包依赖约束
<%@ taglib url="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.3、标签的使用
-  <c:set>:-  [作用]:在JSP文件上设置域对象中共存数据 
-  [使用]: <c:set scope="session" var="key" value="10"/>(可以自闭合标签也可以双标签)
-  [代替]: 
 <% session.setAttribute("key","10"); %>-  [属性]: -  scope:指定操作的域对象别名- scope="application/session/request/page"
 
-  var:声明域对象中关键字
-  value:存入的共享数据
 
-  
-  代码演示: 
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:set scope="application" var="id" value="18"></c:set> <c:set scope="session" var="name" value="李太白"></c:set> <c:set scope="request" var="phone" value="135243121"></c:set> <c:set scope="page" var="address" value="神州天河"></c:set> <pre> 学号:${applicationScope.id} 名字:${sessionScope.name} 手机:${requestScope.phone} 地址:${pageScope.address} </pre>- 练习
 
-  
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="C"%>
<c:set scope="request" var="age" value="23"></c:set>
<%--两年后--%>
<c:set scope="request" var="age" value="${requestScope.age+2}"></c:set>
两年后:${age}
- <c:if>:- [作用]:在JSP文件上控制哪些内容可以写入响应体
- [使用]:
 
<c:if test="通过EL表达式进行判断">
内容
</c:if>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set scope="session" var="age" value="23"></c:set>
<c:if test="${sessionScope.age ge 18}">
    <font color="red">您超过了${sessionScope.age-18}年,欢迎光临</font>
</c:if>
<c:if test="${sessionScope.age le 18}">
    <font color="blue">过几年再来</font>
</c:if>
- <c:choose>:- [作用]:在JSP文件上实现多分支选择判断,决定哪一个内容能写入到响应体
- [使用]
 
<c:choose>
	<c:when test="EL表达式进行判断">内容1</c:when>
	<c:when test="EL表达式进行判断">内容2</c:when>
</c:choose>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set scope="session" var="salary" value="15000"></c:set>
<c:choose>
    <c:when test="${sessionScope.salary ge 12000}">高工资</c:when>
    <c:when test="${sessionScope.salary ge 10000}">正常工资</c:when>
    <c:when test="${sessionScope.salary ge  8000}">低工资</c:when>
    <c:otherwise>不正常工资</c:otherwise>
</c:choose>
-  <c:forEach>:-  [作用]:循环遍历 
-  [第一种方式使用]: 
-  <c:forEach var="声明循环变量名称" begin="初始化循环变量" end="循环变量可以接收的最大值" step="循环变量递增" > <%--属性可以不写,默认每次递增1--%> <%-- 循环变量被保存在[pageContext]--%> <%--“begin=x”相当于“i=x”--%> <%--“end=x”相当于 “i<=x”--%> </c:forEach>
-  [第二种使用方式]: 
-  <c:forEach items="通过EL表达式获得域对象集合" var="声明循环变量" > ${循环变量.对象属性名} </c:forEach>
 
-  
- 练习(第一种方式):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<select>
<%
    for (int i = 1; i <= 5; i++) {
%>
    <option>第<%=i%>页</option>
<%}%>
</select>
<hr/>
<select>
    <c:forEach var="i" begin="1" end="5" step="1" >
        <option>第${pageScope.i}</option>
    </c:forEach>
</select>
- 练习(第二种方式):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="mingDo.Student" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: 铭先生
  Date: 2022/3/24
  Time: 23:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="2">
    <tr>
    <td>学生编号</td>
    <td>学生姓名</td>
    </tr>
    <%
        List<Student> stus = (List<Student>) request.getAttribute("key");
        for (Student stu:stus) {
    %>
    <tr>
        <td><%=stu.getId()%></td>
        <td><%=stu.getName()%></td>
    </tr>
       <%}%>
</table>
<hr/>
<table border="2">
    <tr>
    <td>学生编号</td>
    <td>学生姓名</td>
    </tr>
    <c:forEach items="${key}"  var="stu">
        <tr>
        <td>${stu.id}</td>
        <td>${stu.name}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
这个不是直接访问这个jsp文件的,是通过servlet来存入数据,任何转发过来!
package mingDo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
 * @author: Mr.ming
 * @describe: NULL
 * @create: 2022/3/24-22:31
 */
public class sixServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Student stu =new Student("1","李太白");
        Student stu1 =new Student("2","杜甫");
        var list = new ArrayList<Student>();
        list.add(stu);
        list.add(stu1);
        req.setAttribute("key",list);
        req.getRequestDispatcher("/index_6.jsp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package mingDo;
/**
 * @author: Mr.ming
 * @describe: NULL
 * @create: 2022/3/24-22:33
 */
public class Student {
    private String id;
    private String name;
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="mingDo.Student" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: 铭先生
  Date: 2022/3/24
  Time: 23:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="2">
    <tr>
    <td>学生编号</td>
    <td>学生姓名</td>
    </tr>
    <%
        List<Student> stus = (List<Student>) request.getAttribute("key");
        for (Student stu:stus) {
    %>
    <tr>
        <td><%=stu.getId()%></td>
        <td><%=stu.getName()%></td>
    </tr>
       <%}%>
</table>
<hr/>
<table border="2">
    <tr>
    <td>学生编号</td>
    <td>学生姓名</td>
    </tr>
    <c:forEach items="${key}"  var="stu">
        <tr>
        <td>${stu.id}</td>
        <td>${stu.name}</td>
        </tr>
    </c:forEach>
</table>
<hr/>
<h1>map遍历</h1>
<table border="2">
    <tr>
        <td>学生班级</td>
        <td>学生编号</td>
        <td>学生姓名</td>
    </tr>
    <c:forEach items="${mapKey}" var="key_value">
        <tr>
            <td>${key_value.key}</td>
            <td>${key_value.value.id}</td>
            <td>${key_value.value.name}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
遍历map集合时,每次从map集合得到一个【键值对】,【键值对】交给循环变量
- 循环变量.key 获得【键值对】中关键字名字 班级名称
- 循环变量.value 获得【键值对】中内容stu对象










