servlet+jdbc+jsp实现登录界面的验证(基于MVC思想)

news2024/9/30 11:38:44

一、MVC的概念

MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务 逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了 代码的可维护性。

  • M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的

DAO对象。

  • V:主要负责数据收集 和 数据展现,通常由JSP文件完成。

  • C:主要负责流程控制 和 页面跳转,通常由Servlet完成。

在这里插入图片描述

原始的登录验证方法:

在这里插入图片描述

改进的登录验证方法:

在这里插入图片描述

这样实现了解耦,从而具备了更好的扩展性。

二、需求

  1. 浏览器 进入 登录界面,输入用户名、密码,发送到服务器。
  2. 服务器完成数据库查询和验证,返回验证结果。
  3. 验证结果呈现在响应界面上。

三、代码演示

1、编写登录界面

  1. 创建空工程,在工程中创建javaEE模块

  2. 配置中设置tomcat的部署

    在这里插入图片描述

    在这里插入图片描述

  3. 编写login界面

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
    <head>
      <title>JSP - login</title>
    </head>
    <body>
    <form action="loginServlet" method="post">
      用户名:<input type="text" name="userName"><br>
      密  码:<input type="text" name="password"><br>
      <input type="submit" value="登录">
    </form>
    </body>
    
```

2、编写LoginServlet实现获取用户名和密码

  1. 编写servlet

    • LoginServlet

      package com.example.login_demo.servlet;
      
      import com.example.login_demo.pojo.User;
      import com.example.login_demo.service.UserService;
      
      import javax.servlet.*;
      import javax.servlet.http.*;
      import javax.servlet.annotation.*;
      import java.io.IOException;
      
      @WebServlet(name = "LoginServlet", value = "/loginServlet")
      public class LoginServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request, response);
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1、获取的用户名和密码
              String userName = request.getParameter("userName");
              System.out.println("获取的用户名:" + userName);
              String password = request.getParameter("password");
              System.out.println("获取的密码:" + password);
          }
      }
      
      
  2. 单元测试:

    • 运行tomcat

    • 访问登录界面,发送登录请求

      在这里插入图片描述

3、操作数据库部分

  1. 数据准备,db_web数据库下准备t_user表

    在这里插入图片描述

  2. 编写DbUtils,实现jdbc的封装

    package com.example.login_demo.utils;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class DbUtils {
    
        private static String jdbcName;
        private static String dbUrl;
        private static String dbUserName;
        private static String dbPassword;
    
        static {
            jdbcName = "com.mysql.jdbc.Driver";
            dbUrl = "jdbc:mysql://localhost:3306/db_web?useSSL=false";
            dbUserName = "root";
            dbPassword = "root";
            try {
                Class.forName(jdbcName);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        public static Connection getConnection() throws SQLException {
            Connection connection = DriverManager.getConnection(dbUrl, dbUserName, dbPassword);
            return connection;
        }
    
        public static void closeResource(Connection connection, PreparedStatement preparedStatement) throws SQLException {
            if (null != connection){
                connection.close();
            }
            if (null != preparedStatement){
                preparedStatement.close();
            }
        }
    
    }
    
    
  3. 原始数据类型User

    package com.example.login_demo.pojo;
    
    public class User {
    
      private int id;
    
      private String userName;
    
      private String password;
    
      public User(String userName, String password) {
          this.userName = userName;
          this.password = password;
      }
    
      public int getId() {
          return id;
      }
    
      public void setId(int id) {
          this.id = id;
      }
    
      public String getUserName() {
          return userName;
      }
    
      public void setUserName(String userName) {
          this.userName = userName;
      }
    
      public String getPassword() {
          return password;
      }
    
      public void setPassword(String password) {
          this.password = password;
      }
    
      @Override
      public String toString() {
          return "User{" +
                  "id=" + id +
                  ", userName='" + userName + '\'' +
                  ", password='" + password + '\'' +
                  '}';
      }
    }
    
    
  4. dao层直接操作数据库

    • UserDao接口

      package com.example.login_demo.dao;
      
      import com.example.login_demo.pojo.User;
      
      public interface UserDao {
      
          //查询用户
          User userLogin(User user);
      }
      
    • UserDaoImpl接口实现类

      package com.example.login_demo.dao;
      
      import com.example.login_demo.pojo.User;
      import com.example.login_demo.utils.DbUtils;
      
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      
      public class UserDaoImpl implements UserDao {
          @Override
          public User userLogin(User user) {
              Connection connection = null;
              PreparedStatement preparedStatement = null;
              ResultSet resultSet = null;
              try {
                  //1、获取数据库连接
                  connection = DbUtils.getConnection();
      
                  //2、准备sql语句
                  String sql = "select * from t_user where userName = ? and password = ?";
      
                  //3、执行sql返回结果
                  preparedStatement = connection.prepareStatement(sql);
                  preparedStatement.setString(1, user.getUserName());
                  preparedStatement.setString(2, user.getPassword());
                  resultSet = preparedStatement.executeQuery();
                  if (resultSet.next()){
                      User returnUser = new User(resultSet.getString("userName"), resultSet.getString("password"));
                      returnUser.setId(Integer.parseInt(resultSet.getString("id")));
                      return returnUser; //查找成功
                  }
              }catch (SQLException e){
                  e.printStackTrace();
              }finally {
                  //4、释放资源
                  try {
                      DbUtils.closeResource(connection, preparedStatement);
                      if (null != resultSet){
                          resultSet.close();
                      }
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
              }
              return null;//查找失败
          }
      
          public static void main(String[] args) {
              UserDao userDao = new UserDaoImpl();
              User admin = userDao.userLogin(new User("admin", "12345"));
              System.out.println("查找到的用户:" + admin);
          }
      }
      
      
  5. 单元测试:

    • 执行UserDaoImpl中的测试代码

      在这里插入图片描述

4、service层实现

  1. UserDaoFactory实现:简单的静态工厂实现UserDao的实例创建,实现创建和使用的解耦

    package com.example.login_demo.factory;
    
    import com.example.login_demo.dao.UserDao;
    import com.example.login_demo.dao.UserDaoImpl;
    
    public class UserDaoFactory {
    
        public static UserDao getUserDao(){
            return new UserDaoImpl();
        }
    }
    
  2. service层实现dao层调用

    package com.example.login_demo.service;
    
    import com.example.login_demo.dao.UserDao;
    import com.example.login_demo.factory.UserDaoFactory;
    import com.example.login_demo.pojo.User;
    
    public class UserService {
        private UserDao userDao;
    
        public UserService(){
            this.userDao = UserDaoFactory.getUserDao();
        }
    
        public User userLoginService(User user){
            return userDao.userLogin(user);
        }
    
    }
    
    

5、修改Servlet,实现数据库的查找验证

  1. LoginServlet

    package com.example.login_demo.servlet;
    
    import com.example.login_demo.pojo.User;
    import com.example.login_demo.service.UserService;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    
    @WebServlet(name = "LoginServlet", value = "/loginServlet")
    public class LoginServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          this.doPost(request, response);
      }
    
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //1、获取的用户名和密码
          String userName = request.getParameter("userName");
          System.out.println("获取的用户名:" + userName);
          String password = request.getParameter("password");
          System.out.println("获取的密码:" + password);
          //2、创建UserService类型的对象实现数据的校验功能
          UserService userService = new UserService();
          User user = userService.userLoginService(new User(userName, password));
          if (null != user){
              System.out.println("登录成功!");
          }else {
              System.out.println("登录失败!");
          }
      }
    }
    
    
  2. 单元测试:

    在这里插入图片描述

6、修改Servlet,实现页面的跳转

  1. 修改LoginServlet,当成功时,跳转到成功界面;当失败时,跳转回登录界面并显示账号或者密码错误

    package com.example.login_demo.servlet;
    
    import com.example.login_demo.pojo.User;
    import com.example.login_demo.service.UserService;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    
    @WebServlet(name = "LoginServlet", value = "/loginServlet")
    public class LoginServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          this.doPost(request, response);
      }
    
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //1、获取的用户名和密码
          String userName = request.getParameter("userName");
          System.out.println("获取的用户名:" + userName);
          String password = request.getParameter("password");
          System.out.println("获取的密码:" + password);
          //2、创建UserService类型的对象实现数据的校验功能
          UserService userService = new UserService();
          User user = userService.userLoginService(new User(userName, password));
          if (null != user){
              System.out.println("登录成功!");
              //登录成功的信息放入session对象实现多个请求共享
              request.getSession().setAttribute("user", user);
              //实现客户端跳转
              response.sendRedirect("main.jsp");
    
          }else {
              System.out.println("登录失败,用户名或者密码错误!");
              request.setAttribute("error", "登录失败,用户名或者密码错误!");
              //实现服务器跳转,使用转发,共享request
              RequestDispatcher requestDispatcher = request.getRequestDispatcher("login.jsp");
              requestDispatcher.forward(request, response);
          }
      }
    }
    
    
  2. main.jsp

<%@ page import="com.example.login_demo.pojo.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页面</title>
</head>
<body>
<h1>登录成功!欢迎 <%=(User)session.getAttribute("user")%> !</h1>
</body>
</html>

  1. login.jsp

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
    <head>
     <title>JSP - login</title>
    </head>
    <body>
    <form action="loginServlet" method="post">
     用户名:<input type="text" name="userName"><br>
     密  码:<input type="text" name="password"><br>
     <span style="color: red"><%=request.getAttribute("error") == null?"":request.getAttribute("error")%></span><br>
     <input type="submit" value="登录">
    </form>
    </body>
    </html>
    
  2. 测试:

    在这里插入图片描述

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

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

相关文章

第 121 场 LeetCode 双周赛题解

A 大于等于顺序前缀和的最小缺失整数 模拟&#xff1a;先求最长顺序前缀的和 s s s &#xff0c;然后从 s s s 开始找没有出现在 n u m s nums nums 中的最小整数 class Solution { public:int missingInteger(vector<int> &nums) {unordered_set<int> vis(…

嵌入式(四)定时器 | 定时器功能 分类 定时器工作模式 寄存器全介绍

文章目录 1 定时器工作原理2 定时器功能3 定时器分类3.1 定时器13.2 定时器23.3 定时器3和定时器43.4 睡眠定时器3.5 看门狗定时器 4 定时器工作模式4.1 自由运行模式4.2 模模式4.3 正计数/倒计数模式 5 定时器1寄存器5.1 计数寄存器5.2 计数控制寄存器 6 定时器的两种使用方式…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

性能分析与调优: Linux 性能分析60秒

目录 一、实验 1.环境 2.Linux性能分析60秒 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192.168…

muduo网络库剖析——日志Log类

muduo网络库剖析——日志Log类 前情从muduo到my_muduo 概要日志日志级别 框架与细节成员函数 源码 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精华…

freesurfer-reconall后批量提取TIV(颅内总体积)

#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta

开启Android学习之旅-4-Android集成FontAwesome

FontAwesome 是一个非常标准、统一风格的图标库。产品经理在原型中应用了很多图标都是FontAwesome。正常流程是 UI 需要再手工绘制或在 iconfont 或 iconpark 网站挨个找&#xff0c;如果在 Android 直接使用不是省了一步&#xff08;注意版权问题&#xff0c;使用免费版&#…

贯穿设计模式-责任链模式

样例代码 涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取 需求 实时地&#xff0c;根据city&#xff0c;sex&#xff0c;product字段进行业务投放&#xff0c;比如&#xff1a;北京的男生&#xff1b;四川的电脑等等 → 责任链模式&…

dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib

更新Xcode14后低版本iPhone调试报错 dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib Referenced from: /var/containers/Bundle/Application/…/….app/… Reason: image not found 这是缺少libswiftCoreGraphics库 直接导入libswiftCoreGraphics库即…

国产手机的遮羞布又被撕,市占率仅3%,苹果才是真第一!

国产手机纷纷宣称自己击败了苹果&#xff0c;不过这些第一全部加了定语&#xff0c;例如某周销量&#xff0c;某个价格段等等&#xff0c;而日前一加中国区总裁李杰则揭开了这层遮羞布&#xff0c;就全年来看苹果才是中国手机市场第一名&#xff01; 李杰指出市调机构BCI给出的…

华为云服务器试用领取

系列文章目录 华为云服务器试用领取 领取的试用云服务器在哪 文章目录 系列文章目录介绍 介绍 我将会用该系列文章讲述如何在云服务器中安装大数据软件及其环境搭建。如有不足之处&#xff0c;还望指点。 本篇文章讲述的是华为云服务器的免费试用。 华为弹性云服务器 ECS 该云…

基于 IP 多播的网络会议程序(2024)

1.题目描述 局域网 IP 多播程序&#xff0c;设计一个图形界面的网络会议程序&#xff08;实现文本多播方式即可&#xff09;。 2.演示Demo 3.参考代码 广播发送代码 //服务端 #include <winsock2.h> #include <iostream> #include <list>#pragma comment(l…

滑动窗口协议仿真(2024)

1.题目描述 滑动窗口协议以基于分组的数据传输协议为特征&#xff0c;该协议适用于在数据链路层以及传输层中对按 顺序传送分组的可靠性要求较高的环境。在长管道传输过程&#xff08;特别是无线环境&#xff09;中&#xff0c;相应的滑动窗口 协议可实现高效的重传恢复。附录 …

Guava Cache 异步刷新技巧

前言 Guava Cache是一款非常优秀的本地缓存框架&#xff0c;提供简洁易用的 API 供开发者使用。 这篇文章&#xff0c;我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 基本用法 首先&#xff0c;在 Java 应用中添加 maven 依赖&#xff1a; <dependency&g…

jsES6+新语法

目录 模板字符串标签模板字符串 函数增强默认值与解构剩余参数rest和arguments 箭头函数 展开语法SymbolSetSet方法weakSetweakSet常用方法 MapMap常用方法weakMapweakMap常用方法 PromiseProxy/Reflect迭代器与生成器ES6新增方法includes**Object.valuesObject.entriespadStar…

【SpringBoot】公共字段自动填充功能实现(枚举、自定义注解、AOP、反射)

1. 自定义注解 使用interface语法来定义注解&#xff08;Annotation&#xff09;。 注解的参数类似无参数方法&#xff0c;可以用default设定一个默认值&#xff0c;比如String value() default "";。 元注解&#xff1a;有一些注解可以修饰其他注解&#xff0c;这…

Diffusion扩散模型学习2:DDPM前向加噪过程torch实现

参考: https://arxiv.org/pdf/2006.11239.pdf ##论文 https://github.com/dtransposed/code_videos/blob/main/01_Diffusion_Models_Tutorial/Diffusion%20Model.ipynb ##code https://spaces.ac.cn/archives/9119 1、红色框: 前向过程论文公式推出可以从x0原图一步到最终噪声…

学习Redis缓存

学习Redis缓存 NoSQL和SQL的区别缓存缓存作用缓存成本添加Redis缓存 Redis特征Redis中数据结构Redis通用命令String类型Key的层级格式Hash类型Redis的Java客户端 NoSQL和SQL的区别 缓存 缓存就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;一般读写性比较高…

数据分析——火车信息

任务目标 任务 1、整理火车发车信息数据&#xff0c;结果的表格形式为&#xff1a; 2、并输出最终的发车信息表 难点 1、多文件 一个文件夹&#xff0c;多个月的发车信息&#xff0c;一个excel&#xff0c;放一天的发车情况 2、数据表的格式特殊 如何分析表是一个难点 数…

洛谷 P1019 单词接龙

题目背景 注意&#xff1a;本题为上古 NOIP 原题&#xff0c;不保证存在靠谱的做法能通过该数据范围下的所有数据。 NOIP2000 提高组 T3 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏&#xff0c;现在我们已知一组单词&#xff0c;且给定一个开头的字母&…