学生信息CRUD——配置环境,编写list.jsp
新建项目
1.使用IDEA2020版,新建项目时要有Java Enterprise
。(太新版的如2023版就没有)
2.新建项目。
安装JDK8,Tomcat8,MySql8,IDEA2020,Navicat
目录结构
1.建立css目录,将bootstrap.css
放入,便于后续使用。
2.建立lib目录,将mysql-connector-java-5.1.6.jar
放入。(该文件在Tomcat文件夹的lib目录中)
注意:mysql-connector-java,必须与你的MySQL版本相匹配。例如此处该文件对应的MySQL版本为5.x。若MySQL版本为8.x,则应该换成相对应版本的connector,否则会出错。——另外,对于不同版本的
mysql-connector-java
文件,其初始建立链接的代码会不同。本文是按照5.1.6所写的。具体怎么改,见此文:https://blog.csdn.net/cjnorth/article/details/130479803
这个驱动文件一定要和自己的MySQL版本一致,否则会出问题。
查看自己的MySQL版本:
到官网下载对应驱动:https://dev.mysql.com/downloads/connector/j/
点击Archieves,选择历史版本下载。下图中,选择Operating System为
Platform Independent
,下载zip
格式的。
注意,放入后无法直接使用(如下图,此时的状态并不是一个目录,无法打开)
需要右键,点击Add as library
,之后才能正常使用(如下图,同时它变成了一个可打开的目录状态)。
3.建立student目录,我们要写的jsp代码就放在里面。
注意命名格式,如list.jsp
、add.jsp
这种不带后缀的,主要负责前端页面显示,中间会穿插部分功能代码。
而例如add_success.jsp
、upd_success.jsp
这种带后缀的,都是只负责实现后端函数,供前端调用的。
功能模块实现
学生信息展示list.jsp
数据库
使用Navicat,在数据库中新建一个student
表。
表中有四个字段:
字段名 | 类型 | 备注 |
---|---|---|
sid | int | 学生ID;主键,非空,自动递增 |
sname | varchar(20) | 学生姓名 |
money | double | 生活费 |
birthday | date | 出生日期 |
代码
在student目录下,新建一个
list.jsp
文件。
head内容
<head>
<title>学生信息列表</title>
<link href="../css/bootstrap.css" rel="stylesheet">
</head>
1.设置title标签内容,标题。
2.使用link标签,设置属性
href
将刚才准备好的css引入过来,便于前端页面的美观;设置属性rel="stylesheet"
(这个不太清楚原因,但都要这样设一下)。
body内容
目的是实现一个列表清单,上面显示数据库
student表
中所有人的(学号,姓名,生活费,出生日期)
。因此,前端主要使用
<table>
标签,实现一个表格的显示。
各个标签说明
1.table标签
<table class="table table-bordered table-cover" style="width: 50%" align="center">
......
</table>
对table标签定义相关属性,可修改其css样式,如上所示。
2.caption标签
<caption>
<h2><center>学生信息展示</center></h2>
</caption>
<caption>
标签定义表格标题。caption 标签必须紧随 table 标签之后。您只能对每个表格定义一个标题。
同时,使用h2标签让字变大,使用center标签让字居中。
3.tr标签
<tr>
标签定义 HTML 表格中的行。
<tr>
元素包含一个或多个元素。
4.td标签
<td>
标签定义 HTML 表格中的标准数据单元格。
HTML 表格有两种单元格:
- 标题单元格 - 包含标题信息(使用
<th>
元素创建) - 数据单元格 - 包含数据(使用
<td>
元素创建)
默认情况下,<td>
元素中的文本是普通的,并且左对齐。
<tr>
<td>学号</td>
<td>姓名</td>
<td>生活费</td>
<td>出生日期</td>
<td>操作</td>
</tr>
上面代码是表格第一行的内容,即表头。
后续,应当由数据库动态地生成每一行学生信息,如下所示:
<tr>
<td>(数据库中第k个学生的sid)</td>
<td>(数据库中第k个学生的sname)</td>
<td>(数据库中第k个学生的money)</td>
<td>(数据库中第k个学生的birthday)</td>
<td>(一些操作按钮,例如添加、修改、删除等)</td>
</tr>
接下来,问题就是如何在jsp文件里链接数据库,获取数据、并显示出来。
获取ResultSet对象
首先,它本质上是在编写Java代码。
jsp文件的特点是Java代码与前端代码可以写在同一个文件里。
写Java代码的部分,用
<% 表达式 %>
括起来即可。
Class.forName("org.gjt.mm.mysql.Driver");
不太清楚这句话的原理,但它应该是和这个文件有关。
因此,如果使用的驱动文件不是这个版本的,那么它对应的目录文件也会不同,所以这句代码引号中的内容并不是固定不变的。
例如,对于MySQL8.0版本,这句话就要写
Class.forName("com.mysql.cj.jdbc.Driver");
或者不写也可以。
Connection conn = DriverManager("jdbc:mysql://localhost:3306/mywork", "root", "123456");
Java DriverManager.getConnection()方法:获取数据库连接。
Connection(String url,String user,String password)
- url:访问数据库的 URL 路径。
jdbc:mysql://localhost:3306/mywork
- 3306是MySQL端口号,mywork是我创建的数据库名称。
- user:是访问数据库的用户名。
root
- password:连接数据库的密码。
123456
注意:三个参数都是字符串类型,都必须用双引号引起来。
PreparedStatement pstmt = conn.prepareStatement("select * from student");
PreparedStatement是Java JDBC API的一部分,它提供了一种更有效率和安全的方式来向SQL语句传递参数。PreparedStatement允许我们执行带有动态参数的SQL语句,这些参数可以在执行SQL语句之前预编译,从而提高执行效率。PreparedStatement对象可以通过Connection对象创建,并接受一条SQL语句作为参数。
PreparedStatement还提供了一种用于执行查询的方法executeQuery(),以及用于执行非查询的方法executeUpdate()。
ResultSet rs = pstmt.executeQuery();
executeQuery()方法是处理查询操作,当用select对数据库做查询时,用该方法。且executeQuery()方法会建立一个ResultSet的对象保存查询的结果。
Insert、Update、delete等操作,可用executeUpdate()方法执行。
总结
ResultSet类,是Java JDBC编程中的一个核心类,用于处理查询结果。
ResultSet是Java中的一个接口,它代表了一个数据库查询的结果集。结果集通常是一个表格,包含了一组行和列,这些行和列包含了查询所返回的数据。可以通过ResultSet对象的方法来遍历和操作查询结果。
三个步骤:
1)建立数据库连接。
2)创建一个Statement对象,用于执行SQL查询。
3)执行SQL查询,获得一个ResultSet对象。
ResultSet常用操作
1.resultSet.next()
ResultSet
对象中有一个光标,初始位置在第一行之前。可以使用next()
方法将光标移动到下一行,如果存在下一行数据,该方法返回true
,否则返回false
。
while (resultSet.next()) {
// 遍历每一行数据
}
2.resultSet.getObject()
resultSet.getObject()
作用是从结果集中获取指定列的值,并以Object类型返回。
用完后关闭
rs.close();
pstmt.close();
conn.close();
在使用完
ResultSet
后,务必记得关闭它,以释放相关资源。关闭顺序通常是先关闭ResultSet
,然后是Statement
,最后是Connection
。
如何动态获得数据库数据
1.用<% (表达式) %>
将Java代码括起来。注意,不要把html的内容也括进来。
2.建立数据库链接,获取ResultSet对象。
3.<%= %>
为输出表达式。用<%= (表达式) %>
输出数据。注意:“=”号前不能有空格,表达式后不需要打分号。
4.用完后关闭链接。
因此,代码如下:
<%
Class.forName("org.gjt.mm.mysql.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
PreparedStatement pstmt = conn.prepareStatement("select * from student");
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
%>
<tr>
<td><%= rs.getObject("sid") %></td>
<td><%= rs.getObject("sname") %></td>
<td><%= rs.getObject("money") %></td>
<td><%= rs.getObject("birthday") %></td>
<td>
<a href="del_success.jsp?sid=<%= rs.getObject("sid") %>" class="btn btn-danger">删除</a>
<a href="upd.jsp?sid=<%= rs.getObject("sid") %>" class="btn btn-primary">修改</a>
<a href="add.jsp" clss="btn-success">添加</a>
</td>
</tr>
<%
}
rs.close();
pstmt.close();
conn.close();
%>
对三个操作按钮的说明
1.使用<a>
标签
在HTML中,<a>
标签用于创建超链接,其基本结构如下:
<a href="目标地址"> 链接文本 </a>
- href属性: 指定链接的目标地址。可以是一个绝对URL(以 http:// 或 https:// 开头)、相对URL(相对于当前页面的路径)或者一个锚点(页面内跳转)。
- 链接文本: 用户点击的可见文本内容。
2.设置href
属性
对于“添加”操作,其点击后的效果是,跳转到一个“填写相应学生信息”的新页面,至于提交与否,在新页面中再去考虑。因此,href = "add.jsp"
,是一个前端页面。
对于“修改”操作,与添加操作是类似的,但区别在于,修改操作所跳转到的页面,并不是一些空白的输入框,而是显示用户当前信息的输入框。因此,修改操作跳转后的页面,相当于添加操作跳转到的页面的基础之上进行查询操作。——所以,你也要告诉它查询的是哪个用户的信息,即传递参数sid。(如何传参,看下面)
注意:对于“删除”操作,其点击后的效果是,该条数据从数据库中删除,而并非页面跳转,因此,它是href = "del_success.jsp"
(注,之前也说过,带有_success
后缀的jsp文件主要实现函数功能而非页面展示),点击后执行其中函数功能,从而将数据从数据库中删除。但问题是,点击这个删除按钮,怎么就知道删除的是这个学生的数据?——所以,在删除的href链接中要“传参”,即在原链接后接"?"
符号,在其后跟上要传递的参数,即?sid=<%=rs.getObject("sid")%>
。同样地,传递的sid也是从数据库中获取的。
list.jsp完整代码
<%@ page import="java.sql.*" %><%--
Created by IntelliJ IDEA.
User: 11202
Date: 2024/4/3
Time: 10:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生信息列表</title>
<link href="../css/bootstrap.css" rel="stylesheet">
</head>
<body>
<table class="table table-bordered table-hover" style="width: 50%" align="center">
<caption>
<h2><center>学生信息表</center></h2>
</caption>
<tr>
<td>学号</td>
<td>姓名</td>
<td>生活费</td>
<td>出生日期</td>
<td>操作</td>
</tr>
<%
Class.forName("com.mysql.cj.jdbc.Driver"); //这一句删除也可以
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
PreparedStatement pstmt = conn.prepareStatement("select * from student");
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
%>
<tr>
<td><%= rs.getObject("sid") %></td>
<td><%= rs.getObject("sname") %></td>
<td><%= rs.getObject("money") %></td>
<td><%= rs.getObject("birthday") %></td>
<td>
<a href="del_success.jsp?sid=<%= rs.getObject("sid") %>" class="btn btn-danger" >删除</a>
<a href="upd.jsp?sid=<%= rs.getObject("sid") %>>" class="btn btn-primary">修改</a>
<a href="add.jsp" class="btn btn-success">添加</a>
</td>
</tr>
<%
}
rs.close();
pstmt.close();
conn.close();
%>
</table>
</body>
</html>