JSP -- EL表达式及JSTL标签库

一、EL表达式简介

1. 什么是EL表达式
  EL是JSP表达式语言,全称是Expression Language,​作用:代替JSP中脚本表达式的功能,简化对Java代码的操作。

2. EL表达式的格式和作用

  • 格式:${表达式内容}
  • 作用:从域对象中查找指定的数据

二、EL表达式的基本使用

1. 获得域对象的数据

<h2>EL获得容器(域对象)的数据</h2>
<%--el作用:获取域里面的数据--%>
<%
    request.setAttribute("name","admin1");
    request.getSession().setAttribute("name","admin2");
    request.getSession().getServletContext().setAttribute("name","admin3");
%>
<p>获取域里面的name:${name}</p>
<%--el通过直接写域里面的name,会依次从request,session,servletCOntext里面获取,找到为止--%>
<%--如果想通过el获取指定域里面的数据,必须指定域的范围
            requestScope====>request域对象
            sessionSoope====>session域对象
            applicationScope==>servletContext域对象
--%>
<p>获取request域里面的name:${requestScope.name}</p>
<p>获取session域里面的name:${sessionScope.name}</p>
<p>获取servletContext域里面的name:${applicationScope.name}</p>
<p>获取servletContext域里面的name2:${applicationScope.name2}</p>

2. 获取JavaBean数据

<h2>EL获取和解析域里面的复杂数据——javaBean对象</h2>
<%
    //往域里面写javaBean对象
    User user = new User(20,"张三");
    request.setAttribute("user",user);
%>
<%--el获取javaBean对象直接.属性名就可以,el会自动调用该属性getXXX封装方法--%>
<p>获取request域中user对象里面name的值:${user.name}</p>
<p>获取request域中user对象里面age的值:${user.age}</p>

注意:

  • JavaBean数据获取类似获取map集合的方式,既能使用.获取数据,也可以使用[]

  • 如果EL表达式获取不到数据,则页面没有显示内容,而不是显示为null;

  • EL在获取JavaBean数据时,底层调用的是getXXX()方法。


3. 获取和解析复杂数据

获取数组:

<h2>EL获取和解析域里面的复杂数据——数组</h2>
<%
    //往域里面写数组数据
    User[] users = { new User(20,"张三"), new User(22,"李四")};
    request.setAttribute("users",users);
%>

<%--el获取数组,是通过下标[索引]方式获取元素--%>
<p>获取request域中对象数组里面第一个元素name的值:${users[0].name}</p>
<p>获取request域中对象数组里面第一个元素age的值:${users[0].age}</p>
<p>获取request域中对象数组里面第二个元素name的值:${users[1].name}</p>
<p>获取request域中对象数组里面第二个元素age的值:${users[1].age}</p>

获取List:

<h2>EL获取和解析域里面的复杂数据——List</h2>
<%
    //往域里面写List数据
    List<User> userList = new ArrayList<User>();
    userList.add( new User(20,"张三"));
    userList.add( new User(22,"李四"));
    request.setAttribute("userList",userList);
%>

<%--el获取集合,也是是通过下标[索引]方式获取元素,与数组一样--%>
<p>获取request域中List集合里面第一个元素name的值:${userList[0].name}</p>
<p>获取request域中List集合里面第一个元素age的值:${userList[0].age}</p>
<p>获取request域中List集合里面第二个元素name的值:${userList[1].name}</p>
<p>获取request域中List集合里面第二个元素age的值:${userList[1].age}</p>

获取Map:

<h2>EL获取和解析域里面的复杂数据——Map</h2>
<%
    //往域里面写Map数据
    Map<String,User> map = new HashMap<String,User>();
    map.put("one", new User(20,"张三"));
    map.put("two", new User(22,"李四"));
    map.put("three.four",new User(24,"王五"));
    request.setAttribute("map",map);
%>

<p>获取request域中map集合里面one元素name的值:${map.one.name}</p>
<p>获取request域中map集合里面one元素age的值:${map.one.age}</p>
<p>获取request域中map集合里面two元素name的值:${map.two.name}</p>
<p>获取request域中map集合里面two元素age的值:${map.two.age}</p>

<%--如果el获取的属性名中有特殊字符,不可以使用.的方式获取数据,需要使用${["属性名"]}进行获取--%>
<p>获取request域中map集合里面three.four元素name的值:${map["three.four"].name}</p>

三、EL表达式使用运算符

1. 支持算术运算符:+ - * / %

注意事项:

  • 在EL表达式中,只要是数字就能执行运算,执行除法时会将数字除尽,最多保留16位小数;

  • 在EL表达式中,如果在一个算式中有数据不存在,那么这个数据不参与运算,不报错继续执行。

2. 逻辑运算符

&& --交集|| --并集!--非

​ 注意:逻辑运算中的异或 ^EL不支持。

3. 比较运算符

== 等于!= 不等于< 小于> 大于<= 小于等于>= 大于等于

4. empty运算符
​  empty运算符是用来判断当获取的数据是否为空或者当前获取的集合是否没有任何数据

<h2>使用empty判断空</h2>
<%--
    ${empty 域里面的数据}
    1.判断数据是否为null,为null 返回true
    2.判断数据是否为空字符串,为空字符串,返回true
    3.判断数据是集合的话,如果集合元素的个数为0,返回true
--%>
<p>空字符串:${empty ""}</p>
<p>空对象:${empty null}</p>

<%  request.setAttribute("list",new ArrayList<String>());  %>
<p>集合元素个数为0:${empty list}</p>

<%--
${not empty 域里面的数据}   判空取反
--%>

5. 三目运算符

<%-- 与Java的三元运算符功能一致 -->
<td class="text-center">${product.productStatus==0?'关闭':'开启'}</td>

6. 截取字符串

<td>${product.productName.substring(1,4)}</td>

四、JSTL标签库概述

1. 简介
  ​JSP的标准标签库(Jsp Standard Tag Library),简称JSTL。JSP标准标签库由很多标签组成,这些标签称为服务器端标签。服务器端标签的作用是以标签形式编写来代替特定功能的Java代码。

2. 常用JSTL标签库

  • 1)core:JSTL的核心标签库(目前还在使用)

  • 2)fmt:格式化(国际化)的标签库(使用较少,对页面显示数据,格式化,现在都交给前端去做)

3. 导入jar包

javax.servlet.jsp.jstl.jar / jstl-impl.jar

4. 导入标签库

需要在JSP页面使用taglib指令导入要使用的标签库

core:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

fmt:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

五、JSTL核心标签库常用标签

1. 核心标签库列表

标签名称作用
<c:out>通常用于输出一段文本内容到客户端浏览器
<c:if>相当于java中的if(){ }语句,而不是if(){ }else{ }语句
<c:choose>用于指定多个条件选择的组合边界,它必须与 c:whenc:otherwise标签一起使用
<c:forEach>用于代替 java代码for循环语句

2. if 标签

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>if标签</title>
</head>
<body>
<%--
    if标签
        格式:<c:if test="条件表达式"> //条件成立时运行的数据 </c:if>
        作用,相当于if(){}
        常用属性
            test,用于编写逻辑条件表达式 --判断是否执行标签内的内容(true:执行标签中的内容,false:不执行)
            scope,用于将表达式的值存储到指定域里面,request/session/servletContext
            var,用于设置域里面的name
--%>
<c:if test="${false}" scope="request" var="flag">
    <p>进入了if条件句</p>
</c:if>

表达式里面的值:${flag},外部的语句
</body>
</html>

3. choose标签

作用:
  ​<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when><c:otherwise>标签一起使用,三个标签组合发挥java代码if(){ ... } else if(){ ... } else{ ... }语句的作用。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>if标签</title>
</head>
<body>
<%--
    choose标签
        格式:
            <c:choose>
                <c:when test=""></c:when>======>if
                <c:when test=""></c:when>======>else if
                <c:otherwise></c:otherwise>====>else
            </c:choose>
        作用:
            相当于 if-elseif-esle结构
        常用属性
            test,用于编写逻辑条件表达式
        注意:
            不能在服务器端标签里面写html注释,不支持

--%>
<% request.getSession().setAttribute("loginUser",null); %>
<c:choose>
    <c:when test="${not empty loginUser}">
        欢迎,${loginUser}用户,登录成功
    </c:when>
    <c:otherwise>
        您,还没有登录
    </c:otherwise>
</c:choose>

</body>
</html>

4. foreach标签

循环对象时常用属性:

属性名是否支持EL属性类型属性描述
varfalseString保存的是被循环对象中的元素
itemstrue任何支持的类型将要迭代的集合对象

foreach循环List

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List" %>
<%@ page import="com.zz.model.Person" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%-- foreach作用是用于遍历:数组、集合 --%>

<%
    List<Person> list = new ArrayList<>();
    list.add(new Person(110,"张三",18));
    list.add(new Person(220,"李四",19));
    list.add(new Person(330,"王五",20));
    request.setAttribute("list",list);
%>

<%--
  foreach标签常用的属性:
    items: 指定遍历的目标
    var : 指定遍历出来每个元素的存储在域中名字
    varStatus: 指定存储遍历信息对象的名字,一个集合在遍历的过程中会产生大量的信息: index(索引值)count(序号), 这些信息都
    		   被jstl封装到一个对象中了     域对象.setAttribute("你指定的名字",status);

    begin: 指定开始遍历的索引值
    end: 指定遍历结束索引值
    step: 指定遍历的步长   0 1 2   
--%>

<table border="1px" cellspacing="0px" cellpadding="0px" align="center">
    <tr>
        <td>序号</td>
        <th>身份证</th>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    <c:forEach  var="item" items="${list}"  varStatus="status" >
        <tr>
            <td>${status.count}</td>
            <td>${item.id}</td>
            <td>${item.name}</td>
            <td>${item.age}</td>
        </tr>
    </c:forEach>
</table>

</body>
</html>

foreach循环对象(数组、map)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String[] arr= {"张三","李四","王五"};
    request.setAttribute("arr",arr);

    //集合
    Map<String,String> map = new HashMap<>();
    map.put("aa","张三");
    map.put("bb","李四");
    map.put("cc","王五");
    request.setAttribute("map",map);
%>

<%--遍历数组--%>
    <c:forEach var="item"  items="${arr}">
        ${item},
    </c:forEach>
<br/>


<%--遍历Map集合
    遍历map对象的时候,遍历出来的每一个元素都是一个entry对象
--%>

遍历map:<br/>
<c:forEach var="entry" items="${map}">
        key:${entry.key}   value: ${entry.value}<br/>
</c:forEach>

</body>
</html>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值