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 {
    @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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云课五分钟-02第一个代码复现-终端甜甜圈C++

前篇 云课五分钟-01课程在哪里-无需安装网页直达- 代码复现通过云课&#xff0c;会非常快捷。 视频 云课五分钟-02第一个代码复现-终端甜甜圈C 文本 如何使用g 使用g编译和链接C程序的基本步骤如下&#xff1a; 编写源代码&#xff1a;首先&#xff0c;你需要编写C源代码&…

Docker学习——⑧

文章目录 1、什么是 Docker Compose(容器编排)2、为什么要 Docker Compose&#xff1f;3、Docker Compose 的安装4、Docker Compose 的功能和使用场景5、Docker Compose 文件&#xff08;docker-compose.yml&#xff09;5.1 文件语法版本5.2 文件基本结构及常见指令 6、Docker …

【C#学习】串口编程

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

Elasticsearch7 入门 进阶

1、全文检索 1.1、数据分类 按数据分类的话&#xff0c;主要可以分为以下三类&#xff1a; 结构化数据&#xff1a;固定格式、有限长度&#xff0c;比如mysql存的数据非结构化数据&#xff1a;不定长、无固定格式&#xff0c;比如邮件、Word文档、日志等半结构化数据&#xf…

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

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

抖音小程序开发全攻略:如何规划项目和选择合适的开发团队

在数字化时代&#xff0c;抖音小程序成为企业推广和服务的重要渠道。本文将为您提供抖音小程序开发的全面攻略&#xff0c;重点介绍如何规划项目和选择合适的开发团队&#xff0c;并附有一些关键的技术代码示例。 1. 项目规划 在开始抖音小程序开发之前&#xff0c;详细的项…

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

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

读写分离(基于mycat)和全同步复制

一、mycat实现读写分离&#xff08;VIP机制&#xff09; &#xff08;一&#xff09;配置主从复制 &#xff08;二&#xff09;部署mycat 1、安装Java 2、下载mycat安装包 3、解压mycat包 4、设置变量环境 5、启动mycat &#xff08;三&#xff09;客户端连接数据库 1、安装…

(论文阅读32/100)Flowing convnets for human pose estimation in videos

32.文献阅读笔记 简介 题目 Flowing convnets for human pose estimation in videos 作者 Tomas Pfister, James Charles, and Andrew Zisserman, ICCV, 2015. 原文链接 https://arxiv.org/pdf/1506.02897.pdf 关键词 Human Pose Estimation in Videos 研究问题 视频…

火车头采集器如何设置代理IP

火车头采集器作为一种强大的数据抓取工具&#xff0c;已经被很多人熟知&#xff0c;它最大的优势就是设置代理IP确保采集过程的顺利进行。 今天我们就来说说&#xff0c;火车头采集器是怎么设置代理IP的。 1.打开火车头采集器软件&#xff0c;在打开的界面中点击http二级代理…

使用select实现定时任务

selectOutOfTime.c里边的代码如下&#xff1a; #include<stdio.h> #include<sys/time.h> #include<sys/types.h> #include<unistd.h> #include <string.h>#define BUF_SIZE 100int main(void){fd_set reads;struct timeval tv;int errorNum;cha…

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 &#xff1a; 思路拓展 问题一&#xff1a; 问题二&#xff1a; 总结&#xff1a; 问题三&#xff1a; 证明总结第三点 总结&#xff1a; 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路&#xff1a; 1.环形链表Ⅰ 141. 环形链…

AI生成图片教程(基于DALL-E3)

目录 前言new bingImage Creator 前言 今天登录GPT时发现openai的官网显示其有生成图片的模型DALL-E3&#xff0c;于是想试一试其效果如何。 奈何ChatGPT只能在付费版上使用&#xff0c;但是这个DALL-E3其实免费使用。 使用途径有两个&#xff1a; new bing 进入new bing 很…

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

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

sinc 函数

See https://wuli.wiki/online/sinc.html 公式(3)的证明见 https://wuli.wiki/online/JdLem.html#ex_JdLem_1 百度百科

5G车载网关让医院无人配送车“灵活“起来

​ 5G车载网关应用于无人医院配送车 随着社会老龄化加剧和医疗需求增长,为患者提供及时、便捷的药品配送服务成为医院的一项重要任务。传统的人工配送方式效率低下,无法满足患者的实时配送需求。针对这一痛点,5G车载网关为无人医院配送车提供了有力的技术支撑。 5G车载网关集成…

ubuntu小技巧30--23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer

ubuntu小技巧30-- 23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer 介绍解決方法说明 介绍 近期在电脑上安装了 ubuntu 23.10桌面版本, 安装最新版钉钉后无法正常打开软件&#xff0c;报错 undefined symbol: FT_Get_Color_Glyph_Layer &#xff0c;具…

安装部署PowerDNS--实现内网DNS解析(use)

使用PowerDNS实现内网DNS解析_powerdns-admin-CSDN博客 https://www.cnblogs.com/guangdelw/p/17348982.html 一、概念介绍 PowerDNS是一个域名解析服务&#xff0c;官网提供了三个组件&#xff1a;Authoritative、Recursor、dnsdist&#xff0c;分别用来作为权威服务器、域名递…

C++ VS2015安装教程,下载和安装(下载地址+图解+详细步骤)

说明&#xff1a;VS2015的三个版本分别为&#xff1a; Visual Studio Community(社区版)&#xff1a;满足大部分程序员的需求&#xff08;推荐&#xff09; Visual Studio Professional(专业版) Visual Studio Enterprise(企业版) 1、下载地址(这里只提供Community版) htt…

5 个基本步骤,学会创建自己的CRM流程

客户关系管理 (CRM) 系统是必备的客户数据库工具&#xff0c;用于跟踪潜在客户、现有客户、接触点等。使用可靠的技术来跟踪所有客户数据固然重要&#xff0c;但为该技术制定的流程更为关键。因这是用来管理客户和整个客户生命周期的策略。 什么是CRM流程&#xff1f; CRM流程…