实验9 JSP访问数据库(二)
实验9 JSP访问数据库(二)
目的:
1、熟悉JDBC的数据库访问模式。
2、掌握预处理语句的使用
实验要求:
1、使用Tomcat作为Web服务器
2、通过JDBC访问数据库,实现增删改查功能的实现
3、要求提交实验报告,将代码和实验结果页面截图放入报告中
实验内容:
1.编写一个网页,实现根据输入学生姓名的模糊查询,如果查找不到就显示“查无此人”
index.java
<%@ page import="java.sql.*" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.xxx.Student" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>模糊查询</title>
</head>
<body>
<form action="index.jsp" method="post"><input type="text" name="info"></br><input type="submit" value="查询">
</form>
<%List<Student> studentList = new ArrayList<>();Connection connnection = null;PreparedStatement statement = null;ResultSet resultSet = null;String url = "jdbc:mysql://localhost:3306/test9";Class.forName("com.mysql.jdbc.Driver");connnection = DriverManager.getConnection(url,"root","123456");String sql = "select * from student where stuname like ?";statement = connnection.prepareStatement(sql);String info = request.getParameter("info");statement.setString(1,"%" + info +"%");resultSet = statement.executeQuery();while(resultSet.next()){int id = resultSet.getInt("stuid");String name = resultSet.getString("stuname");String sex = resultSet.getString("stusex");Student stu = new Student(id,name,sex);studentList.add(stu);}// 将数据设置到作用域当中request.setAttribute("studentList",studentList);
%><c:if test="${!empty studentList}"><table align="center" width="800" border="1" style="border-collapse: collapse;"><tr><th>学号</th><th>姓名</th><th>性别</th></tr><c:forEach items="${studentList}" var="stu"><tr align="center"><td>${stu.id}</td><td>${stu.name}</td><td>${stu.sex}</td></tr></c:forEach></table></c:if>
<c:if test="${studentList.size() == 0}"><h4>查无此人</h4>
</c:if><%resultSet.close();statement.close();connnection.close();
%>
</body>
</html>
Student.java
package com.xxx;public class Student {private Integer id;private String name;private String sex;public Student() {}public Student(Integer id, String name, String sex) {this.id = id;this.name = name;this.sex = sex;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
}
2.实现学生注册和登录功能,输入学生学号(stuId)和密码(stuPwd),如果学号不存在,跳转到注册界面,完成注册功能;如果学号存在,密码匹配显示“登录成功”,否则显示“登录失败”。
注:要求用PreparedStatement实现。
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="login_2.jsp" method="post"><label for="username">用户名:</label><input type="text" id="username" name="username" required><br><label for="password">密码:</label><input type="password" id="password" name="password" required><input type="submit" value="登陆">
</form>
</body>
</html>
login_2.jsp
<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--表单提交到这--%>
<%String url = "jdbc:mysql://localhost:3306/test9";String stuId = request.getParameter("username");String stuPwd = request.getParameter("password");try {// 加载和注册JDBC驱动Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection(url, "root", "123456");//检查学号是否存在String sql1 = "select * from password where stuId = ?";PreparedStatement stmt1 = conn.prepareStatement(sql1);stmt1.setString(1,stuId);ResultSet rs1 = stmt1.executeQuery();if(rs1.next() && rs1.getInt(1) > 0){String sql2 = "select * from password where stuId = ? and stuPwd = ?";PreparedStatement stmt2 = conn.prepareStatement(sql2);stmt2.setString(1,stuId);stmt2.setString(2,stuPwd);ResultSet rs2 = stmt2.executeQuery();if (rs2.next() && rs2.getInt(1) > 0) {response.sendRedirect("loginSuccess.jsp");} else {response.sendRedirect("loginFail.jsp");}rs2.close();stmt2.close();}else{response.sendRedirect("register_2.jsp");}rs1.close();stmt1.close();conn.close();} catch (SQLException se) {se.printStackTrace();} catch (Exception e) {e.printStackTrace();}
%>
</body>
</html>
register_2.jsp
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注册页面</title>
</head>
<body>
<form action="register.jsp" method="post"><label for="username">用户名:</label><input type="text" id="username" name="username" required><br><label for="password">密码:</label><input type="password" id="password" name="password" required><input type="submit" value="注册">
</form>
</body>
</html>
register.jsp
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注册页面</title>
</head>
<body>
<%String url = "jdbc:mysql://localhost:3306/test9";Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection(url,"root","123456");String username = request.getParameter("username");String password = request.getParameter("password");String sql = "insert into password(stuID,stuPwd) values(?,?)";PreparedStatement stmt = conn.prepareStatement(sql);stmt.setString(1,username);stmt.setString(2,password);int count = stmt.executeUpdate();if(count != 0){
%><a href="login.jsp">注册成功,返回登录页面</a><%}stmt.close();conn.close();%>
</body>
</html>loginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登陆成功</title>
</head>
<body><h4>登陆成功</h4>
</body>
</html>
loginFail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登陆失败</title>
</head>
<body><h4>登录失败</h4>
</body>
</html>
(登陆成功)
(登陆失败(密码不匹配))
(跳转到注册页面(账号不存在))
3.(选做)参考学习平台上“JDBC操作_增删改”的视频,使用表格展示数据库中stuinfo表中的个人信息,每行一条个人信息,表格新增两列,分别提供“修改”和“删除”两个链接。点击“修改”链接时,跳转到新页面可供用户修改和保存;点击“删除”时,跳转到新页面完成删除操作并提示操作结果。
相关文章:

实验9 JSP访问数据库(二)
实验9 JSP访问数据库(二) 目的: 1、熟悉JDBC的数据库访问模式。 2、掌握预处理语句的使用 实验要求: 1、使用Tomcat作为Web服务器 2、通过JDBC访问数据库,实现增删改查功能的实现 3、要求提交实验报告,将代…...

[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

Airflow:选择合适执行器扩展任务执行
Apache Airflow是面向开发人员使用的,以编程方式编写、调度和监控的数据流程平台。可伸缩性是其关键特性之一,Airflow支持使用不同的执行器来执行任务。在本文中,我们将深入探讨如何利用这些执行器在Airflow中有效地扩展任务执行。 理解Airfl…...

使用冒泡排序模拟实现qsort函数
1.冒泡排序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 0,2,5,3,4,8,9,7,6,1 };int sz sizeof(arr) / sizeof(arr[0]);//冒泡排序一共排序 sz-1 趟for (int i 0; i < sz - 1; i){//标志位,如果有序,直接…...
AI大模型开发原理篇-4:神经概率语言模型NPLM
神经概率语言模型(NPLM)概述 神经概率语言模型(Neural Probabilistic Language Model, NPLM) 是一种基于神经网络的语言建模方法,它将传统的语言模型和神经网络结合在一起,能够更好地捕捉语言中的复杂规律…...
Eigen::Tensor使用帮助
0 引言 用python实现了某些算法之后,想转成C来获取更高的性能。但是python数组的操作太灵活了,尤其是3维、4维、5维等高维数组,以及它们的广播、数组坐标、切片等机制。还有numpy的pad、where等操作更是给C转换带来了更多的麻烦。 查阅了相…...

git基础使用--3---git安装和基本使用
文章目录 git基础使用--3--git-安装和基本使用1. git工具安装1.1 git1.2 TortoiseGit1.3 远程仓2. git本地仓库版本管理2.1 git常用命令2.2 git基本操作2.2.1 设置用户名和邮箱 2.2 git基本操作2.2.1 初始化本地仓 git init2.2.2 查看本地库状态 git status2.2.3 添加暂缓区2.2…...

html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思
引言 在人工智能领域,OpenAI再次引领潮流,推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本,旨在进一步推动低成本推理的发展。与此同时,OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...

Zemax 中带有体素探测器的激光谐振腔
激光谐振腔是激光系统的基本组成部分,在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高(后镜),而另一个镜子部分透明(输出耦合器)。…...

大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)
0 英文缩写 Large Language Model(LLM)大型语言模型Data Parallelism(DP)数据并行Distributed Data Parallelism(DDP)分布式数据并行Zero Redundancy Optimizer(ZeRO)零冗余优化器 …...
C# 实现 “Hello World” 教程
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种广泛应用于.NET 开发的编程语言,以其简洁、高效和类型安全等特性,深受开发者喜爱。在踏入 C# 编程领域时,编写经典的 “Hello World” 程序是重要的起点,它能帮助我们快速熟…...

LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
IM 即时通讯系统-01-概览
前言 有时候希望有一个 IM 工具,比如日常聊天,或者接受报警信息。 其实主要是工作使用,如果是接收报警等场景,其实DD这种比较符合场景。 那么有没有必要再创造一个DD呢? 答案是如果处于个人的私有化使用࿰…...

【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南
持续更新。。。。。。。。。。。。。。。 【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南 安装 Ollama安装 DeepSeek 模型选择版本 ,版本越高,参数越多 性能越好使用 DeepSeek 模型 安装 Ollama 访问 Ollama 官网: 前往 https://oll…...

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)
理解Linux系统内进程信号的整个流程可分为: 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生,本文会讲解信号的保存和信号处理相关的概念和操作: 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…...
探索 Copilot:开启智能助手新时代
探索 Copilot:开启智能助手新时代 在当今数字化飞速发展的时代,人工智能(AI)正以前所未有的速度改变着我们的工作和生活方式。而 Copilot 作为一款强大的 AI 助手,凭借其多样的功能和高效的应用,正在成为众…...

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智…...
我用Ai学Android Jetpack Compose之Card
这篇学习一下Card。回答来自 通义千问。 我想学习Card,麻烦你介绍一下 当然可以!在 Jetpack Compose 中,Card 是一个非常常用的组件,用于创建带有阴影和圆角的卡片式布局。它可以帮助你轻松实现美观且一致的 UI 设计,…...

NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)
用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...