javaweb实验:JSP+JDBC综合实训__数据库记录的修改、删除

news2024/7/6 19:51:08

目录

  • 前言
  • 实验目的
  • 实验内容
    • 编程实现后台的用户管理功能
  • 实验原理或流程图
    • 实验原理
    • 流程图
  • 实验过程
    • Adduser
    • querAllUser
    • doAddUser
    • 结果展示
  • 实验结论

前言

本实验的目的是让学生掌握使用JSP和JDBC技术对数据库中的记录进行修改和删除的方法。实验内容包括以下几个部分:

  • 创建一个数据库表,存储学生的基本信息,如姓名、id、性别、e-mail等。
  • 编写一个JSP页面,显示数据库表中的所有记录,并提供修改和删除的链接。
  • 编写一个JSP页面,接收修改或删除的请求,并根据请求参数执行相应的SQL语句。
  • 编写一个JSP页面,显示操作结果,并提供返回链接。

通过本实验,学生可以了解JSP和JDBC的基本原理和用法,以及如何利用它们实现对数据库的增删改查操作。

实验目的

  1. 理解使用JSP的核心知识和JDBC API进行数据库中数据的修改和删除操作的原理,学会相关编程方法;
  2. 能够根据贯穿项目案例的实际应用需要,综合运用JSP+JDBC相关知识和技术,完成数据库的连接、增加、查询、修改和删除操作。

实验内容

编程实现后台的用户管理功能

【步骤1】在数据库db_news2019中建立后台管理员表t_manager。
(1)建立管理员表t_manager, 结构如图所示。
在这里插入图片描述
其中:各个属性列分别表示管理员登录ID(主键),管理员真实姓名,管理员登录密码。
(2)在管理员表t_manager中录入若干条记录。
【步骤2】实现后台用户管理功能。
(1)新建项目。
(2)为项目配置构建路径,添加Apache Tomcat Server(例如:Apache Tomcat 7.0或8.5)以及MySQL驱动JAR包(例如:mysql-connector-java-5.1.45-bin.jar)。
(3)确认项目根目录下的子目录WEB-INF中包含web.xml(如果没有该文件,可从Tomcat安装目录中复制)。
(4)参考新闻管理(增查改删)案例代码,编写如下5个页面,以实现后台用户管理(增查改删)功能。
queryAllUser.jsp: 用户管理主界面
addUSer.jsp和doAddUser.jsp:增加用户表单页面和数据库操作(插入用户)页面
doDeleteUser.jsp: 删除用户页面(执行数据库删除操作)
doUpdateUser.jsp和updateUser.jsp: 修改用户信息页面(含数据库修改操作)

实验原理或流程图

实验原理

使用JDBC访问数据库的流程:
(0)加载和注册数据库驱动程序
a. 将驱动包(例如:mysql-connector-java-5.1.45-bin.jar)导入到项目的构建路径;
b. 加载、注册驱动类:Class.forName(“com.mysql.jdbc.Driver”);
(1)连接数据库(获取连接对象)
String url =
“jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8”;
String user = “root”;
String password = “admin”;//假设根用户的密码为admin
Connection conn = DriverManager.getConnection(url, user, password);
(2)操作数据库(查,增、删、改)
a.创建数据库操作对象
b.执行SQL语句
c.获得并处理结果
如果使用Statement接口:
a. 创建数据库操作对象
Statement stmt = conn.createStatement();
b. 执行SQL语句
String sql = “…”; // 根据需要构造SQL语句(不能带参数占位符)
ResultSet rs = stmt.executeQuery(sql); // 对于查询操作
int row = stmt.executeUpdate(sql); // 对于更新操作(增、删、改)
c. 获得并处理结果
对于更新操作:
if( row > 0 ){// 向页面输出更新的行数 }
对于查询操作:
while(rs.next()){
// 通过rs.getXxx方法,获取当前行的各个字段的值

}
如果使用PreparedStatement接口:
a. 创建数据库操作对象
String sql = “…”; // 根据需要构造SQL语句(可以带参数占位符)
PreparedStatement pstmt = conn.prepareStatement(sql);
b. 执行SQL语句
// 通过pstmt.setXxx()方法对SQL语句中的各个参数赋值(传递参数值)

ResultSet rs = stmt.executeQuery(); // 对于查询操作
int row = stmt.executeUpdate(); // 对于更新操作(增、删、改)
c. 获得并处理结果
对于更新操作:
if( row > 0 ){// 向页面输出更新的行数 }
对于查询操作:
while(rs.next()){
// 通过rs.getXxx()方法,获取当前行的各个字段的值。

}
// 当然,也可以通过rs.updateXxx()方法,修改当前行某个字段的值。
(3)释放资源
rs.close();
stmt.close(); 或 pstmt.close();
conn.close();

流程图

在这里插入图片描述

实验过程

根据页面的跳转流程,写出源代码

Adduser

<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
  <title>添加用户表单页面</title>
</head>
<body>
<form action="doAddUser.jsp" method="post">
  <table align="center" border="0">
    <tr>
      <td>登录ID:</td>
      <td><input type="text" name="id"></td>
    </tr>
    <tr>
      <td>真实姓名:</td>
      <td><input type="text" name="name"></td>
    </tr>
    <tr>
      <td>性别:</td>
      <td>
        <label><input type="radio" name="gender" value="男"></label>
        <label><input type="radio" name="gender" value="女"></label>
      </td>
    </tr>
    <tr>
      <td>E-Mail:</td>
      <td><input type="email" name="email"></td>
    </tr>
    <tr>
      <td>登录密码:</td>
      <td><input type="password" name="password"></td>
    </tr>
    <tr>
      <td colspan="2">
        <center>
          <input type="submit" value="添加用户">&nbsp;
          <input type="reset" value="重置">
        </center>
      </td>
    </tr>
  </table>
</form>
</body>
</html>

querAllUser

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
  <title>用户管理主界面</title>
</head>
<body>
<center>
  <h2>登录成功!欢迎[<%=session.getAttribute("mname")%>]进入后台管理!</h2>
  <hr>
  <a href="addUser.jsp">增加用户</a>&nbsp;&nbsp;
  <a href="mlogout.jsp">安全退出</a>
</center>
<%
  Connection conn = null;
  PreparedStatement stmt = null;
  //ResultSet rs = null;

  try {
     String url= DriverManager.getConnection("jdbc:mysql://hostname:port/db_news2019", "root", "12345678");
    Connection conn = DriverManager.getConnection(url,username,password);
    stmt=conn.prepareStatement("select * from t_user");
    String sql = "select * from t_user";
    ResultSet rs = stmt.executeQuery(sql);
    //rs=stmt.executeQuery();
    Object id,name,password,sex,email,regdate;
%>

<table align="center" border="1" cellspacing="0">
  <tr>
    <th>登录ID</th>
    <th>真实姓名</th>
    <th>登录密码</th>
    <th>性别</th>
    <th>E-Mail</th>
    <th>注册时间</th>
    <th>管理员操作</th>
  </tr>

  <%
    while(rs.next()) {
      id = rs.getObject("uid");
      name = rs.getObject("uname");
      password = rs.getObject("upassword");
      sex = rs.getObject("usex");
      email = rs.getObject("uemail");
      regdate = rs.getObject("uregdate");
  %>
  <tr>
    <td><%=id%></td>
    <td><%=name%></td>
    <td><%=password%></td>
    <td><%=sex%></td>
    <td><%=email%></td>
    <td><%=regdate%></td>
    <td>
      <a href="updateUser.jsp?id=<%=id%>&name=<%=name%>&password=<%=password%>&sex=<%=sex%>&email=<%=email%>">修改</a>&nbsp;
      <a href="doDeleteUser.jsp?id=<%=id%>">删除</a>
    </td>
  </tr>
  <%
      }
      rs.close();
      stmt.close();
      conn.close();
    } catch (Exception e) {
      out.print("查询失败!");
    }
  %>
</table>
</body>
</html>


doAddUser

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<html>
<head>
  <title>用户管理主界面</title>
</head>
<body>
<center>
  <h2>登录成功!欢迎[<%=session.getAttribute("mname")%>]进入后台管理!</h2>
  <hr>
  <a href="addUser.jsp">增加用户</a>&nbsp;&nbsp;
  <a href="mlogout.jsp">安全退出</a>
</center>
<%
  Connection conn = null;
  PreparedStatement stmt = null;
  //ResultSet rs = null;

  try {
     String url= DriverManager.getConnection("jdbc:mysql://hostname:port/db_news2019", "root", "12345678");
    Connection conn = DriverManager.getConnection(url,username,password);
    stmt=conn.prepareStatement("select * from t_user");
    String sql = "select * from t_user";
    ResultSet rs = stmt.executeQuery(sql);
    //rs=stmt.executeQuery();
    Object id,name,password,sex,email,regdate;
%>

<table align="center" border="1" cellspacing="0">
  <tr>
    <th>登录ID</th>
    <th>真实姓名</th>
    <th>登录密码</th>
    <th>性别</th>
    <th>E-Mail</th>
    <th>注册时间</th>
    <th>管理员操作</th>
  </tr>

  <%
    while(rs.next()) {
      id = rs.getObject("uid");
      name = rs.getObject("uname");
      password = rs.getObject("upassword");
      sex = rs.getObject("usex");
      email = rs.getObject("uemail");
      regdate = rs.getObject("uregdate");
  %>
  <tr>
    <td><%=id%></td>
    <td><%=name%></td>
    <td><%=password%></td>
    <td><%=sex%></td>
    <td><%=email%></td>
    <td><%=regdate%></td>
    <td>
      <a href="updateUser.jsp?id=<%=id%>&name=<%=name%>&password=<%=password%>&sex=<%=sex%>&email=<%=email%>">修改</a>&nbsp;
      <a href="doDeleteUser.jsp?id=<%=id%>">删除</a>
    </td>
  </tr>
  <%
      }
      rs.close();
      stmt.close();
      conn.close();
    } catch (Exception e) {
      out.print("查询失败!");
    }
  %>
</table>
</body>
</html>


结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验结论

本实验通过JSP和JDBC技术实现了对数据库中的学生信息进行修改和删除的功能。实验过程中,首先创建了一个数据库和一个表,然后在JSP页面中编写了表单和链接,用于输入修改或删除的条件和数据。接着,在另一个JSP页面中,通过JDBC连接数据库,并根据表单或链接传递的参数,执行相应的SQL语句,完成对表的修改或删除操作。最后,在页面上显示操作结果和表的最新数据。本实验加深了对JSP和JDBC技术的理解和掌握,也提高了对数据库操作的能力和熟练度。

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

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

相关文章

STM32单片机蓝牙APP手势语音温控电风扇落地扇人体感应

实践制作DIY- GC0134-蓝牙APP手势语音温控电风扇 一、功能说明&#xff1a; 基于STM32单片机设计-蓝牙APP手势语音温控电风扇 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32单片机语音识别模块PAJ7620U2手势识别传感器DS18B20温度传感器5V风扇LCD1602显示器红外接…

机器学习算法的基本概念、分类和评价标准,以及一些常用的机器学习算法的原理和特点

机器学习是一门研究如何让计算机从数据中学习和推理的科学。机器学习算法是实现机器学习的具体方法&#xff0c;它们可以根据不同的目标、数据类型和应用场景进行分类和比较。本文将介绍机器学习算法的基本概念、分类和评价标准&#xff0c;以及一些常用的机器学习算法的原理和…

MacBook杀毒软件CleanMyMac X2023

Mac 上也广泛存在恶意软件&#xff0c;并且能够突破系统自身的防护&#xff0c;通过渠道传播到电脑上&#xff0c;威胁大家的数据安全和窃取个人信息&#xff01;所以&#xff0c;MacBook杀毒软件还是很有必要安装的。 始于颜值&#xff0c;忠于实力。CleanMyMac X是我用过UI风…

复杂软件版本如何使用git工具进行管理

1.需求说明 一个项目&#xff0c;如果长期开发下去&#xff0c;我们会碰到各种各样的客户&#xff0c;然后就会有各种各样的需求。这时候就会出现一个问题&#xff1a;如果我们的代码都是一个项目&#xff0c;客户的主体流程都是一样&#xff0c;但部分客户又有一些特别的定制…

JDK1.8 与 Language Level 8 关系

什么是Java&#xff1f; 是 SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995 年推出的一门高级 编程语言。 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器 中运行。这些 Java 程序被称为 Java 小程序…

六级备考26天|CET-6|仔细阅读|考研英语2023年英语(一)|8:20~10:00

text1 4/5 text2 3/5 text3 2/5 text4 3/5 12/20 目录 text 1 1. 重点词汇 2. 原文 3. 题目 text 1 1. 重点词汇 sympathise / ˈsɪmpəθaɪz / vi.同情&#xff1b;吊唁&#xff1b;共鸣 &#xff08;等于 sympathize&#xff09; ener…

OJ练习第109题——根到叶路径上的不足节点

根到叶路径上的不足节点 力扣链接&#xff1a;1080. 根到叶路径上的不足节点 题目描述 给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。 假如通过节点 node 的每种可能的 “根-叶” 路径上值…

KuiperInfer深度学习推理框架-源码阅读和二次开发(3):计算图

前言&#xff1a;KuiperInfer是一个从零实现一个高性能的深度学习推理库&#xff0c;中文教程已经非常完善了。本系列博客主要是自己学习的一点笔记和二次开发的教程&#xff0c;欢迎更多的AI推理爱好者一起来玩。这篇写一下计算图相关的知识点&#xff0c;重点说明ONNX有什么缺…

一口气整理三种不同二维码生成的Java 接入代码

引言 二维码已经成为现代社会中广泛应用的一种工具&#xff0c;它们具有快速、可靠和高容量的信息传递能力。通过扫描二维码&#xff0c;用户可以轻松获取网址、产品信息、支付链接等各种信息。 本文将介绍二维码生成器 API 作为一种工具&#xff0c;并探讨其功能和用法&…

【Linux高级 I/O(4)】异步 IO实例及其优化(全文代码)

异步 I/O 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。 而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它…

rocketmq中ConsumeThreadMax不生效原因探究

在项目中设置了ConsumeThreadMax但是消息消费时仍是单线程消费&#xff0c;故而进行追踪排查。 其根本原因是rocketmq中&#xff0c;消费者线程池队列使用的是LinkedBlockingQueue。 rocket版本&#xff1a;rocketmq-client-4.9.3 代码追踪&#xff1a;从DefaultMQPushConsu…

C++设计模式之抽象工厂模式(Abstract Factory)

文章目录 定义前言问题解决方案 结构适用场景实现方式优点缺点与其他模式的关系实例 [C]22种设计模式的C实现大纲 定义 抽象工厂是一种创建型设计模式&#xff0c;它能创建一系列相关的对象&#xff0c;而无需指定其具体类。 前言 问题 假设你正在开发一款家具商店模拟器。…

Multi-Head Attention和Transformer Decoder(GPT)详解

文章目录 一、Transformer的Attention1. Self-Attention2. Masked Self-Attention3. Multi-Head Attention 二、Transformer Decoder&#xff08;GPT&#xff09;1. GPT的网络结构2. GPT的计算原理 一、Transformer的Attention 1. Self-Attention 如前篇文章所述&#xff08;ht…

如何开发一个人人爱的组件?

组件&#xff0c;是前端最常打交道的东西&#xff0c;对于 React、Vue 等应用来说&#xff0c;万物皆组件毫不为过。 有些工作经验的同学都知道&#xff0c;组件其实也分等级的&#xff0c;有的组件可以被上万开发者复用&#xff0c;有些组件就只能在项目中运行&#xff0c;甚…

Springboot +spring security,配置多个数据源:验证不同用户表

一.简介 上篇文章写到&#xff0c;我们在配置jdbc和mybatis 来源&#xff0c;进行登录后&#xff0c;出现了如下错误! 后面解决方案是&#xff1a;屏蔽了其中一个来源&#xff0c;登陆成功&#xff0c;也分析了其原因。 但是&#xff0c;但是如果需要配置多个数据来源&#…

2023年认证杯SPSSPRO杯数学建模B题(第一阶段)考订文本全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 B题 考订文本 原题再现&#xff1a; 古代文本在传抄过程中&#xff0c;往往会出现种种错误&#xff0c;以至于一部书可能流传下来多种版本。在文献学中&#xff0c;错误往往被总结成“讹”、“脱”、“衍”、“倒”等形式&#xff0c;也可能同…

cda 1级模拟题错题知识点总结

Sql truncate函数 格式&#xff1a;TRUNCATE(number, decimals) number: the number to be truncated decimals:the number of decimal places to truncate to 截断到的小数位数&#xff0c;如果为0则表示不保留小数 例如: select truncate(2.83,0) 结果为2 select truncate(…

解读kubernetes部署:配置docker私服密钥与SSL证书创建

为k8s配置docker私服密钥 为了kubernetes有权访问您的docker私服&#xff0c;需要在kubernetes的凭证中建立docker私服的密钥&#xff1a; kubectlcreatesecretdocker-registryaliyun-secret--docker-server--docker-username--docker-password--docker-email--namespacens-jav…

2.golang的变量、常量、数据类型、循环和条件判断

一、变量 变量&#xff08;Variable&#xff09;的功能是存储数据。Go语言中的每一个变量都有自己的类型&#xff0c;并且变量必须经过声明才能开始使用。 Go语言的变量声明格式为&#xff1a; var 变量名 变量类型 例如&#xff1a; var name string var age int var isOk b…

线上问题处理案例:出乎意料的数据库连接池 | 京东云技术团队

导读 本文是线上问题处理案例系列之一&#xff0c;旨在通过真实案例向读者介绍发现问题、定位问题、解决问题的方法。本文讲述了从垃圾回收耗时过长的表象&#xff0c;逐步定位到数据库连接池保活问题的全过程&#xff0c;并对其中用到的一些知识点进行了总结。 一、问题描述…