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

一、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. 测试:

    在这里插入图片描述

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

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

相关文章

基于JavaWeb+SSM+Vue基于微信小程序的消防隐患在线举报系统的设计与实现

基于JavaWebSSMVue基于微信小程序的消防隐患在线举报系统的设计与实现 源码获取入口KaiTi 报告Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告 1.1 题目背景 随着信息化飞速发展&#xff0c;互联网不…

RabbitMQ(八)消息的序列化

目录 一、为什么需要消息序列化&#xff1f;二、常用的消息序列化方式1&#xff09;Java原生序列化&#xff08;默认&#xff09;2&#xff09;JSON格式3&#xff09;Protobuf 格式4&#xff09;Avro 格式5&#xff09;MessagePack 格式 三、总结 RabbitMQ 是一个强大的消息中间…

网络层协议及IP编址

0x00 前言 本节为网络层协议及IP编址内容 IP地址的范围&#xff1a;0.0.0.0-255.255.255.255 IP分为网络位以及主机位。子网划分就是向主机位借位。 网络层协议 IPICMP&#xff08;internet Control message protocol&#xff09;IPX IP协议的作用 为网络层的设备提供逻…

程序语言相关知识——偏向Eigen矩阵

1 查看 Eigen库表示的矩阵 方法 1.1 列矩阵x在监视中&#xff0c;这样查看&#xff0c;数值右侧的圈圈 可用于更新数值 随程序 1.2 比较全的方法&#xff1a;来自于知乎&#xff1a;https://zhuanlan.zhihu.com/p/625334009?utm_id0 1.3 eigen的用法&#xff1a;https://ww…

linux高级管理——Squid代理

一、squid服务基础&#xff1a; 1.1缓存代理的概述&#xff1a; 代理的工作机制 当客户机通过代理来请求Web页面时&#xff0e;指定的代理服务器会先检查自己的缓存&#xff0c;如果缓存中已经有客户机需要的页面&#xff0c;则直接将缓存中的页面内容反馈给客户机:如果缓存中…

整合事务,名词,概念

1、MySQL是单进程多线程&#xff08;而Oracle等是多进程&#xff09;&#xff0c;也就是说MySQL实例在系 统上表现就是一个服务进程&#xff0c;即进程&#xff0c;&#xff08;通过多种方法可以创建多实例&#xff0c;再安装一个端口号不同的mysql&#xff0c;或者通过workben…

滞回比较器(施密特触发器)在软件中的应用-电池电压显示

1、单限比较器和滞回比较器的区别 在单限比较器中&#xff0c;输入电压在阈值电压附近的任何微小变化&#xff0c;都会引起输出电压的跃变。不管这种微小变化是来源于输入电压还是来源于外部干扰。因此&#xff0c;虽然单限比较器很灵敏&#xff0c;但是抗干扰能力差。在单限比…

学习Redis缓存

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

10款有趣的前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 自毁按钮动画特效 自毁按钮动画特效 点击打开盒子可以点击自毁按钮 进而会出现自毁…

使用Python+selenium3.0实现第一个自动化测试脚本

这篇文章主要介绍了使用Pythonselenium实现第一个自动化测试脚本&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化&#xff0c;记录一下学习过程。…

Linux驱动学习—中断

1、中断基础概念 1.1 什么是中断 CPU在正常运行期间&#xff0c;由外部或者内部引起的时间&#xff0c;让CPU停下当前正在运行的程序&#xff0c;转而去执行触发他的中断所对应的程序&#xff0c;这就是中断。 响应中断的过程&#xff1a; <1>中断请求 <2>中断…

Spring Cloud之OpenFeign异常处理

简易原理图 原理基于请求头传递错误消息&#xff0c;利用aop和全局异常拦截机制实现。 服务提供者 远程调用本地方法b&#xff0c;throw异常出来FeignExceptionAspect AOP拦截处理异常到请求头中&#xff0c;继续throwGlobalExceptionHandler处理&#xff0c;返回响应Respons…

1868_C语言单向链表的实现

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/c_basic: little bits of c. 1868_C语言中简单的链表实现 简单整理一下链表的实现&#xff0c;这一次结合前面看到的一些代码简单修改做一个小结。 主题由来介绍 以前工作之中链表的使用其实不多&#xff0c;主要是…

C++动态内存分配(动态内存分配函数)栈区

内存拷贝函数&#xff1a; void *memcpy(void *dest,const void *src,size_tn);#include<string.h>功能&#xff1a;从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest内存地址的起始位置 分配内存使用new 例如&#xff1a;salarynew int[num]; 最后需要释放…

三、Qt核心与Qt类库

一、Qt核心&#xff1a;元对象系统 1、Qt核心特点 Qt对标准C进行了扩展&#xff0c;引入了一些新的概念和功能元对象编译器&#xff08;MOC&#xff09;是一个预处理器&#xff0c;先将Qt的特性程序转为标准C程序&#xff0c;再由标准C编译器进行编译Qt为C语言增加的特性在Qt…

Android学习(三):在Android虚拟机中运行项目

Android学习&#xff08;三&#xff09;&#xff1a;在Android虚拟机中运行项目 一、前期准备 在系统环境变量中添加ANDROID_SDK_HOME&#xff0c;把值指定到一个其他目录。就可以把Android AVD(虚拟机)创建在指定目录下。修改环境变量后&#xff0c;如果Android Studio是在运…

Java Swing手搓童年坦克大战游戏(I)

前言 业余偶尔对游戏有些兴趣&#xff0c;不过这样的时代&#xff0c;硬件软件飞速进步&#xff0c;2D游戏画面都无比精美&#xff0c;之前的8bit像素游戏时代早就过去了&#xff0c;不过那时候有许多让人印象深刻的游戏比如魂斗罗、超级玛丽、坦克大战(Battle City)等等。 学…

1866_FreeRTOS的存储管理方案heap_4分析

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS. 1866_FreeRTOS的存储管理方案heap_4分析 对FreeRTOS的heap_4进行分析拆解&#xff0c;按照文学式编程的方式重新组织成个人笔记。 主题由来介绍 free以及malloc这样的存…

辗转相除法求最大公约数

介绍 辗转相除法&#xff08;又称欧几里德算法&#xff09;是一种求最大公约数的算法。它基于这样一个事实&#xff1a;两个数的最大公约数等于较大数和较小数余数的最大公约数。即两个数相除&#xff0c;再将除数和余数反复相除&#xff0c;当余数为0时&#xff0c;取当前除法…