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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected 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;}@Overridepublic 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 {@Overridepublic 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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected 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 {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected 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", "登录失败,用户名或者密码错误!");//实现服务器跳转,使用转发,共享requestRequestDispatcher 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.mzph.cn/news/602925.shtml

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

相关文章

如何在Linux上安装使用达芬奇DaVinci-Resolve视频剪辑|附带格式转换脚本

如何在openSUSE-Linux上安装DaVinci-Resolve 您是否还在等待Adobe套件在Linux上的到来&#xff1f;您是否曾多次尝试通过Wine使用Premiere&#xff1f;您是否还在想苹果为什么不以Linux本机版本发布Final Cut Pro&#xff1f; 如果您对所有这些问题中的一个或全部回答是&…

K8S学习指南(65)-Operator介绍

文章目录 引言什么是 Operator&#xff1f;Operator 的优势1. 自动化操作2. 定制资源3. 增强运维功能4. 增强 K8S 原生 API Operator 的优缺点优点&#xff1a;1. 自动化运维2. 定制资源3. 跨平台性4. 增强 K8S API缺点&#xff1a;1. 学习成本2. 复杂性3. 需要专业知识 Operat…

C 字符串替换方法

/* 功能&#xff1a;将str字符串中的oldstr字符串替换为newstr字符串 * 参数&#xff1a;str&#xff1a;操作目标 oldstr&#xff1a;被替换者 newstr&#xff1a;替换者 * 返回值&#xff1a;返回替换之后的字符串 * */ std::string BaseUtil::strrpc(char *str,char *oldst…

浅析观察者模式在Java中的应用

观察者模式&#xff08;Observer Design Pattern&#xff09;,也叫做发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;、模型-视图&#xff08;Model-View&#xff09;模式、源-监听器&#xff08;Source-Listener&#xff09;模式、从属者&#xff08;D…

AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

高版本ant-design动态引用icon

需求 最近在更新自己的博客系统&#xff0c;从 vue2 升到 vue3&#xff0c;同步的也把 ant-design 从 1.7.8 跨越多个大版本升级到了 4.0.8&#xff0c;发现菜单上的 icon 报错了。 查询官方文档发现自从 2.0 版本以后的 icon 就不再支持通过 <a-icon /> 组件动态 type…

uniapp 文字超出多少字,显示收起全文按钮效果demo(整理)

收起展开 <template><view class"font30 color000 mL30 mR30"><text :class"showFullText ? : clamp-text">{{ text }}</text><view v-if"showToggleBtn && text.length > 42" click"toggleShowFu…

Python:类型标注解决循环引用问题most likely due to a circular import

两个模块&#xff0c;我们需要做类型标注&#xff0c;于是出现了循环引用的问题 # models.py from controllers import BookControllerclass Book:def get_controller(self) -> BookController:return BookController(self)# controllers.py from models import Bookclass …

基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于mopso+bp的多目标求解资源

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于mopso+bp的多目标求解资源 代码 结果分析 展望 代码下载:基于多目标粒子群算法的支配解…

Github 2024-01-07 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-07统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Jupyter Notebook项目2Go项目2C#项目1Starlark项目1非开发语言项目1Java项目1 跨平台应用程序UI框…

qt信号和槽

Qt是一个跨平台的C图形用户界面应用框架 91年奇趣科技开发 pro工程文件介绍 .pro就是工程文件(project)&#xff0c;它是qmake自动生成的用于生产makefile的配置文件 QT core gui //Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT widgets //大于4版本包含…

openssl ans1定义的实体

由于openssl中的ASN1的结构是通过宏来定义的&#xff0c;导致我们经常找不到他的结构在哪里&#xff0c;通过阅读rfc&#xff0c;并且对照OPENSSL&#xff0c;发现OPENSSL中的结构基本是按照相关rfc中的名称&#xff0c;在openssl中进行搜索&#xff0c;就能找到具体的定义了。…

在线制作假期承诺书,电子手写签名确认,一键导出打印。

假期将至&#xff0c;为积极落实安全管理规定&#xff0c;单位通常需要下发安全承诺书进行签字确认。 易查分可以实现网上下发安全承诺书通知&#xff0c;让查询者进行签名确认&#xff0c;还可以生成PDF&#xff0c;方便打印一人一张的纸质版承诺书&#xff0c;本次就来介绍如…

docker-compose安装及常用指令学习和harbor安装使用

文章目录 1 docker-compose1.1 docker-compose安装1.2 docker-compose卸载1.3 docker-compose常用命令 2 harbor安装使用2.1 harbor安装2.2 harbor使用 1 docker-compose ​ 在实际生产环境中&#xff0c;一个应用往往由许多服务构成&#xff0c;而 docker 的最佳实践是一个容…

java碳排放数据信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web碳排放数据信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环 境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为…

1.7 OVERARCHING GOALS

我们的主要目标是教读者如何对大规模并行处理器进行编程以实现高性能&#xff0c;我们的方法不需要大量的硬件专业知识。因此&#xff0c;我们将用许多页面来开发高性能并行程序的技术。而且&#xff0c;我们相信&#xff0c;一旦你发展正确的洞察力并以正确的方式进行&#xf…

阿里云ECS云服务器客户端下载

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

计算机网络-VLAN原理与配置

之前我们学习了以太网的基础知识&#xff0c;了解了网络交换设备的发展&#xff0c;交换机的工作原理&#xff0c;广播域和冲突域。 一、概述 还简单了解了以太网的CSMA/CD通讯机制&#xff0c;以太网是建立在CSMA/CD (Carrier Sense Multiple Access/Collision Detection&…

2024 电子科技大学 《820 计算机专业基础》真题及解析(更新中...)

数据结构算法题&#xff08;15 分&#xff0c;8 7&#xff09; 1. 比较一棵二叉树的终端节点到根节点的路径长度&#xff0c;路径长度为关键字之和&#xff0c;输出路径长度最短的终端节点。 输入&#xff1a;第一行输入一个整数 n, 表示结点的个数&#xff0c;第二行输入二叉…

Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行

环境: Rustdesk1.19 问题描述: Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行 解决方案: 1.查看源代码 pub async fn start_all() {crate::hbbs_http::sync::start();let mut nat_tested = false;check_zombie()