学生信息CRUD——添加、修改、删除
在上一小节中,我们写好了list.jsp
,用一个table表格显示数据库student
表中的各个学生的(学号,姓名,生活费,出生日期)
,并对表格每一行的数据都配有三个操作按钮——删除、修改、增加。
<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>
此处,讨论add.jsp
与upd.jsp
页面内容该如何呈现。
一、添加学生页面add.jsp
使用到的标签
1.form标签
表单在网页中主要负责数据采集功能。HTML中的标签,就是用于采集用户输入的信息,并且通过标签的提交操作,把采集到的信息提交到服务器端进行处理。
一个完整的表单应该由3部分组成:表单标签、表单域(输入框)、提交按钮。
<form>表单标签
<input type="text">表单域
<button type="submit">提交按钮</button >
</form>
2.form标签属性
- action:发送数据的地址
- name:表单名称
- method:提交方式
- Get:提交的数据url可以看到,用于提交少量数据
- Post:提交的数据url看不到,用于提交大量数据
<form action="#" name="login" method="POST"></form>
3.input标签
type属性值 | 说明 |
---|---|
text | 文本框,用于输入单行文本 |
password | 密码框 |
radio | 单选框 |
checkbox | 多选框 |
file | 上传文件 |
date | 日期选择框 |
- value的作用:
- 预先填充表单中的字段值,方便用户进行编辑或提供默认值;
- 方便以后将这些值传递给服务器进行处理。
4.下拉菜单select option
注意:如果需要设置默认选中,则需要添加selected属性值。
下拉菜单:
<select>
<option>广州市</option>
<option>海珠区</option>
<option>荔湾区</option>
<option selected>增城区</option>
<option>越秀区</option>
</select>
注:上次说过的标签,如table、tr、td等,此处不再说明。
页面主要内容
与之前“显示学生信息”不同,此处需要将数据提交给服务器,因此需要使用<form>
标签来设计整体框架。
在form
表单之内,显示的是一个<table>
表格,包含每行<tr>
,每行中的表项<td>
,表项当中的<input>
输入框,最终的提交按钮等。
head内容
与list.jsp
同样,head的内容也包含两部分。
<head>
<title>添加学生信息</title>
<link href="../css/bootstrap.css" rel="stylesheet">
</head>
body内容
1.form表单
<body>
<form action="add_success.jsp">
//内容
</form>
</body>
设置
action="add_success.jsp"
属性,在表单提交后,转向该jsp文件执行相应处理。
2.table表格
<body>
<form action="add_success.jsp">
<table class="table table-bordered table-hover" style="width: 50%" align="center">
//表格内容
</table>
</form>
</body>
表格标题,用caption标签设置,如下。
<caption>
<h2><center>学生信息添加</center></h2>
</caption>
设置各行,每行为:文字提示 + 对应输入框。
<tr>
<td>姓名</td>
<td>
<input type="text" name="sname" class="form-control">
</td>
</tr>
<tr>
<td>生活费</td>
<td>
<input type="text" name="money" class="form-control">
</td>
</tr>
<tr>
<td>出生日期</td>
<td>
<input type="date" name="birthday">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="添加" class="btn btn-success">
<input type="reset" value="重置" class="btn btn-success">
</td>
</tr>
注:每个标签的
name
尽量起的和数据库表中字段名一致,以免不必要的麻烦。
完整的add.jsp代码
<%--
Created by IntelliJ IDEA.
User: 11202
Date: 2024/4/3
Time: 13:12
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>
<form action="add_success.jsp">
<table class="table table-bordered table-hover" style="width: 50%" align="center">
<caption>
<h2><center>学生信息添加</center></h2>
</caption>
<tr>
<td>姓名</td>
<td>
<input type="text" name="sname" class="form-control">
</td>
</tr>
<tr>
<td>生活费</td>
<td>
<input type="text" name="money" class="form-control">
</td>
</tr>
<tr>
<td>出生日期</td>
<td>
<input type="date" name="birthday" class="form-control">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="提交" class="btn btn-success">
<input type="reset" value="重置" class="btn btn-warning">
</td>
</tr>
</table>
</form>
</body>
</html>
二、学生信息插入操作add_success.jsp
这个文件主要是写Java函数代码,直接将html相关内容删除,只写<% %>
内的内容。
方法:request.getParameter()
(1)request.getParameter() 取得是通过容器的实现来取得通过类似post,get等方式传入的数据,request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
(2)request.getParameter() 方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。
举例
<form action="xxx" >
<input name="name" value="hello word"/>
<input type="submit" value="提交"/>
</form>
这个form提交请求后,在你的action中String name = request.getparameter("name");
那么name的值就是“hello word”。
因此,实际上来说,标签的name起成什么,和数据库字段无关,标签的name只是用于
request.getParameter("[标签的name]")
来将其传递给变量的。至于与数据库交互,数据库中的字段名是什么,后续处理才需要考虑。但是,为了避免麻烦、混淆,将这些name统统与数据库字段名保持一致即可。
链接数据库
和之前list.jsp
一样,大概是三个步骤。
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
PreparedStatement pstmt = conn.prepareStatement("insert into student(sname, money, birthday) values(?,?,?)");
注意:对于PreparedStatement
中,insert的SQL语句的书写,需要用到“占位符”。需要将插入的确切值都用“?”即占位符来替换。
之后我们使用setObject()
方法来填充我们的占位符。
方法:setObject()
- 作用:给SQL语句的占位符赋值的。
- 优点:也有setString()方法,setInt()方法…但是如果数据很多,类型不一致,这样就需要一个一个判断,就很麻烦,所以直接使用setObject()方法,因为它可以自动识别数据类型,就很方便,提高了效率。
- 语法:
setObject(索引, 值)
。其中,索引是从1开始的,分别对应每个占位符。即,索引为1,就对应第一个“?”,索引为5,就对应第五个“?”。——因此,当你需要操作新的字段时,不能一味地往后加索引,也有可能字段是在中间新插入的,索引需要从中间某处开始重新设置。
填充占位符
pstmt.setObject(1, sname);
pstmt.setObject(2, money);
pstmt.setObject(3, birthday);
执行提交的SQL语句,方法:executeUpdate()
- 方法1:executeQuery()
- 这个方法被用来执行 SELECT 语句,但也只能执行查询语句。
- 执行后返回代表查询结果的ResultSet对象。
- 方法2:executeUpdate()
- 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。
- executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。
- 对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
pstmt.executeUpdate();
关闭链接
pstmt.close();
conn.close();
页面跳转
response.sendRedirect("list.jsp");
添加成功后,跳转回“学生信息列表”界面。
完整的add_success.jsp代码
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %><%--
Created by IntelliJ IDEA.
User: 11202
Date: 2024/4/3
Time: 13:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//接收参数
String sname = request.getParameter("sname");
String money = request.getParameter("money");
String birthday = request.getParameter("birthday");
//链接数据库
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
PreparedStatement pstmt = conn.prepareStatement("insert into student(sname, money, birthday) values(?,?,?)");
pstmt.setObject(1, sname);
pstmt.setObject(2, money);
pstmt.setObject(3, birthday);
pstmt.executeUpdate();
pstmt.close();
conn.close();
//页面跳转
response.sendRedirect("list.jsp");
%>
三、修改信息页面upd.jsp
点击“修改”按钮,跳转到学生信息页面,将其中的旧数据修改为新数据,之后点击提交,即可修改信息。
因此,它的实现思路是,在
add.jsp
基础上,将各个输入框的信息要能够“显示出旧数据”。此外,它的SQL语句也有所不同,它是update语句,而不是insert语句了。
<a href="upd.jsp?sid=<%= rs.getObject("sid") %>>" class="btn btn-primary">修改</a>
注意,我们通过请求href,已经获取到了当前点击学生的
sid
,之后作处理即可。
页面主要内容
head内容
<head>
<title>修改学生信息</title>
<link href="../css/bootstrap.css" rel="stylesheet">
</head>
body内容
<form action="upd_success.jsp">
<table class="table table-bordered table-hover" style="width: 50%" align="center">
<caption>
<h2><center>学生信息添加</center></h2>
</caption>
<%
String sid = request.getParameter("sid");
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 where sid=?");
pstmt.setObject(1, sid);
ResultSet rs = pstmt.executeQuery();
if(rs.next())
{
%>
<tr>
<td>学号</td>
<td>
<input type="text" name="sid" class="form-control" value="<%=rs.getObject("sid")%>" readonly>
</td>
</tr>
<tr>
<td>姓名</td>
<td>
<input type="text" name="sname" class="form-control" value="<%=rs.getObject("sname")%>">
</td>
</tr>
<tr>
<td>生活费</td>
<td>
<input type="text" name="money" class="form-control" value="<%=rs.getObject("money")%>">
</td>
</tr>
<tr>
<td>出生日期</td>
<td>
<input type="date" name="birthday" value="<%=rs.getObject("birthday")%>">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="提交" class="btn btn-success">
<input type="reset" value="重置" class="btn btn-warning">
</td>
</tr>
<%
}
rs.close();
pstmt.close();
conn.close();
%>
</table>
</form>
四、学生信息修改操作upd_success.jsp
同理,把html相关代码全部删去,只负责写Java代码,负责前端input传递过来的数据与数据库进行交互。
接收参数
<%
//接收参数
String sid = request.getParameter("sid");
String sname = request.getParameter("sname");
String money = request.getParameter("money");
String birthday = request.getParameter("birthday");
%>
链接数据库
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
执行SQL语句
PreparedStatement pstmt = conn.prepareStatement("update student set sname=?, money=?, birthday=? where sid=?");
pstmt.setObject(1, sname);
pstmt.setObject(2, money);
pstmt.setObject(3, birthday);
pstmt.setObject(4, sid);
pstmt.executeUpdate();
关闭链接
pstmt.close();
conn.close();
页面跳转
response.sendRedirect("list.jsp")
完整upd_success.jsp代码
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %><%--
Created by IntelliJ IDEA.
User: 11202
Date: 2024/4/3
Time: 15:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//传递参数
String sid = request.getParameter("sid");
String sname = request.getParameter("sname");
String money = request.getParameter("money");
String birthday = request.getParameter("birthday");
//建立链接
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
PreparedStatement pstmt = conn.prepareStatement("update student set sname=?, money=?, birthday=? where sid=?");
pstmt.setObject(1, sname);
pstmt.setObject(2, money);
pstmt.setObject(3, birthday);
pstmt.setObject(4, sid);
pstmt.executeUpdate();
//关闭链接
pstmt.close();
conn.close();
//页面跳转
response.sendRedirect("list.jsp");
%>
五、学生信息删除操作del_success.jsp
由于删除的过程是,在
list.jsp
中,点击“删除按钮”,对应记录消失。因此,不需要设置额外的界面,而只需实现这一功能操作即可。因此,不需要
del.jsp
,只需del_success.jsp
。同理,将html相关代码均删除,只写Java代码。
<a href="del_success.jsp?sid=<%= rs.getObject("sid") %>" class="btn btn-danger" >删除</a>
获取参数
String sid = request.getParameter("sid");
链接数据库
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
SQL语句执行
PreparedStatement pstmt = conn.prepareStatement("delete from student where sid=?");
pstmt.setObject(1, sid);
pstmt.executeUpdate();
关闭链接
pstmt.close();
conn.close();
页面跳转
response.sendRedirect("list.jsp");
完整del_success.jsp代码
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %><%--
Created by IntelliJ IDEA.
User: 11202
Date: 2024/4/3
Time: 15:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//传递参数
String sid = request.getParameter("sid");
String sname = request.getParameter("sname");
String money = request.getParameter("money");
String birthday = request.getParameter("birthday");
//建立链接
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mywork", "root", "123456");
//SQL语句
PreparedStatement pstmt = conn.prepareStatement("delete from student where sid=?");
pstmt.setObject(1, sid);
pstmt.executeUpdate();
//关闭链接
pstmt.close();
conn.close();
//页面跳转
response.sendRedirect("list.jsp");
%>