一、抛出问题
1.1 先看这么一段代码
-
UserServlet.java
package com.sunshine.servlet; import com.sunshine.entity.User; 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.util.ArrayList; import java.util.List; /** * @author 田港 * @version 1.0 * @date 2021-04-02 23:42 */ @WebServlet("/user") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<User> userList = new ArrayList<>(); userList.add(new User(1, "张三", 78.6)); userList.add(new User(2, "李四", 79.6)); userList.add(new User(3, "王五", 80.2)); req.setAttribute("userList", userList); req.getRequestDispatcher("index.jsp").forward(req, resp); } }
-
index.jsp
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021-03-31 Time: 15:32 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> </tr> <tr> <td>${requestScope.userList[0].id}</td> <td>${requestScope.userList[0].name}</td> <td>${requestScope.userList[0].score}</td> </tr> <tr> <td>${requestScope.userList[1].id}</td> <td>${requestScope.userList[1].name}</td> <td>${requestScope.userList[1].score}</td> </tr> <tr> <td>${requestScope.userList[2].id}</td> <td>${requestScope.userList[2].name}</td> <td>${requestScope.userList[2].score}</td> </tr> </table> </body> </html>
首先我们写了一段
Servlet
代码,将 user 数据写到集合中,然后传递给 jsp 文件。那么问题来了,前端如果不知道你的集合有几个对象,那么怎么搞🌓 走个 for 循环试试 -
for 遍历
<%@ page import="java.util.List" %> <%@ page import="com.sunshine.entity.User" %><%-- Created by IntelliJ IDEA. User: Administrator Date: 2021-03-31 Time: 15:32 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> </tr> <% List<User> userList = (List<User>) request.getAttribute("userList"); for (User user : userList) { %> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.score}</td> </tr> <% } %> </table> </body> </html>
先通过 request.getAttribute() 拿到里面存储的东西,这个东西是个 list,然后我们遍历这个 list,就是每一个 user,然后我我们利用 EL 表达式输出,逻
辑没有什么问题,但是我们发现页面数据是空的,这是为什么?我们在 request.setAttribute()的时候,存储的是什么,存储的是userList
,我们通过 EL 表达式想得到什么,想得到的是user.id
等等,我们拿不到数据的原因是忘记了 EL 本质是 getAttribute,取值是根据 setAttribute 的 name 取值的,这
就是我们取不到值的原因。我们需要在for
循环中加上一句request.setAttribute("user", user);
,下面这段代码:<% List<User> userList = (List<User>) request.getAttribute("userList"); for (User user : userList) { request.setAttribute("user", user); <%--新增--%> %> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.score}</td> </tr> <% } %>
-
这么写起来好麻烦,访问的时候记得加上
/user
路径。
二、JSTL
2.1 概述
全称JSP Standard Tag Library
,JSP 标准标签库,JSP 为开发者提供的一系列的标签,使用这些标签可以完成一些逻辑处理,比如循环遍历结合,让代码更加简洁,不在出现 JSP 脚本穿插的情况。实际开发中 EL 和 JSTL 结合起来使用,JSTL 侧重逻辑处理,EL 负责展示数据。
2.2 JSTL 简单使用
-
需要导入 jar 包(
jstl.jar
,standard.jar
) -
在 JSP 页面开始的地方导入 JSTL 标签库
<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core" %>
prefix
代表我们将使用字母jstl
表示uri
,uri
表示我们要调用的标签库,调用的时候使用prefix
指定的指令进行调用。 -
在需要的地方使用
<jstl:forEach items="${userList}" var="user"> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.score}</td> </tr> </jstl:forEach>
-
那么这端
JSTL
代码如何执行的呢,其实底层就是那段我们利用for
循环配合EL
表达式写的代码。 -
prefix
一般写成c
,代表core
。核心标签库。
2.3 JSTL的优点
- 提供了統一的标签
- 可以用于编写各种动态功能
2.4 JSTL 常用标签
set、out、remove、catch
-
set
:向域对象中添加数据,类似于request.setAttribute(key, value)
。<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <body> <c:set var="name" value="tom" scope="request"></c:set> ${name} </body>
这时可以利用
EL
取出 name,若是不指定scope
,则根据优先级page->request->session->application
进行保存。还可以存储对象。
<% User user = new User(1, "张三", 66.6); request.setAttribute("user", user); %> ${user.name} <hr> <c:set target="${user}" property="name" value="李四"></c:set> ${user.name}
使用
target
属性配合EL
表达式,得到我们的对象,然后property
表示我们要修改的user
的属性,value
表示我们要修改的值。 -
out
,获取域对象中的数据<c:set var="name" value="tom"></c:set> <c:out value="${name}" default="未定义"></c:out>
-
remove
删除域对象中的数据<c:set var="name" value="tom"></c:set> <c:out value="${name}" default="未定义"></c:out> <c:remove var="name" scope="page"></c:remove> <c:out value="${name}" default="未定义"></c:out>
-
catch
:捕获异常,并且在页面做一个展示<c:catch var="error"> <% int a = 10/0; %> </c:catch> ${error}
-
条件标签:
if
、choose
<c:set var="num1" value="1"></c:set> <c:set var="num2" value="2"></c:set> <c:if test="${num1>num2}">ok</c:if> <c:if test="${num1<num2}">fail</c:if> <hr> <c:choose> <c:when test="${num1>num2}">ok</c:when> <c:otherwise>fail</c:otherwise> </c:choose>
-
迭代标签:
forEach
<c:forEach items="${userList}" var="user" varStatus="std"> ${sta.index}--${user}<br> </c:forEach>
三、扩展
以上都是核心标签库,还有其他的,比如格式化标签库。更多详解访问✈️
四、心情记录
我的价值和认同应该是完全一致的,这种状态下我应该是活的很开心。但是在这个成长的过程中,我认为值得的东西跟这个社会认同之间,存在差异,奋斗是为了尽量不被这个社会不好的一面所同化。😸