JSP
一、JSP入门
1.JSP概述
1.1 什么是JSP
Java server page(java服务器页面). JSP本质就是Servlet
它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP=html(js,css)+java(servlet)+jsp(内置对象、指令、动作标签等等)特有的内容
1.2.JSP产生的原因
需求: 我们要向页面动态输出一个表格. 发现特别的繁琐
servlet在展示页面的时候,相当的繁琐。sun公司为了解决这个问题,参照asp开发了一套动态网页技术jsp。
1.3 JSP执行原理
JSP会翻译(通过默认的JspServlet,JSP引擎)成Servlet(.java),Servlet编译成class文件
JSP执行流程
第一次访问的xxx.jsp时候,服务器收到请求,JspServlet会去查找对应的jsp文件
找到之后,服务器会将这个jsp文件转换成java文件(Servlet)
服务器编译java文件,生成class文件
服务器运行class文件,生成动态的内容
服务器收到内容之后,返回给浏览器
1.4.小结
- JSP: java 服务器 页面, sun公司定义的动态资源, 本质就是Servlet
- JSP产生的原因: Servlet在动态展示很麻烦, jsp展示方便一点
2.JSP基本语法
2.1 JSP脚本
我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:
类型 | 翻译成Servlet对应的部分 | 注意 |
---|---|---|
<%…%>:Java程序片段 | 翻译成Service()方法里面的内容, 局部的 | |
<%=…%>:输出表达式 | 翻译成Service()方法里面的内容,相当于调用out.print() | 输出表达式不能以;结尾 |
<%!..%>:声明成员变量(肯定不用) | 翻译成Servlet类里面的内容 |
- eg
<%
for(int i = 0; i < 10;i++){
out.print("i="+i);
%>
<hr/>
<%
}
%>
2.2JSP注释
注释类型 |
---|
HTML注释 |
JAVA注释 //; /* */ |
JSP注释; <%–注释内容–%> |
注释快捷键:Ctrl+Shift+/
2.3.小结
- 脚本
- <%%> 翻译成了service()方法里面的局部内容
- <%=%> 输出, 翻译成了service()方法里面的out.print()
- <%!%> 翻译成了servlet类里面的全局内容
- 注释
- 注释快捷键:Ctrl+Shift+/
登录案例的优化
一、优化登录失败的效果
LoginServlet的代码
package com.work.servlet;
import com.work.bean.User;
import com.work.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;
/**
* @author Leevi
* 日期2020-08-24 16:24
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0. 解决乱码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//1. 获取客户端提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 获取客户端输入的验证码
String checkCode = request.getParameter("checkCode");
// 获取服务器生成的验证码
//从session中获取服务器端生成的验证码
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
//校验验证码
if (code.equalsIgnoreCase(checkCode)) {
//验证码正确,当验证码正确了,才进行用户名和密码的校验
//2. 使用DBUtils执行SQL语句校验用户名和密码
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
String sql = "select * from user where username=? and password=?";
try {
User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);
if (user != null) {
//登录成功
response.getWriter().write("登录成功");
}else {
//登录失败:用户名或密码错误
String errorMsg = "用户名或密码错误";
//将errorMsg字符串存储到哪个域对象??? request
request.setAttribute("errorMsg",errorMsg);
//优化登录:跳转回到登录页面,并且进行错误信息的提示
//跳转方式有两种:1. 重定向 2. 请求转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (SQLException e) {
e.printStackTrace();
//登录失败: 登录失败
//登录失败:验证码错误
String errorMsg = "登录失败";
//将errorMsg存储到request域对象
request.setAttribute("errorMsg",errorMsg);
//跳转到login.jsp
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}else {
//登录失败:验证码错误
String errorMsg = "验证码错误";
//将errorMsg存储到request域对象
request.setAttribute("errorMsg",errorMsg);
//跳转到login.jsp
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
login.jsp的代码
<%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/8/26
Time: 15:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<%
//从request域对象中取出errorMsg
String errorMsg = (String) request.getAttribute("errorMsg");
if (errorMsg == null) {
errorMsg = "";
}
%>
<h1>用户登录</h1>
<span style="color: red"><%=errorMsg%></span>
<form action="login" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
验证码:<input type="text" name="checkCode"><br>
<img src="checkCode" id="code"><a href="javascript:;" οnclick="changeCheckCode()">换一换</a><br>
<input type="submit" value="登录"/>
</form>
<script>
//实现点击换一换,切换验证码图片
function changeCheckCode() {
//具体怎么去切换验证码呢? 也就是重新设置img标签的src
//如果直接设置src为"checkCode"的话,那么浏览器就会从缓存中获取验证码图片,所以我们要让浏览器避开缓存
//浏览器如果发现每次请求的路径不一样,就不会找缓存
document.getElementById("code").setAttribute("src","checkCode?date="+new Date())
}
</script>
</center>
</body>
</html>
二、优化登录成功的效果
LoginServlet的代码
/**
* @author Leevi
* 日期2020-07-12 16:44
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1. 解决乱码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//2. 获取请求参数username和password
String username = request.getParameter("username");
String password = request.getParameter("password");
//获取浏览器传入的验证码(用户输入的验证码)
String checkCode = request.getParameter("checkCode");
//获取服务器生成的验证码,从session里面根据key "code"取出
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
//3. 校验验证码
if (code.equalsIgnoreCase(checkCode)) {
//验证码校验通过
//进行用户名和密码的校验
//3. 连接数据库校验用户名和密码,也就是执行查询的SQL语句
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
String sql = "select * from user where username=? and password=?";
//执行查询,查询一条数据,封装到User中
User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);
//判断是否登录成功
if (user != null) {
//登录成功
//将user存储到session中
session.setAttribute("user",user);
//跳转到成功页面success.jsp
response.sendRedirect("/userDemo/success.jsp");
}else {
//往request域对象中存放"用户名或密码错误"
request.setAttribute("msg","用户名或密码错误");
//请求转发跳转到login.jsp页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}else {
//往request域对象中存放"验证码错误"
request.setAttribute("msg","验证码错误");
//请求转发跳转到login.jsp页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
//往request域对象中存放"服务器异常请稍后再试"
request.setAttribute("msg","服务器异常请稍后再试");
//请求转发跳转到login.jsp页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
success.jsp的代码
<%@ page import="com.work.pojo.User" %><%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/14
Time: 16:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成功页面</title>
</head>
<body>
<%
//从session域对象中取出user
User user = (User) session.getAttribute("user");
//取出nickname
String nickname = null;
if (user != null) {
nickname = user.getNickname();
}
%>
<h1>欢迎回来,<%=nickname%></h1>
</body>
</html>
案例-记住用户名案例
1.需求
2.分析
-
在LoginServlet里面, 如果用户登录成功:
//判断用户是否勾选了记住用户名
//勾选了, 把用户名存到Cookie
//未勾选则清除已经保存的用户名
-
在login.jsp页面 从cookie取出展示
3.实现
- LoginServlet
package com.work.servlet;
import com.work.pojo.User;
import com.work.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author Leevi
* 日期2020-10-14 14:56
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//1. 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//获取是否记住用户名
String remember = request.getParameter("remember");
//判断是否记住用户名
Cookie cookie = new Cookie("username",username);
cookie.setPath(request.getContextPath());
if (remember != null) {
//表示勾上了,那么就记住用户名: 将用户名存储到cookie中,发送给客户端
cookie.setMaxAge(7*24*60*60);
}else {
//表示没有勾上,就要清除之前保存在cookie中的username
cookie.setMaxAge(0);
}
response.addCookie(cookie);
//获取验证码: 用户输入的验证码
String checkCode = request.getParameter("checkCode");
//从session中获取服务器生成的验证码
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
//校验验证码: 使用用户输入的验证码和服务器生成的验证码进行校验
if (code.equalsIgnoreCase(checkCode)) {
//验证码正确: 才会去校验用户名和密码
//2. 连接数据库校验用户名和密码
String sql = "select * from user where username=? and password=?";
QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
try {
User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);
if (user != null) {
//登录成功
//将当前用户的信息存起来:session
session.setAttribute("user",user);
//登录成功之后,要跳转到success.jsp页面,并且显示"欢迎XXX登录"
request.getRequestDispatcher("success.jsp").forward(request, response);
}else {
//登录失败
String errorMsg = "用户名或密码错误";
//将errorMsg存储到域对象中
request.setAttribute("errorMsg",errorMsg);
//跳转回到登录页面
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
String errorMsg = "用户名或密码错误";
request.setAttribute("errorMsg",errorMsg);
request.getRequestDispatcher("login.jsp").forward(request, response);
//response.getWriter().write("用户名或密码错误");
}
}else {
//验证码错误
String errorMsg = "验证码错误";
request.setAttribute("errorMsg",errorMsg);
request.getRequestDispatcher("login.jsp").forward(request, response);
//response.getWriter().write("验证码错误");
}
}
}
- login.jsp
<%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/10/15
Time: 14:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<%
//从request域对象中取出errorMsg的值,并且显示在页面上
String errorMsg = (String) request.getAttribute("errorMsg");
if (errorMsg == null) {
errorMsg = "";
}
String username = "";
//获取名为username的cookie的值
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
username = cookie.getValue();
}
}
}
%>
<div style="color: red"><%=errorMsg%></div>
<form action="login" method="post">
<%--将变量username的值显示到用户名输入框--%>
用户名<input type="text" name="username" value="<%=username%>"><br>
密码<input type="password" name="password"><br>
验证码<input type="text" name="checkCode"><br>
<img id="checkCode" src="checkCode"/>
<a href="javascript:;" οnclick="changeCheckCode()">换一换</a>
<br>
<input type="checkbox" name="remember">记住用户名<br>
<input type="submit" value="提交">
</form>
<script>
//声明一个方法,切换验证码图片
function changeCheckCode() {
//怎么切换验证码图片呢? 再一次请求验证码图片路径,也就是重新设置img标签的src
//因为我们的访问路径没有改变,所以服务器认为我们发送的是同一次请求,所以服务器会返回一个状态码304,所以我们会从缓存中获取数据
//如果每次访问的url路径有变化,就绝不会从缓存中获取数据
document.getElementById("checkCode").setAttribute("src","checkCode?a="+new Date())
}
</script>
</body>
</html>
4.小结
- 用户勾选了记住用户名,我们把用户名存到Cookie里面
- 在login.jsp里面 从cookie取出用户名展示
二、EL表达式
1.EL表达式概述
1.1.什么是El表达式
Expression Language: 表达式语言, jsp2.0之后内置在jsp里面
目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <% %>)
1.2. EL语法
${el表达式}
1.3. EL表达式的用途
1.获取数据. 获取的是域(request,session,ServletContext)对象中存储的数据
2.EL执行运算
- 使用EL表达式获取cookie中的数据
2.El获取数据
2.1获取简单数据类型数据
语法:${requestScope|sessionScope|applicationScope.属性名};
快捷写法:${属性名}, 属性名就是存在域对象里面的key
<%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/15
Time: 8:52
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用EL表达式获取域对象中的简单类型的数据</title>
</head>
<body>
<%
//往域对象存值
application.setAttribute("msg","applicationValue");
//session.setAttribute("msg","sessionValue");
//request.setAttribute("msg","requestValue");
//在我们开发过程中,是否会往多个域对象中存放同一个key??? 这是不会的
//所以我们用el表达式获取域对象里面的数据,还可以简化成${key} 获取范围最小的域对象中的这个key对应的值
%>
获取的application域对象中的msg=${applicationScope.msg}<br>
获取session域对象中的msg=${sessionScope.msg}<br>
获取request域对象中的msg=${requestScope.msg}<br>
获取存放在域对象中的msg=${msg}
</body>
</html>
2.2获取数组
语法: ${key[下标]} key就是域对象里面存的key
2.3获取list
语法:${list属性名[index]}或者${list属性名.get(index)};list属性名就是存入域对象里面的key
2.4获取Map
语法:${map属性名.键}或者${map属性名.get("键")},map属性名就是存入域对象里面的key
2.5 获取bean
语法:${key.javabean属性}
依赖getxxx()方法; eg: getPassword()—去掉get–>Password()----首字母小写—>password
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.work.pojo.User" %><%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/15
Time: 9:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用EL表达式获取存储在域对象中的复杂类型的数据</title>
</head>
<body>
<%
//往域对象中存放数组类型的数据
String[] arr = {"张三","李四","王五","赵六","田七","狗娃"};
request.setAttribute("arr", arr);
//往域对象中存放一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("田七");
request.setAttribute("list", list);
//往域对象中存放一个map
Map<String,String> map = new HashMap<String,String>();
map.put("name", "张三");
map.put("password", "123456");
map.put("nickname", "张三丰");
request.setAttribute("map", map);
//往域对象中存放一个pojo对象
User user = new User(1, "jay", "台湾省");
request.setAttribute("user",user);
%>
获取存放在request域对象中的数组中的第三个元素:${arr[2]}<br>
<%--
在el表达式中,只要是根据下标获取元素,都可以写[index]
--%>
获取存放在request域对象中的集合中的第四个元素:${list[3]}<br>
<%--
在el表达式中,只要是根据对应的属性的get方法去获取数据,都可以写成".属性名" 或者 ["属性名"]
--%>
获取存储在request域对象中的map中的nickname:${map.nickname}<br>
获取存放在request域对象中的user的address属性的值:${user.address}
</body>
</html>
3.EL执行运算
3.1算数运算
+,-,*,/
- +不能拼接字符串,如果+两端是字符串,那么会将字符串转换成数字之后再进行加法运算,如果+两端的字符串无法转换成数字,则会报错
3.2 逻辑运算
< >= <= != ==
3.3 关系运算
&& || !
3.4 非空判断【重点】
empty,1. 判断一个对象是否为null, 2. 判断集合长度是否为0, 3. 判断一个字符串是否为空字符串
not empty
语法: ${empyt 属性名};属性名 就是域对象里面的key值
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.work.pojo.User" %><%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/15
Time: 9:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>empty 运算符的介绍</title>
</head>
<body>
<%
//el表达式中的empty可以判断一个字符串是否为空字符串,一个对象是否为null,一个集合的长度是否为0
List<String> list = new ArrayList<String>();
list.add("张三丰");
request.setAttribute("list", list);
request.setAttribute("msg","requestValue");
User user = new User();
request.setAttribute("u",user);
%>
判断域对象中的list集合的长度是否为0: ${empty list}<br>
判断域对象中的msg字符串是否为空字符串: ${empty msg}<br>
判断域对象中的user是否为null : ${empty u}<br>
</body>
</html>
4.使用EL表达式获取存放在cookie中的数据(扩展)
语法:${cookie.cookie的name.value}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用el表达式获取存储在cookie中的数据</title>
</head>
<body>
<%--
jsp里面是内置session对象,有了session对象,那么浏览器就会携带一个名为"JSESSIONID"的cookie
我们的目标就是获取"JSESSIONID"的值
--%>
<%
Cookie[] cookies = request.getCookies();
String cookieValue = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("JSESSIONID")) {
cookieValue = cookie.getValue();
}
}
}
%>
使用原始方式获取的JSESSIONID的值为: <%=cookieValue%><br>
<%--
${cookie}表示获取这次请求中的所有cookie对象
${cookie.JSESSIONID}表示获取名为"JSESSIONID"的cookie对象
${cookie.JSESSIONID.value}表示获取名为"JSESSIONID"的cookie对象的value
--%>
使用EL表达式获取JSESSIONID的值为: ${cookie.JSESSIONID.value}
</body>
</html>
三、JSTL标签库
1.JSTL标签库概述
1.1 什么是JSTL标签库
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。这个JSTL标签库没有集成到JSP的, 要使用的话, 需要导jar包.
1.2 JSTL标签库的作用
为了简化在jsp页面上操作数据; eg: 遍历数据 判断数据等
1.3 JSTL标签库的类别
2.JSTL核心标签库
2.1核心标签库使用步骤
- 在JSP页面上导入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.2if标签
- 语法
<c:if test="el表达式${..}">
</c:if>
- 实例
<%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/8/27
Time: 10:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>使用jstl中的if标签进行判断</title>
</head>
<body>
<%
//往域对象中存储一个age
request.setAttribute("age",17);
//目标:判断age的值,如果大于等于18,则在浏览器页面上输出"已成年",否则输出"未成年"
//jstl的使用步骤:1. 导入jar包 2. 在jsp页面通过taglib指令引入核心标签库 3. 使用标签
%>
<%--
if标签有一个属性叫做test,它表示判断表达式,需要结合el一起使用
如果要表示相反的判断,则再添加一个if标签,然后写相反的条件就行
if标签还有一个属性叫做var,表示将判断结果存储进域对象时候的key(了解)
if标签的第三个属性叫做scope,表示将判断结果存储进哪个域对象(了解)
--%>
<c:if test="${age >= 18}" var="flag" scope="request">
已成年
</c:if>
<c:if test="${age < 18}">
未成年
</c:if>
<br>
${flag}
</body>
</html>
-
小结
- 语法
<c:if test="${} "></c:if>
- 特点
- 如果test里面的是true, if标签体里面的就会执行
- 如果test里面的是false, if标签体里面的就不会执行
- 没有else的
2.3choose标签
- 实例
<%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/15
Time: 9:59
To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl中的choose标签的使用介绍</title>
</head>
<body>
<%
request.setAttribute("course","PHP");
%>
<c:choose>
<%--
一个when标签表示一个条件
--%>
<c:when test="${course == 'Java'}">
学习Java
</c:when>
<c:when test="${course == 'Android'}">
学习Android
</c:when>
<c:when test="${course == 'C++'}">
学习C++
</c:when>
<c:otherwise>
学习,学个屁!!!
</c:otherwise>
</c:choose>
</body>
</html>
2.4 foreach标签
- 简单的使用:
<%--
jstl中的forEach标签是用来代替for循环语句
目标1: 在浏览器上显示0-9的数字
begin属性: 从哪个下标开始遍历, 如果不写默认是从0开始
end属性: 到哪个下标结束遍历,如果不写默认是遍历到集合/数组的最后一个元素
step属性: 表示遍历时候的步长,默认步长是1
var属性: 表示将遍历的结果存放进域对象时候的key
--%>
<c:forEach begin="0" end="9" step="1" var="i">
${i}
</c:forEach><br>
-
复杂的使用遍历集合:
<% //往域对象存储一个集合 List<String> list = new ArrayList<String>(); list.add("张三"); list.add("李四"); list.add("王五"); list.add("赵六"); list.add("田七"); request.setAttribute("list", list); %> <c:forEach begin="0" end="9" step="1" var="i"> ${i} </c:forEach><br> <%-- 通过items属性指定遍历域对象里面的list 通过var属性指定遍历出来的每个数据存储到域对象时候的key --%> <c:forEach items="${list}" var="username"> ${username} </c:forEach>
-
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象); 这个对象记录着当前遍历的元素的一些信息: index:返回索引。从0开始 count:返回计数。从1开始 last:是否是最后一个元素 first:是否是第一个元素
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: Fanyi Xiao
Date: 2020/7/15
Time: 10:15
To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>forEach 标签的varStatus属性的介绍</title>
</head>
<body>
<%
//往域对象存储一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("田七");
request.setAttribute("list", list);
%>
<%--
forEach标签的varStatus属性:指定将遍历出来的每一个元素的状态存储进域对象时候的key
遍历出来的每一个元素都有一些状态(属性),比如:
下标 index:
计数 count:
当前元素的值 current:
是否是第一个元素:
是否是最后一个元素
--%>
<table border="1" cellspacing="0" width="700" align="center">
<tr>
<th>下标</th>
<th>计数</th>
<th>姓名</th>
<th>是否是第一个元素</th>
<th>是否是最后一个元素</th>
</tr>
<c:forEach items="${list}" varStatus="vst">
<tr>
<td>${vst.index}</td>
<td>${vst.count}</td>
<td>${vst.current}</td>
<td>${vst.first}</td>
<td>${vst.last}</td>
</tr>
</c:forEach>
</table>
</body>
</html>