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

news2024/11/27 6:42:09

前言:很久没更新了,今天给大家分享一个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 {
    @Override
    protected 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

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

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

相关文章

Netty+SpringBoot 打造一个 TCP 长连接通讯方案

项目背景 最近公司某物联网项目需要使用socket长连接进行消息通讯&#xff0c;捣鼓了一版代码上线&#xff0c;结果BUG不断&#xff0c;本猿寝食难安&#xff0c;于是求助度娘&#xff0c;数日未眠项目终于平稳运行了&#xff0c;本着开源共享的精神&#xff0c;本猿把项目代码…

Excel-快速将公式运用到一整列

先在该列的第一个单元格里写好公式&#xff0c;然后单击该单元格 在图中标示的地方输入我们需要填充的单元格区域 同时按住Ctrl和Enter键&#xff0c;这时需要填充的单元格区域就都被选中了 然后单击一下图中公式的后面&#xff0c;再次按下Ctrl和Enter键&#xff0c;这样就完…

今日最新版早安问候大全,创意好看的早上好祝福图片带字温馨

1、阳光照&#xff0c;鸟欢叫&#xff0c;小懒猪&#xff0c;起床了&#xff0c;伸懒腰&#xff0c;笑一笑&#xff0c;深呼吸&#xff0c;精神好&#xff0c;开心到&#xff0c;欢乐抱&#xff0c;幸福随&#xff0c;乐淘淘&#xff0c;好运伴&#xff0c;祝福来&#xff0c;每…

《线性代数》科教版教材必会习题

出一期比较尴尬的博客——有关线代教材的课后题总结~ 之所以说尴尬&#xff0c;主要有两个主要原因&#xff1a;这本科教版第三版的教材&#xff0c;整体看起来并不是那么舒服&#xff0c;甚至被我们的老师吐槽过&#xff0c;更好地选择时同济版的那本紫书——我们学校的新生这…

windows10上使用Visual Studio对树莓派进行交叉编译示例

本文主要介绍通过Visual Studio对树莓派进行交叉编译的方法。 1 环境 宿主机&#xff1a; 系统&#xff1a;Windows10 开发平台&#xff1a;Visual Studio 2022 (我用的是社区版) VisualGDB: VisualGDB - Download (我下的试用版本) GNU工具链: Prebuilt GNU toolchain f…

中国人民大学与加拿大女王大学金融硕士——热爱会穿越时间,埋在心底的读研梦也是

随着时光的流转&#xff0c;我们都在跌跌撞撞中成长&#xff0c;改变&#xff0c;但有一种东西是永恒的&#xff0c;那就是我们对梦想的渴望。那些被尘封的读研梦想&#xff0c;如同穿越漫长岁月&#xff0c;等待在未来的某一天重见天日。梦想&#xff0c;就如同热爱一样&#…

【C#学习】串口编程

文章目录 第一步&#xff1a;加入串口控件第二步&#xff1a;加入模块第三步&#xff1a;编写相关函数功能获取所有串口资源设置和打开关闭串口发送字符串&#xff08;string&#xff09;发送byte检查串口状态接受byte查询所有可用串口 第一步&#xff1a;加入串口控件 第二步&…

Git 工作流程、工作区、暂存区和版本库

目录 Git 工作流程 Git 工作区、暂存区和版本库 基本概念 Git 工作流程 本章节我们将为大家介绍 Git 的工作流程。 一般工作流程如下&#xff1a; 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。 如果其他人修改了&#xff0c;你可以更新资源。在提交前查看…

MySQL--主从复制和读写分离

MySQL主从复制和读写分离相关知识 1.什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2.为什么要…

【unity】网格描边方法

【unity】网格描边方法 介绍对模型四边网格的三种描边方法&#xff1a;包括纯Shader方法、创建网格方法和后处理方法。于增强场景中3D模型的轮廓&#xff0c;使其在视觉上更加突出和清晰。这种效果可以用于增强三维场景中的物体、角色或环境&#xff0c;使其在视觉上更加吸引人…

wordcloud出现ValueError: Only supported for TrueType fonts

方法1&#xff1a;换一个版本的wordcloud即可&#xff0c;实测windows在1.8.2.2版本上不会报错。 方法2&#xff1a;还可以尝试其他博客中的解决方案&#xff0c;自己下个字体的TTF文件&#xff0c;让后font_path直接写字体文件路径。&#xff08;此方法未见效&#xff09;

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

21.计算老师的工资

&#xff08;定义结构体数组存放教师的财务信息&#xff08;教工卡号&#xff0c;应发工资&#xff0c;个人所得税&#xff0c;实发工资&#xff09;具体要求如下从键盘输入5个教师的教工卡号&#xff0c;应发工资 计算每人的个人所得税&#xff08;应发工资10%&#xff09;&am…

好心提醒下,幼师姐妹们要知道啊

幼师家人们在不在&#xff1f;在不在&#xff1f; 不会还有姐妹在自己写教案&#xff0c;写总结&#xff0c;写评语啥的吧&#xff0c;这个好东西真的要知道啊&#xff01;&#xff01; 只要输入关键词&#xff0c;马上就能得到你想要的内容&#xff0c;真的很强啊&#xff0…

设计模式系列之最终篇:大盘点

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4000多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

NVMe 2.0 简介

随着全新一代PCIe 5.0 SSD的发布&#xff0c;新的NVMe 2.0规范协议也是如期而至。作为PCIe SSD最为重要的底层协议&#xff0c;NVMe 2.0都有哪些重要调整&#xff1f;又有哪些值得我们关注的新功能&#xff1f;本文简单解答。 NVMe 演化史 NVMe自诞生以来&#xff0c;其关注的…

Blazor 附件上传和下载功能

效果图 page "/uploadFile" inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment inject ToastService ToastService inject DownloadService DownloadService<h3>UploadFile</h3><Button OnClick"ButtonClick" C…

cmd窗口中文乱码

问题&#xff1a;今天电脑重装了&#xff0c;跑程序的时候&#xff0c;cmd窗口汉字出现乱码&#xff0c;看起来很不舒服 解决方案&#xff1a;在注册表中修改cmd的属性设置&#xff0c;实现一次修改永远有效 1. 打开 winR 输入 regedit 进入注册表 2. 找到 HKEY_CURRENT_USER…

AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):FREERTOS移植

前言: 一般的GUI工程都需要一个操作系统,可能是linux,重量级的,也可能是FreeRTOS,轻量级的。 一句话理解那就是工程就是FreeRTOS task任务的集合。 一个main函数可以看到大框架: 很显然,除了第一个是硬件配置的初始化,中间最重要的部分就是要创建任务。而一个任务主…