当前位置: 首页 > news >正文

Javaweb开发 利用servlet+jsp+jdbc+tomcat数据库实现登录功能

前言:很久没更新了,今天给大家分享一个Java web的小案例,是一个登录页面,利用Login控制类和JDBC连接数据库,并判断用户名密码是否正确,项目最终部署在Tomcat上。

先看效果 

 

正文 


一、前期工作

1.首先我们新建项目 (tomact提前配置好,不会的可以去我主页参考tomcat配置一文)

 

2. 选中Web Profile依赖项

3.mysql-connector-java-8.0.16.jar下载好保存到WEB-INF下 

二、实现功能

1.创建 LoginServlet类(内含jdbc建立数据库连接)

package com.example.course_selection_system;import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("user");String password = request.getParameter("pwd");// 数据库连接参数String url = "jdbc:mysql://localhost:3306/student";String dbUsername = "root";String dbPassword = "root";try {// 加载驱动程序Class.forName("com.mysql.cj.jdbc.Driver");// 建立数据库连接Connection connection = DriverManager.getConnection(url, dbUsername, dbPassword);// 查询数据库String sql = "SELECT * FROM admins WHERE admin_name=? AND admin_password=?";try (PreparedStatement statement = connection.prepareStatement(sql)) {statement.setString(1, username);statement.setString(2, password);ResultSet resultSet = statement.executeQuery();if (resultSet.next()) {// 用户验证成功// 在这里可以进行登录成功后的操作response.sendRedirect("templates/student.jsp");} else {// 用户验证失败// 在这里可以进行登录失败后的操作request.setAttribute("error_message", "用户名或密码错误,请重试");RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");dispatcher.forward(request, response);}}} catch (ClassNotFoundException e) {// 处理ClassNotFoundException异常e.printStackTrace(); // 记录日志// 向用户提供友好的错误提示request.setAttribute("error_message", "发生了意外错误,请联系管理员");RequestDispatcher dispatcher = request.getRequestDispatcher("error.jsp");dispatcher.forward(request, response);} catch (SQLException e) {// 处理SQLException异常e.printStackTrace(); // 记录日志// 向用户提供友好的错误提示request.setAttribute("error_message", "数据库错误,请稍后重试");RequestDispatcher dispatcher = request.getRequestDispatcher("error.jsp");dispatcher.forward(request, response);}}
}

2.在web.xml中配置Servlet映射

<servlet-name> 是你为Servlet指定的名称,<servlet-class> 是Servlet的完整类名,<url-pattern> 是你希望为Servlet匹配的URL路径。

 3.编写login.jsp(action="login"

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>学生成绩管理系统登陆</title><link rel="icon" href="http://v3.bootcss.com/favicon.ico"><style>li {list-style: none;}body {font-family: 'Arial', sans-serif;background-color: #3498db;color: white;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}#maxbox {background-color: #2c3e50;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);padding: 20px;text-align: center;}h1 {color: #ecf0f1;}h2 {color: #ecf0f1;}.inputbox {margin-top: 20px;}.inputText {margin-bottom: 15px;}input[type="text"],input[type="password"] {width: 100%;padding: 10px;margin-top: 5px;margin-bottom: 10px;box-sizing: border-box;border: 1px solid #3498db;border-radius: 4px;background-color: #ecf0f1;color: #2c3e50;}.inputButton {width: 100%;padding: 10px;border: none;border-radius: 4px;background-color: #3498db;color: white;cursor: pointer;}.inputButton:hover {background-color: #2980b9;}.remember {margin-right: 5px;}</style></head><div id="maxbox"><h1>学生成绩管理系统</h1><h2>请登录</h2><%-- Display error message if exists --%><c:if test="${not empty error_message}"><p class="error-message">${error_message}</p></c:if><div class="inputbox"><form name="frm" action="login" method="post"><div class="inputText"><span class="iconfont icon-mine"></span><input class="username" type="text" placeholder="用户名" name="user" style="color:black" /></div><div class="inputText"><span class="iconfont icon-lock"></span><input type="password" placeholder="密码" name="pwd" style="color:black" /><br><input class="remember" name="remember" type="checkbox" value="" checked="checked"><span style="color:white">记住我</span></div><input class="inputButton" type="submit" value="Sign in" /></form><div style="color: white">${msg}</div></div>
</div>
</html>

 在引入<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>错误时说明没有依赖,去pom.xml里添加如下代码(导入该库是为了实现错误信息提示的功能)

<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version>
</dependency>

4.存储用户名和密码的表单

三、运行tomcat(注意路径和端口正确)

 

当用户名或密码输入错误时,系统会给出提示。

输入正确后将会跳转到student.jsp

相关文章:

  • 《Effective C++》条款15
  • 【AI视野·今日NLP 自然语言处理论文速览 第六十五期】Mon, 30 Oct 2023
  • 设计模式 -- 代理模式(Proxy Pattern)
  • 【1567.乘积为正数的最长子数组长度】
  • 【ROS】RViz2源码分析(二):main函数及编译配置详解
  • 大数据基础设施搭建 - JDK
  • Java继承和多态(2)
  • 手撕无头单链表
  • YOLOv5项目实战(3)— 如何批量命名数据集中的图片
  • 代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
  • 【T690 之十一】基于方寸EVB2开发板,结合 Eclipse+gdb+gdbserver 调试 CCAT 的流程总结
  • 场景图形管理-多视图多窗口渲染示例(4)
  • redis高级案列case
  • 二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>
  • 【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论
  • eclipse(luna)创建web工程
  • Git学习与使用心得(1)—— 初始化
  • interface和setter,getter
  • markdown编辑器简评
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Spring Cloud中负载均衡器概览
  • swift基础之_对象 实例方法 对象方法。
  • Vultr 教程目录
  • 安装python包到指定虚拟环境
  • 读懂package.json -- 依赖管理
  • 服务器之间,相同帐号,实现免密钥登录
  • 入手阿里云新服务器的部署NODE
  • 一、python与pycharm的安装
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • MPAndroidChart 教程:Y轴 YAxis
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • "无招胜有招"nbsp;史上最全的互…
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十六)一篇文章学会Java的常用API
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (状压dp)uva 10817 Headmaster's Headache
  • .Family_物联网
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net8 Blazor 尝鲜
  • .NET关于 跳过SSL中遇到的问题
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • :not(:first-child)和:not(:last-child)的用法
  • @EnableWebMvc介绍和使用详细demo
  • @RequestBody与@ResponseBody的使用
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题