jsp实现增删改查——(二)添加、修改、删除学生信息

学生信息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.jspupd.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: 11202Date: 2024/4/3Time: 13:12To 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: 11202Date: 2024/4/3Time: 13:47To 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: 11202Date: 2024/4/3Time: 15:29To 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: 11202Date: 2024/4/3Time: 15:39To 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");
%>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaParser笔记02】JavaParser解析Java源代码中的类字段信息(javadoc注释、字段​​​​​​​名称)

这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类字段信息(javadoc注释、字段名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类成员信息 (1)案例代码 <

MySQL数据库(数据库连接池)

文章目录 1.批处理应用1.基本介绍2.批处理演示1.创建测试表2.修改url3.编写java代码 3.批处理源码分析 2.数据库连接池1.传统连接弊端分析2.数据库连接池基本介绍1.概念介绍2.数据库连接池示意图3.数据库连接池种类 3.C3P0连接池1.环境配置1.导入jar包2.将整个lib添加到项目中3…

从Magic6系列看荣耀AI的野心

监制 | 何玺 排版 | 叶媛 1月11日&#xff0c;荣耀正式发布Magic6系列旗舰手机。3月18日&#xff0c;荣耀举行春季旗舰新品发布会&#xff0c;再发荣耀Magic6至臻版、荣耀Magic6 RSR保时捷设计两款Magic6系列新品。 玺哥观察到&#xff0c;从荣耀Magic6到Magic6 Pro&#xff…

java实现手机号,密码,游邮箱 , 验证码的正则匹配工具类

先定义一个抽象类RegexPatterns&#xff0c;定义相关正则字符串 : public abstract class RegexPatterns {/*** 手机号正则*/public static final String PHONE_REGEX "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/*** 邮箱正则*/public stat…

AWS上面部署一台jenkins

问题 客户预算有限&#xff0c;需要在aws云上面搞一台EC2手动安装jenkins发版。 步骤 创建密钥对 在EC2服务里面创建密钥对&#xff0c;具体如下图&#xff1a; 设置密钥对&#xff0c;如下图&#xff1a; 保存好这个私钥文件&#xff0c;以便后续用这个私钥文件ssh登录j…

CSS水波纹效果

效果图&#xff1a; 1.创建一个div <div class"point1" click"handlePoint(1)"></div> 2.设置样式 .point1{width: 1rem;height: 1rem;background: #2ce92f;position: absolute;border-radius: 50%;z-index: 999;cursor: pointer;} 3.设置伪…

区块链的应用领域:重塑未来的信任机制

区块链作为一种新兴的技术&#xff0c;正在逐渐改变我们的生活。它以其独特的优势&#xff0c;正在开启一个信任的新时代。在金融、供应链管理、医疗健康、教育、文化娱乐、房地产等众多领域&#xff0c;区块链已经崭露头角&#xff0c;以其独特的方式发挥着作用。 1.金融领域…

【C语言】2048小游戏【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述&#xff1a; 2048是一款数字益智类游戏&#xff0c;玩家需要使用键盘控制数字方块的移动&#xff0c;合并相同数字的方块&#xff0c;最终达到数字方块上出现“2048”的目标。 每次移动操作&#xff0c;所…

GitLab 新项目创建和使用

一、下载 Git 客户端 Git - Downloading Package (git-scm.com) 二、打开 Git Bash 配置 gitlab 账户 下面的信息可以登录gitlab查看 git config --global user.name "yourname"git config --global user.email "youremailXX.com" 生成ssh_key ssh-k…

The connection errored: Failed host lookup: ‘sj.abbpt.com‘

报错解释&#xff1a; 错误表明Flutter应用程序在使用Dio库进行网络请求时&#xff0c;无法解析主机名’sj.abbpt.com’。这通常意味着设备无法通过DNS服务找到与该主机名相关联的IP地址。 解决方法&#xff1a; 检查主机名是否正确&#xff0c;没有拼写错误。 确认设备的网…

每日一练 | 华为认证真题练习Day209

1、关于BGP路由通告原则描述正确的是:&#xff08;多选&#xff09; A. BGP连接一建立&#xff0c;BGP Speaker将把自己所有BGP路由通告给新对等体。 B. BGP Speake会把自己所有的BGP路由通告给对等体。 C. 一般情况下&#xff0c;当存在多条路径时&#xff0c;BGP Speake只…

LeetCode 第四题:寻找两个正序数组的中位数 【4/1000 】【python + go】

​ &#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题:打怪升级之旅 python数据分析可视化:企业实战案例…

BioTech - AlphaFlow 项目 PyTorch Lightning + DeepSpeed 的分布式配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137348092 GitHub: https://github.com/bjing2016/alphaflow 步骤如下: 安装 DeepSpeed:需要安装 DeepSpeed。配置 Trainer:在 PyTorch Lightning 中,需要…

有关数据开发项目中使用HIVE由于无法update和delete的场景下,如何解决数据增量的思路

解决数据增量问题的思路在Hive中 在数据开发项目中&#xff0c;使用Hive进行数据处理时&#xff0c;由于Hive不支持update和delete语句&#xff0c;处理数据增量可能会变得有些棘手。然而&#xff0c;有几种策略和技术可以帮助我们解决这个问题&#xff0c;并确保数据增量的高…

ELK报错,索引变成只读状态。

问题描述 今天发现当天的索引在ES中并没有创建&#xff0c;logstash中不停的报错&#xff1a; [2021-05-24T05:47:51,904][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({“type”>“cluster_block_exception”, “reason”&g…

3D检测:从pointnet,voxelnet,pointpillar到centerpoint

记录centerpoint学习笔记。目前被引用1275次&#xff0c;非常高。 地址&#xff1a;Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint&#xff1a;三维点云目标检测算法梳理及最新进展&#xff08;CVPR2021&#xff…

rust- 结构体与二进制数组转换

将结构体当二进制流传输是做网络编程时传输协议的常用功能。golang语言可以使用包 encoding/binary实现&#xff0c;例如 import ("encoding/binary""os" )... err : binary.Write(f, binary.LittleEndian, p) ...rust中可以使用 deku将结构体实例转换为by…

openGauss 级联备机

级联备机 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 本特性主要基于当前一主多备的架构&#xff0c;在此基础上&#xff0c;支持级联备机连接备机。 客户价值 一主多备架构在特殊业务场景下&#xff0c;无法支持足够灵活的结构。多机房部署&#xff0c;不…

STM32 TIM DMA burst 输出变频 PWM 波形

1. 问题背景 客户需要 MCU 输出一组变频的 PWM 波形来控制外围器件&#xff0c;并且不同频率脉冲的个数也不同。STM32U5 芯片拥有 TIM1/TIM8 高级定时器&#xff0c;还有通用定时器TIM2/TIM3/TIM4/TIM5 以及 TIM15/TIM16/TIM17。TIM 模块中&#xff0c;可通过修改 ARR 寄存器的…

一文让你彻底理解 AdaBoost 自适应提升算法 | AdaBoost 的关键要点、基本原理、优缺点和实际应用

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、关键要点 AdaBoost&#xff0c;即自适应提升&#xff08;Adaptive Boosting&#xff09;算法的缩写&#xff0c;是一种基于 Boosting 策略的集成学习方法&#xff0c;旨在降低偏差。AdaBoost 的 “…