JSTL详解

新建项目myJSTL

在src目录下新建包,在包下新建java类
1.User类

package com.shunde.servlet;

public class User {
    private int id;
    private String name;
    private double score;
    private Address address;


    public void setName(String name) {
        this.name = name;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public double getScore() {
        return score;
    }

    public int getId() {
        return id;
    }

    public Address getAddress() {
        return address;
    }

    public User(int id, String name, double score, Address address) {
        this.id = id;
        this.name = name;
        this.score = score;
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", score=" + score +
                ", address=" + address +
                '}';
    }
}

2.Address类

package com.shunde.servlet;

public class Address {


    private int id;
    private String value;


    public int getId() {
        return id;
    }

    public String getValue() {
        return value;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Address(int id, String value) {
        this.id = id;
        this.value = value;
    }
}

3.新建UserServlet类继承HttpServlet

package com.shunde.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<User> list = new ArrayList<>();
        list.add(new User(1, "张三", 2.3, new Address(1,"顺德")));
        list.add(new User(2, "李四", 2.3, new Address(2,"佛山")));
        list.add(new User(3, "王五", 2.3, new Address(3,"广州")));
        list.add(new User(4, "赵六", 2.3, new Address(4,"深圳")));
        req.setAttribute("list", list);
        req.getRequestDispatcher("/index.jsp").forward(req,resp);
    }
}

4.在index.jsp文件中使用EL表达式输出

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <table>
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>成绩</th>
        <th>地址</th>
      </tr>
      <tr>
        <td>${requestScope.list[0].id}</td>
        <td>${requestScope.list[0].name}</td>
        <td>${requestScope.list[0].score}</td>
        <td>${requestScope.list[0].address.value}</td>
      </tr>
      <tr>
        <td>${requestScope.list[1].id}</td>
        <td>${requestScope.list[1].name}</td>
        <td>${requestScope.list[1].score}</td>
        <td>${requestScope.list[1].address.value}</td>
      </tr>
      <tr>
        <td>${requestScope.list[2].id}</td>
        <td>${requestScope.list[2].name}</td>
        <td>${requestScope.list[2].score}</td>
        <td>${requestScope.list[2].address.value}</td>
      </tr>
      <tr>
        <td>${requestScope.list[3].id}</td>
        <td>${requestScope.list[3].name}</td>
        <td>${requestScope.list[3].score}</td>
        <td>${requestScope.list[3].address.value}</td>
      </tr>
    </table>


  </body>
</html>

5.编译运行,在地址栏输入
在这里插入图片描述
上面程序是对的,但显然在实际开发中是不可取的,在index.jsp中使用EL表达式输出仍然过于复杂不说,在实际开发中,我们可能不知道在UserServlet中到底创建了几个User对象,因此在index.jsp中使用EL表达式输出的时候也不知道要输出多少
6.在index.jsp中使用java代码for-each循环遍历集合list中的user

<%@ page import="java.util.List" %>
<%@ page import="com.shunde.servlet.User" %><%--
  Created by IntelliJ IDEA.
  User: wang
  Date: 2020/9/7
  Time: 12:03
  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>
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>成绩</th>
        <th>地址</th>
      </tr>

      <%
        //我们在UserServlet中创建的list是存在request中传过来的,
        //因此首先我们要先使用request的get方法将list取出来
        List<User> lists = (List<User>) request.getAttribute("list");
        //将request中的list的内容取到lists中后,就可以遍历lists了
        for(User listss : lists){

          //使用for-each循环后,我们将lists中的内容读取到listss中,
          //如果我们想要使用EL表达式输出listss中的内容
          //就首先需要再将listss中的内容request中
          request.setAttribute("listss", listss);

      %>

      <tr>
        <td>${listss.id}</td>
        <td>${listss.name}</td>
        <td>${listss.score}</td>
        <td>${listss.address.value}</td>
      </tr>

      <%
        }
      %>
      
<%--      <tr>--%>
<%--        <td>${requestScope.list[1].id}</td>--%>
<%--        <td>${requestScope.list[1].name}</td>--%>
<%--        <td>${requestScope.list[1].score}</td>--%>
<%--        <td>${requestScope.list[1].address.value}</td>--%>
<%--      </tr>--%>
<%--      <tr>--%>
<%--        <td>${requestScope.list[2].id}</td>--%>
<%--        <td>${requestScope.list[2].name}</td>--%>
<%--        <td>${requestScope.list[2].score}</td>--%>
<%--        <td>${requestScope.list[2].address.value}</td>--%>
<%--      </tr>--%>
<%--      <tr>--%>
<%--        <td>${requestScope.list[3].id}</td>--%>
<%--        <td>${requestScope.list[3].name}</td>--%>
<%--        <td>${requestScope.list[3].score}</td>--%>
<%--        <td>${requestScope.list[3].address.value}</td>--%>
<%--      </tr>--%>
    </table>


  </body>
</html>

编译运行
在这里插入图片描述
同样在使用for-each遍历循环时仍然存在问题,首先就是list中的每个User对象本来就存在request中,我们先将其从request取出来,后面又将其存进去,太麻烦。其次我们使用EL表达式的目的就是尽量不在jsp文件里写java代码,因此在jsp中使用for-each遍历循环仍然在实际开发中不可取

引入JSTL(只能在jsp文件中使用)

JSTL:JSP Standard Tag Library 标准标签库
JSP为开发者提供的一系列标签,使用这些标签可以完成一些逻辑处理,比如循环遍历集合、让代码更简洁,不在出现JSP脚本穿插的情况。
实际开发中EL和JSTL结合使用,JSTL侧重逻辑处理,EL负责展示数据

JSTL的使用

1.导入jar包(两个:jstl.jar和standard.jar)
下载两个包
应该在WEB-INF中新建lib,将两个jar包导入到lib中
下面弄错了,改一下地址就可以了,

在IDEA项目WEB-INF目录下新建目录lib,将两个包复制到该目录下,此时我们看不到这两个包下的源码(图片中弄错了,懒得改了)
在这里插入图片描述
2.点击
在这里插入图片描述
依次点击
在这里插入图片描述
找到当前项目中的两个jar包
在这里插入图片描述
选择两个jar包,点击ok
在这里插入图片描述
先点击应用,再点击ok
在这里插入图片描述
这个时候可以在项目中看到这两个包的代码就代表导入成功
在这里插入图片描述
2.在jsp文件中导入两个包
在这里插入图片描述
3.使用for-each

<%@ page import="java.util.List" %>
<%@ page import="com.shunde.servlet.User" %><%--
  Created by IntelliJ IDEA.
  User: wang
  Date: 2020/9/7
  Time: 12:03
  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$</title>
  </head>
  <body>
    <table>
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>成绩</th>
        <th>地址</th>
      </tr>

<%--      <%--%>
<%--        //我们在UserServlet中创建的list是存在request中传过来的,因此首先我们要先使用request的get方法将list取出来--%>
<%--        List<User> lists = (List<User>) request.getAttribute("list");--%>
<%--        //将request中的list的内容取到lists中后,就可以遍历lists了--%>
<%--        for(User listss : lists){--%>

<%--          //使用for-each循环后,我们将lists中的内容读取到listss中,如果我们想要使用EL表达式输出listss中的内容--%>
<%--          //就首先需要再将listss中的内容request中--%>
<%--          request.setAttribute("listss", listss);--%>

<%--      %>--%>

		//遍历集合list,将list中的内容存至user中
      <c:forEach items="${list}" var="user">
          <tr>
              <td>${user.id}</td>
              <td>${user.name}</td>
              <td>${user.score}</td>
              <td>${user.address.value}</td>
          </tr>
      </c:forEach>


<%--      <%--%>
<%--        }--%>
<%--      %>--%>

<%--      <tr>--%>
<%--        <td>${requestScope.list[1].id}</td>--%>
<%--        <td>${requestScope.list[1].name}</td>--%>
<%--        <td>${requestScope.list[1].score}</td>--%>
<%--        <td>${requestScope.list[1].address.value}</td>--%>
<%--      </tr>--%>
<%--      <tr>--%>
<%--        <td>${requestScope.list[2].id}</td>--%>
<%--        <td>${requestScope.list[2].name}</td>--%>
<%--        <td>${requestScope.list[2].score}</td>--%>
<%--        <td>${requestScope.list[2].address.value}</td>--%>
<%--      </tr>--%>
<%--      <tr>--%>
<%--        <td>${requestScope.list[3].id}</td>--%>
<%--        <td>${requestScope.list[3].name}</td>--%>
<%--        <td>${requestScope.list[3].score}</td>--%>
<%--        <td>${requestScope.list[3].address.value}</td>--%>
<%--      </tr>--%>
    </table>


  </body>
</html>

4.编译运行
在这里插入图片描述

JSTL的优点

1.提供了统一的标签
2.用于编写各种动态功能

常用标签

1.set
向域对象中添加数组

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:set var="name" value="zhangsan"></c:set>
    ${name}
</body>
</html>

2.out
输出域对象中的数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:set var="name" value="zhangsan"></c:set>

    <c:out value="name" default="未定义"></c:out>
    ${name}
    //上面两行代码的功能一样,均是取出name对应的value
    //但是在name未定义的时候,使用${name}输出是会显示null
    //而是用out就可以给name未定义时设置一个默认值
</body>
</html>

3.remove
删除域对象中的数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:set var="name" value="zhangsan"></c:set>
    <c:out value="name" default="未定义"></c:out>
    <c:remove var="name"></c:remove>
    ${name}
</body>
</html>

4.catch
捕获异常

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:catch var="error">
        <%
            int a = 10/0;
        %>
    </c:catch>
    ${error}
</body>
</html>

编译运行
在这里插入图片描述

条件标签

1.if choose

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:set var="name1" value="zhangsan"></c:set>
    <c:set var="name2" value="lisi"></c:set>
    <c:if test="${name1.equals(name2)}">ok</c:if>
    <c:if test="${!name1.equals(name2)}">no</c:if>

    <hr/>
    <c:choose>
        <c:when test="${name1.equals(name2)}">ok</c:when>
        <c:otherwise>no</c:otherwise>
    </c:choose>

</body>
</html>

在这里插入图片描述

迭代标签for-each

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");
    list.add("g");
    request.setAttribute("list", list);
%>

//迭代全部
<c:forEach items="${list}" var="str">
    ${str}<br/>
</c:forEach>

<hr/>

//从下标2开始迭代
<c:forEach items="${list}" var="str" begin="2">
    ${str}<br/>
</c:forEach>

<hr/>

//从下标2开始迭代,到下标6结束
<c:forEach items="${list}" var="str" begin="2" end="6">
    ${str}<br/>
</c:forEach>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值