新建项目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>