EL表达式&JSTL学习笔记


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. 对得到数据进行类型转换
    3. 将最终结果写入到响应体
1.2、EL工具包及其格式
  1. 是一个由java开发工具包
  2. 专门用于从域对象读取数据斌写入到响应体开发任务
  3. 语法格式:路径格式. 类似于jquery中选择器和过滤器
  4. EL工具包自动存在Tomcat中lib(el-api.jar)
    • 开发时,可以直接使用不需要额外导包

EL的标准格式:

${域对象别名.关键字}:到指定域对象读取对应关键字的内容,并将自动将内容写入响应体

1.3、域对象及其别名

jsp文件中的域对象

  1. application:全局作用域对象
  2. session:会话作用域对象
  3. request:请求作用域对象
  4. pageContext:当前页作用域对象

图示:
自己画的,看狂神的视频,跟着他画的

个人理解:
一般application存不用变动的值;(用户共存)
session存用户的登录信息,一般打开浏览器就会出现,只要你不关闭浏览器,他还是他,这也就是说,比如你在bilibili上登录了账号,你关闭了bilibili,这时候你在打开,不用再登录了。(所以,你在写退出功能的servlet时,要把它删掉)
request到了页面之后,如果没有被转发,它就消亡了。我们可以将一些信息存到request里,然后转发出去

EL表达式域对象别名

JSPEL
applicationapplicationScope
sessionsessionScope
requestrequestScope
pageContextpageScope

用法演示

<%
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

弊端

  1. 增加运行时间

    • 比如数据存放在application。使用${key}
    • 执行轨迹
    • pageContext–request–session–application
  2. 定位错误

使用场景

专门为pageContext读取数据并写入响应体做准备

2.3、EL表达式的运算
  1. 数学运算
  2. 关系运算 > >= < <= == !=
    • 运算符的别名: gt(>) ge(>=) lt(<) le(<=) eq(==) !=(!=)
  3. 逻辑运算 && || !

数学运算

<%--
  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

  • [使用]:${param.请求参数名}

  • [作用]: 读取请求协议包中参数内容

  • [代替]:

    String value =request.getParameter("请求参数名");
    out.write(value);
    
  • 使用演示:

<%--index_6.jsp?id=1&name=admin--%>
<pre>
id:${param.id}
name:${param.name}
</pre>

paramValues

  • [作用]:读取请求协议包中关联对各值的请求参数,将参数内存保存到数组

  • [使用]:${paramValues.请求参数名}

  • [代替]:

String array[] =request.getParamValues("ck");
  • 使用演示:
<pre>
<%--index_6.jsp?empNo=1&empNo=2--%>
 0:${paramValues.empNo[0]}
 1:${paramValues.empNo[1]}
</pre>

initParam

  • [代替]:
String value =application.getInitParameter("driver");
out.write(value)
  • [使用]:${initparam.共享数据名}
拓展:路径

相对路径与绝对路径的区别

  • 相对路径:以当前文件位置为起点,定位其他的资源文件
  • 绝对路径:以网站根目录为起点,定位其他的资源文件

3、EL表达式缺陷

  1. 只能读取域对象数据,不能向域对象中写入数据更改数据
  2. 不支持控制语句 if判断 while循环
  3. 如果单独使用EL表达式,无法确保JSP文件的java命令被替换

4、JSTL标签工具类

4.1、介绍
  1. JSTL:jsp standrad Tag Lib;JSP中标准的标签工具类
  2. 是SUN公司提供
  3. 组成:
    • 核心标签:java在jsp上基本功能的封装 if while
    • sql标签:JDBC在JSP上使用功能
    • xml标签:DOM4J在JSP使用功能
    • Format标签:JSP文件格式转换
4.2、配置:

配置

  1. 导入以来jar: jstl.jarstandrad.jar
  2. 在JSP文件引入JSTL中core包依赖约束
<%@ taglib url="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.3、标签的使用
  1. <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}
  1. <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>
  1. <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>
  1. <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来存入数据,任何转发过来!

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);
    }
}

student类

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;
    }
}

map遍历

<%@ 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对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值