EL表达式和JSTL标签

EL表达式

  1. 概念:Expression Language表达式语言

  2. 作用:简化jsp中书写Java代码的代码量

  3. 语法:${表达式}

  4. 注意:
    jsp默认是支持el表达式,如果要忽略el表达式,则可以使用以下两种方法:

    1. 设置jsp中page指令,isELIgnored=“true”,忽略当前页面中所有的el表达式
    2. ${表达式} 忽略当前这个el表达式
  5. 使用:

    1. 运算:
      1. 算数运算符:+ - * /(div) %(mod)
      2. 比较运算符:> < >= <= != ==
      3. 逻辑运算符:&& (and) || (or) ! (not)
      4. 空运算符:empty
        1. 功能:用于判断字符串,集合,数组对象是否为null或长度是否为0
        2. ${empty list}
        <%
            List list = new ArrayList();
            list.add("aaa");
            request.setAttribute("list",list);
        %>
        
        <%
            String str = "";
            request.setAttribute("str",str);
        %>
        ${empty list}<br>//如果list为空时输出true,反之false
        ${not empty list}<br>//如果list不为空时输出true,反之false
        ${not empty str}<br> //“”属于长度=0,但是不为空
        
    <%--
      Created by IntelliJ IDEA.
      User: lzy
      Date: 2020/3/6
      Time: 17:48
      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>
    <h3>算术运算符</h3>
    ${3+4}<br>
    ${3%4}<br>
    ${3 div 4}<br>	
    <h3>比较运算符</h3>
    ${5 > 6}<br>
    ${5 == 6}<br>
    <h3>逻辑运算符</h3>
    ${3 > 5 && 3>2}<br>
    ${3 > 5 or 3>2}<br>
    </body>
    </html>
    
    1. 获取值:

      1. el表达式只能从域对象中获取值
      2. 语法:
        1. ${域名称.键名}:从指定域名称中获取指定键的值
          域名称(由上至下 域的范围变大):

          1. pageScope - - - - ->pageContext
          2. requestScope - - - - >request
          3. sessionScope - - - - ->session
          4. applicationScope - - - - >application(ServletContext)
        2. ${键名}:表示依次从最小域中查找是否又该键对应的值,知道找到为止

      举例1:在request域中存储了	name = liuzeyu
      获取:${requstScope.name}
      
      举例2:在application域,request域中,pageContext域中分别存储了name 的值
      <%
          application.setAttribute("name","lisi");
          request.setAttribute("name","zhangsan");
          pageContext.setAttribute("name","wangwu");
      %>
      ${name}
      最后输出:wangwu
      验证了依次从最小域中查找是否又该键对应的值,知道找到为止
      
      1. 获取实体类对象,List集合,Map的值
        1. 对象:${域名称.键名.属性名},本质上会去调用getter方法
        2. List集合:${域名称.键名[索引]}
        3. Map集合:
          ${域名称.键名.key名称}
          ${域名称.键名[“key名称”]}
       User.java
       ```
       public class User {
       
           private String username;
           private String password;
           private Date birthday;
           public String getUsername() {
               return username;
           }
       
           public void setUsername(String username) {
               this.username = username;
           }
       
           public String getPassword() {
               return password;
           }
       
           public void setPassword(String password) {
               this.password = password;
           }
       
           public Date getBirthday() {
               return birthday;
           }
       
           public String getBirthdayFormat() {
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
               String format = sdf.format(birthday);
               return format;
           }
       
           public void setBirthday(Date birthday) {
               this.birthday = birthday;
           }
       }
       
       ```
      

      el3.jsp

      <%@ page import="domain.User" %>
      <%@ page import="java.util.*" %><%--
        Created by IntelliJ IDEA.
        User: lzy
        Date: 2020/3/6
        Time: 17:48
        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>
      
      <%--1.测试el表达式获取对象得值--%>
      <%
          User user = new User();
          user.setUsername("liuzeyu");
          user.setPassword("809080");
          user.setBirthday(new Date());
          request.setAttribute("u",user);
      %>
      <%--2.测试el表达式获取List对象得值--%>
      <%
          List list = new ArrayList();
          list.add("aaa");
          list.add("bbb");
          list.add(user);
          request.setAttribute("list",list);
      %>
      <%--2.测试el表达式获取Map对象的值--%>
      <%
          Map map = new HashMap();
          map.put("sname","liuzeyu");
          map.put("gender",32);
          map.put("user",user);
          request.setAttribute("map",map);
      %>
      <%-- ##############################################--%>
      <h3>el表达式获取对象的属性</h3>
      <%--通过对象的【属性】来获取
          如:获取username,找到getUsername,找到不到为空--%>
      ${requestScope.u.username}<br>
      ${requestScope.u.password}<br>
      ${requestScope.u.birthday}<br>
      ${requestScope.u.birthday.year}<br>
      ${requestScope.u.birthday.month}<br>
      ${requestScope.u.birthdayFormat}<br>
      
      <h3>el表达式获取List对象的内容</h3>
      ${requestScope.list}<br>
      ${requestScope.list[0]}<br>
      ${requestScope.list[2].username}<br>
      
      <h3>el表达式获取Map对象的内容</h3>
      ${requestScope.map}<br>
      ${requestScope.map["gender"]}<br>
      ${requestScope.map.sname}<br>
      ${requestScope.map.user.username}<br>
      </body>
      </html>
      
      1. 隐式对象:
      • el表达式中有11个隐式对象
      • pageContext:
        • 获取jsp其他八个内置对象
          • ${pageContext.request.contextPath}:动态获取虚拟目录,常用于表单的action

JSTL标签

  1. 概念:Java Server Tag Library
    是由appach组织提供的免费开源jsp标签
  2. 作用:用于简化和替换jsp页面上的Java代码
  3. 使用步骤:
    1. 导入jstl相关的jar包
    2. 引入标签库:taglib指令:<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
    3. 使用标签
  4. 常用的jstl标签
    1. if:相对于java代码的if语句

      1. 属性:
        test必须属性,接受boolean值
        1. 如果表达式为true,则显示if标签体内容,反之则不显示
        2. 一般情况下,test属性会和el表达式配合使用

      注意:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签

      <%--
          需求:
          1.判断集合是否为空,如果不为空,则显示if标签体内容
          2.结合el表达式判断是否奇数
      --%>
      <%
          List list = new ArrayList();
          list.add("liuzeyu");
          request.setAttribute("list",list);
      
          request.setAttribute("num",31);
      %>
      
      <c:if test="${not empty list}">list不为空  可以遍历</c:if><br>
      <c:if test="${requestScope.num mod 2 == 0}">${requestScope.num}是偶数</c:if><br>
      <c:if test="${requestScope.num mod 2 != 0}">${requestScope.num}是奇数</c:if><br>
      
    2. chose:相当于Java代码的switch语句

      1. 使用chose标签取出数字 相当于switch
      2. 使用when标签做数字判断 相当于case
      3. 使用otherwise 做出其他情况声明 相当于default
      <%--
          需求:
          完成数字编号对应星期几的案例
          1.域中存储一数字
          2.使用chose标签取出数字     相当于switch
          3.使用when标签做数字判断    相当于case
          4.使用otherwise 做出其他情况声明  相当于default
      --%>
      
      <%
          request.setAttribute("number",33);
      %>
      
      <c:choose>
          <c:when test="${requestScope.number == 1}">星期一</c:when>
          <c:when test="${requestScope.number == 2}">星期二</c:when>
          <c:when test="${requestScope.number == 3}">星期三</c:when>
          <c:when test="${requestScope.number == 4}">星期四</c:when>
          <c:when test="${requestScope.number == 5}">星期五</c:when>
          <c:when test="${requestScope.number == 6}">星期六</c:when>
          <c:when test="${requestScope.number == 7}">星期日</c:when>
      
          <c:otherwise>请输入正确的数字!!</c:otherwise>
      </c:choose>
      	```
      
    3. foreach:相当于Java代码的for语句

      1. 完成重复操作
        for(int i = 0;i < 10; i++){
        //操作
        }
        *属性:
        begin:开始值
        end:结束值
        step:步长
        var:临时变量
        varStatus:循环状态对象
        index:容器中的元素索引,从0开始
        count:循环次数,从1开始

      2. 遍历容器
        List users;
        for(User user : users){
        //操作
        }
        *属性
        item:容器对象
        var:容器元素的临时变量
        varStatus:循环状态对象
        index:容器中的元素索引,从0开始
        count:循环次数,从1开始

      <%@ page import="java.util.List" %>
      <%@ page import="java.util.ArrayList" %><%--
        Created by IntelliJ IDEA.
        User: lzy
        Date: 2020/3/6
        Time: 21:55
        To change this template use File | Settings | File Templates.
      --%>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <html>
      <head>
          <title>测试jstl的if</title>
      </head>
      <body>
      
      <%-- 1.完成重复操作--%>
      <c:forEach begin="0" end="5" step="1" var="i" varStatus="s">
          ${i}<h1>${s.index}</h1><h2>${s.count}</h2><br>
      </c:forEach>
      
      <hr>
      <%-- 2.遍历容器--%>
      <%
          List list = new ArrayList();
          list.add("aaa");
          list.add("bbb");
          list.add("ccc");
          list.add("ddd");
          request.setAttribute("list",list);
      %>
      <c:forEach items="${list}" var="str" varStatus="s">
          ${str}<h1>${s.index}</h1><h2>${s.count}</h2><br>
      </c:forEach>
      </body>
      </html>
      
      

案例

需求:在request域中存有一个User对象的List集合,需要使用jstl+el将List集合数据展示到jsp页面的table表格中

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page import="domain.User" %><%--
  Created by IntelliJ IDEA.
  User: lzy
  Date: 2020/3/6
  Time: 21:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>案例</title>
</head>
<body>
<%
    List list = new ArrayList();
    list.add(new User("zhangsan","1998",new Date()));
    list.add(new User("lisi","2001",new Date()));
    list.add(new User("wangwu","2520",new Date()));
    list.add(new User("xiaohua","1530",new Date()));
    list.add(new User("taizi","5540",new Date()));

    request.setAttribute("list",list);
%>

<table border="1" width="500" align="center">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>出生年份</th>
        <th>生日</th>
    </tr>
    <c:forEach items="${requestScope.list}" var="user" varStatus="s">

        <c:if test="${s.count % 2 != 0}">
        <tr bgcolor="red">
            <td>${s.count}</td>
            <td>${user.username}</td>
            <td>${user.password}</td>
            <td>${user.birthdayFormat}</td>
        </tr>
        </c:if>

        <c:if test="${s.count % 2 == 0}">
            <tr bgcolor="green">
                <td>${s.count}</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
                <td>${user.birthdayFormat}</td>
            </tr>
        </c:if>
    </c:forEach>
</table>
</body>
</html>

在这里插入图片描述
注意:

test="${s.count % 2 == 0}"不可以写成test="${s.count % 2 == 0} "
多出一个空格,
老眼昏花,一个空格排错半天。
发布了43 篇原创文章 · 获赞 5 · 访问量 2642

猜你喜欢

转载自blog.csdn.net/JAYU_37/article/details/104700714