MVC框架实现用户登录注册功能(连接数据库)

news2025/2/24 7:04:37

目录

一、简单理解MVC框架

二、项目结构

三、项目源码

3.1 User

3.2 UserDao

3.3 RegisterDao

3.4 servletControll

3.5 servletControllRegister

3.6 web.xml

3.7 login.jsp

3.8 register.jsp

3.9 success.jsp

3.10 failure.jsp

 四、实现效果

总结

前言

本篇文章主要介绍利用MVC框架去实现一个简单的用户登录注册功能,内容主要以源码为主来介绍,目的是让大家成功搭建出此项目。项目使用SQL Server 数据库,需要导入sqljdbc4.jar包,jar包会在下面给大家提供。

一、简单理解MVC框架

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。

其中,View的定义比较清晰,就是用户界面。Model即对数据进行逻辑处理的部分。Controller按照用户请求来选择对应的Model进行处理同时把处理结果返回到指定的jsp视图中,只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

二、项目结构

三、项目源码

3.1 User

代码如下(示例):

public class User {
    // 封装实体类的JavaBean

    private String name;
    private String password;

    public User() {

    }

    // 构造方法用来传入数值
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}




3.2 UserDao

代码如下(示例):

import java.sql.*;


//处理业务逻辑的JavaBean
public class UserDao {

    public static int login(User user) {
        int flag = -1;
        String NAME = "sa";
        String PASSWORD = "123456";
        String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";

        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 1、加载驱动
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // 2、建立连接
            connection = DriverManager.getConnection(URL, NAME, PASSWORD);

            // 3、操作数据库
            String sql = "select count(*) from admins where name=? and password=?";
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, user.getName());
            pstmt.setString(2, user.getPassword());
            // 4、执行
            rs = pstmt.executeQuery();

            if (rs.next()) {
                flag = rs.getInt(1);
            }
            if (flag > 0) {// 登录成功
                return 1;
            } else {
                return 0;
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return -1;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {

            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

3.3 RegisterDao

代码如下(示例):

import java.sql.*;

//封装注册功能业务逻辑的JavaBean
public class RegisterDao {

    public static int register(User user) {
        int count = -1;
        String NAME = "sa";
        String PASSWORD = "123456";
        String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";

        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            //1、加载驱动
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //2、连接
            connection = DriverManager.getConnection(URL, NAME, PASSWORD);
            //操作数据库
            String sql = "insert into admins values(?,?)";//插入数据
            pstmt = connection.prepareStatement(sql);
            pstmt.setString(1, user.getName());
            pstmt.setString(2, user.getPassword());

            count = pstmt.executeUpdate();
            return count;

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return -1;
        } catch (SQLException e) {
            e.printStackTrace();
            return -1;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {

            try {
                if (pstmt != null) pstmt.close();
                if (connection != null) connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }


}

3.4 servletControll

代码如下(示例):

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * Servlet implementation class servletControll
 */
@WebServlet("/servletControll")
public class servletControll extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //取值
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("uname");
        String pwd = request.getParameter("upwd");
        //封装
        User user = new User(name, pwd);

        //调用业务逻辑层
        int result = UserDao.login(user);

        if (result > 0) {
            //登录成功
            response.sendRedirect("success.jsp");//重定向到成功界面
        } else {
            //登录失败
            response.sendRedirect("notsuccess.jsp");//定位到失败页面
        }
        //请求转发
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

3.5 servletControllRegister

代码如下(示例):

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * Servlet implementation class servletControllRegister
 */
@WebServlet("/servletControllRegister")
public class servletControllRegister extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //注册功能、、向数据库添加数据

        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("uname");
        String pwd = request.getParameter("upwd");

        User user = new User(name, pwd);//保存客户端输入的信息

        int result = RegisterDao.register(user);
        if (result > 0) {
            //注册成功
            response.sendRedirect("login.jsp");
        } else {
            //注册失败重新注册
            response.sendRedirect("register.jsp");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

3.6 web.xml

代码如下(示例):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 初始的页面 -->
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
    <!-- 用户名和密码验证的servlet -->
    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>servletControll</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>
    <!-- 显示欢迎的servlet -->
    <servlet>
        <servlet-name>Register</servlet-name>
        <servlet-class>servletControllRegister</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Register</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
</web-app>

3.7 login.jsp

代码如下(示例):

<%--
  Created by IntelliJ IDEA.
  User: 10504
  Date: 2022/5/17
  Time: 12:49
  To change this template use File | Settings | File Templates.
--%>
登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>

<form action="servletControll" method="post">

    用户名:<input type="text" name="uname"/>
    密码:<input type="password" name="upwd"/><br><br>
    <input type="submit" value="登录"/>
    <input type="reset" value="重置"/>
    <a href="register.jsp">注册新用户</a>
</form>

</body>
</html>



3.8 register.jsp

代码如下(示例):

<%--
  Created by IntelliJ IDEA.
  User: 10504
  Date: 2022/5/17
  Time: 12:55
  To change this template use File | Settings | File Templates.
--%>
注册页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>

<form action="servletControllRegister" method="post">

    用户名:<input type="text" name="uname"/>
    密码:<input type="password" name="upwd"/>
    <input type="submit" value="注册"/>
</form>

</body>
</html>



3.9 success.jsp

代码如下(示例):

<%--
  Created by IntelliJ IDEA.
  User: 10504
  Date: 2022/5/17
  Time: 13:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
欢迎您的使用!
</body>
</html>

3.10 failure.jsp

代码如下(示例):

<%--
  Created by IntelliJ IDEA.
  User: 10504
  Date: 2022/5/17
  Time: 13:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录失败</title>
</head>
<body>

</body>
</html>

、实现效果

 

总结

以上简单介绍了利用MVC框架实现用户登录注册功能的基本流程,具体的jsp界面只完成了功能,下去可以利用css技术渲染自己的界面。

有关数据库的问题,大家可以使用Microsoft SQL Server Management Studio 18来建立一个名为test的数据库,在里面建一个admins表,列名为name和password即可。另外还要注意更改自己的数据库登录账号和密码。

有学到的小伙伴希望多多关注、点赞、支持!

以此处附上下载地址:sqljdbc4.jarhttps://pan.baidu.com/s/1Wc7QsZwJsMYe0-WEOXjZlw?pwd=7px5

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

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

相关文章

vue 3 第二十六章:样式(scoped及样式穿透)

文章目录 1. 介绍2. 基本使用3. scoped原理4. 穿透选择器修改全局样式 1. 介绍 在 Vue 中&#xff0c;我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 <style> 标签添加 scoped 特性&#xff0c;我们可以确保组件的样式仅应用于该组件的模板中&#x…

第56章:socket介绍

socket允许位于同一主机&#xff08;计算机&#xff09;或使用网络连接起来的不同主机上的应用程序之间交换数据 概述 在一个典型的客户端/服务器场景中&#xff0c;应用程序使用socket 进行通信的方式如下&#xff1a; 各个应用程序创建一个socket。socket 是一个允许通信的…

项目压测相关

几个重要指标的关系 QPS 并发数/平均响应时间 并发数 QPS*平均响应时间 也就是说&#xff0c;并发连接数代表服务器抗压能力&#xff0c;接收连接的能力。qps代表在相同的并发数下&#xff0c;服务器处理的速度&#xff0c;响应时间越短&#xff0c;那么qps就越大。 不是说并发…

Unity Lightmapping Setting

如下图&#xff1a; Lightmapper: 使用什么硬件或算法渲染 Progressive CPU、Progressive GPU、Enlighten(新的算放目前用的比较少) 此数值会被用于分别乘以Direct Samples&#xff0c;Indirect Samples和Environment Samples这三个数值。这三个数值会被应用于…

【Netty】Netty 如何实现零拷贝(八)

文章目录 前言一、Java 实现零拷贝1.1 Java提供 mmap/write 方式1.2 Java 提供 sendfile 方式 二、Netty 实现零拷贝2.1 CompositeByteBuf 方式2.1 wrap 方式2.3 slice 方式2.4 FileRegion 方式 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff0…

李沐多模态串讲笔记

李沐多模态串讲笔记 0.来源1.回顾1.1 ViLT回顾1.2 Clip回顾1.3回顾小结 2.ALBEF2.1摘要2.2主体方法部分2.2.1模型设计2.2.2目标函数2.2.3momentum distillation 动量蒸馏 2.3下游任务和实验结果 3.VLMo3.1论文贡献3.2研究动机3.3主体方法部分3.3.1模型设计3.3.2分阶段的训练策略…

Android 12 通知样式整理

目录 0. &#x1f4c2; 前言 1. &#x1f531; 通知样式总览 2. ⚛️ 通知样式详解 2.1 Simple Notifiaction 2.2 Action Notifiaction 2.3 Remote Input Notifiaction 2.4 Big Picture Notifiaction 2.5 Big Text Notifiaction 2.6 Inbox Notifiaction 2.7 Media No…

Cobalt Strike工具基本使用

Cobalt Strike 安装启动启动server端启动client目标机器连接 工具基使用用户驱动攻击屏幕截图进程列表键盘记录文件管理远程vnc远程代理端口扫描 生成后门被攻击者运行后门文件后查看结果 钓鱼攻击信息收集网站克隆文件下载 安装 网盘地址&#xff1a;链接&#xff1a;https:/…

AntDB-S流式数据库体验

本文作者&#xff1a;彭冲老师&#xff0c;上一篇彭老师体验了亚信刚发布的社区版AntDB-T数据库&#xff0c;文章如下&#xff1a; AntDB-T交易型数据库体验 本文继续体验AntDB-S流式数据库的&#xff0c;AntDB-S目前还未开放社区版&#xff0c;可以联系AntDB小助手进行体验。…

电压放大器的主要指标有哪些方面

电压放大器是电子电路中常用的器件&#xff0c;在选择和评估电压放大器时&#xff0c;需要考虑以下几个主要指标&#xff1a; 输入电阻&#xff08;Input Resistor&#xff09;&#xff1a;输入电阻是指放大器输入端的电阻值&#xff0c;它反映了放大器将输入信号转换成输出信号…

亚马逊,速卖通,国际站卖家在做测评时如何将风险降到最低呢?

测评是亚马逊卖家提升产品可信度和销售表现的重要手段 现在的测评市场遭到卖家们的极力吐槽&#xff0c;想要找到靠谱的资源也越来越难。据了解&#xff0c;去年很多骗子&#xff0c;中介都涌进测评市场&#xff0c;随意报价&#xff0c;导致整个市场鱼龙混杂&#xff0c;卖家…

MyBatis源码学习四之二级缓存

MyBatis源码学习四之二级缓存 MyBatis的缓存使用的也比较多&#xff0c;而缓存的都实现了一个父类的接口Cache。 一、加载缓存类PerputualCache public static void main(String[] args) {InputStream inputStream null;try {inputStream Resources.getResourceAsStream(&q…

NRK3303语音识别芯片在照明灯上的运用,一款可分布式语音IC方案

随着科技的不断进步&#xff0c;人们对于家居生活中的照明设备的要求也逐渐提高。传统的照明方式已经不能满足人们对智能家居的需求&#xff0c;我们需要更加智能、易于操作、高效节能的智能化照明系统。因此&#xff0c;智能照明应运而生&#xff0c;为我们提供了更加智能化、…

倍福触摸屏维修控制面板CP6606-0001-0020

适合控制柜安装的CP6600和CP6606面板型PC&#xff0c;适用于机械制造和设备工程等各种应用&#xff1b;可以安装TwinCAT自动化软件和 Windows Embedded操作系统&#xff0c;用作单独的控制器&#xff0c;也可以用作远程桌面显示器。 倍福触摸屏常见故障分类&#xff1a; 1、磨…

linux学习[11]磁盘与文件系统(2):lsblkblkidpartedfdiskgdiskmkfs

文章目录 前言&#xff1a;1. 磁盘容量1.1 lsblk1.2 blkid1.3 parted 2. 磁盘分区2.1 fdisk/gdisk2.2 磁盘分区实例参考&#xff1a; 3. 磁盘格式化3.1 mkfs.xfs3.2 mkfs.ext43.3 mkfs.vfat 总结&#xff1a; 前言&#xff1a; 写了VMware的磁盘扩容之后&#xff0c;磁盘分区格…

深度学习基础-卷积神经网络CNN+深度学习(无代码仅理解)

参考书籍&#xff1a;&#xff08;找不到资源可以后台私信我&#xff09; 《深度学习入门&#xff1a;基于Python的理论与实现 (斋藤康毅)》 CNN 概括 其中pooling层有时候会被省略&#xff0c;卷积层的输入输出图像称为特征图&#xff08;feature map&#xff09;&#xff0c…

多线程-Thread类的常用方法和生命周期

Thread类的常用结构 构造器 public Thread():分配一个新的线程对象。public Thread(String name):分配一个指定名字的新的线程对象。public Thread(Runnable target):指定创建线程的目标对象&#xff0c;它实现了Runnable接口中的run()方法。public Thread(Runnable target,S…

Python实现温度植被干旱指数(TVDI)的计算

前言 温度植被干旱指数&#xff08;Temperature Vegetation Dryness Index&#xff0c;TVDI&#xff09;是一种基于光学与热红外遥感通道数据进行植被覆盖区域表层土壤水分反演的方法。作为同时与归一化植被指数(NDVI)和地表温度(LST)相关的温度植被干旱指数(TVDI)可用于干旱监…

第二十五节:通信之WLAN(WiFi聚合)

欢迎大家一起学习探讨通信之WLAN。为了减少帧交互中额外资源占用开销&#xff0c;提高WiFi网络系统整体运行效率&#xff0c;802.11n协议引入定义了聚合功能。本节将基于协议定义内容和实例&#xff0c;详细分析“A-MSDU"和“A-MPDU”两种聚合功能。 关键字 S1G(Sub 1 GH…