登录与注册功能(简单版)(1)登录

目录

1、需求

2、怎样实现

3、步骤

1)创建login.html 

2)创建user数据表

3)IDEA连接数据库

4)pom.xml中添加MyBatis和MySQL驱动坐标

5)创建User实体类

6)创建UserMapper.xml映射文件

7)创建UserMapper接口

8)创建MyBatis的配置文件

9)创建LoginServlet、创建SuccessServlet        

10)整体目录结构

11)启动Tomcat


1、需求

  • 创建一个简单的HTML页面,输入用户名、密码,点击登录,使用POST方法。
  • 创建LoginServlet,处理请求与响应。
  • 如果登录成功,跳转到SuccessServlet,展示:用户名,欢迎回来!
  • 登录失败,直接展示:登录失败

2、怎样实现

1. 用户在登录页面输入用户名和密码,提交请求给LoginServlet
2. 在LoginServlet中接收请求和数据(用户名和密码)
3. 在LoginServlet中,使用Mybatis调用UserMapper,根据用户名和密码查询数据库表
4. 将查询的结果封装到User对象中进行返回
5. 在LoginServlet中判断返回的User对象是否为null
6. 如果为null,说明根据用户名和密码没有查询到用户,则登录失败,返回"登录失败"数据给前端
7. 如果不为null,则说明用户存在并且密码正确,则登录成功,跳转到SuccessServlet,使用域对象的getAttribute方法获取用户名


3、步骤

1)创建login.html 

放到:webapp文件夹中,WEB-INF外

需要一个 HTML 表单让用户输入用户名和密码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="login" method="post">
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username" required><br>

        <label for="password">密码:</label>
        <input type="text" id="password" name="password" required><br>

        <input type="submit" value="登录">
    </form>
</body>
</html>

在这个表单中,action 属性指定了表单数据提交到的 URL(“login"),method 属性指定了 HTTP 方法(POST)。

访问:

2)创建user数据表

-- 创建用户表
CREATE TABLE user(
	user_id int primary key auto_increment,
	username varchar(20) unique,
	password varchar(32)
);

-- 添加数据
INSERT INTO user(username,password) values('Tom','123'),('Jerry','234');

SELECT * FROM user;

3)IDEA连接数据库

打开IDEA右侧栏Database选项:添加数据源,选择来自mysql,输入mysql的用户名、密码、数据库的名字,测试连接,显示绿色的对号,表示可以连接,点击apply、OK。

4)pom.xml中添加MyBatis和MySQL驱动坐标

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

5)创建User实体类

查询的结果需要封装到User对象,所以需要一个User类,放到pojo文件夹里。

package com.example.pojo;

public class User{
    private Long id;
    private String username;
    private String password;

    public User() {
    }

    public User(Long id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long 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 + '\'' +
                '}';
    }
}

6)创建UserMapper.xml映射文件

在resources下创建多层目录,注意要使用/分割(不能用.):resources下新建文件夹com/example/mapper,再创建UserMapper.xml文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="UserResult" type="com.example.pojo.User">
            <id property="id" column="user_id"/>
            <result property="username" column="username"/>
            <result property="password" column="password"/>
    </resultMap>

    <select id="selectUser" resultMap="UserResult">
            select *
            from user
            where username=#{username} and password=#{password};
    </select>
</mapper>

<Mapper>元素的namespace属性应该与对应的映射器接口的全限定名相同。

<ResultMap>元素用于定义如何从数据库结果集映射到 Java 对象。这里定义了一个名为UserResult的结果映射,它将 user_id列映射到User 对象的id属性,username 列映射到 username属性,以及password列映射到password属性。

<Select>元素用于定义 SQL 查询语句。id 属性应该与映射器接口中的方法名相同,resultMap属性指定了用于映射结果集的结果映射的 ID。SQL 语句中的#{id}是一个占位符,它将被传递给 selectUser方法的参数值替换。

7)创建UserMapper接口

package com.example.mapper;

import com.example.pojo.User;
import org.apache.ibatis.annotations.Param;

public interface UserMapper{
    User selectUser(@Param("username")String username, @Param("password")String password);

}

传参:如果方法接受多个参数,需要使用@Param注解来明确指定每个参数的名称,这样在XML映射文件中就可以通过指定的名称来引用这些参数。

8)创建MyBatis的配置文件

MyBatis再一个project中只需要一个配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--起别名-->
    <typeAliases>
        <package name="com.example.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///web?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="111111"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.example.mapper"/>
    </mappers>
</configuration>

实体类所在位置、数据库名称、用户名、密码改成自己的。

9)创建LoginServlet、创建SuccessServlet        

接收参数、处理请求、给予响应,使用注解配置。

传来的是Post请求,重写doPost方法:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

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

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //使用MyBatis查询数据表,如果用传来的参数能查到User对象,则成功登录
        //MyBatis的使用步骤
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//反射:            
                                     //MyBatis使用反射机制动态地生成该接口的代理实现。
        User user = userMapper.selectUser(username, password);
        sqlSession.close();

        //进行响应
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer=response.getWriter();
        if (user!=null){
            request.setAttribute("username",username);
        request.getRequestDispatcher("/SuccessServlet").forward(request,response);
        }else {
            writer.write("登录失败");
        }
    }

}

在这个 Servlet 类中,使用 @WebServlet("/login") 注解来指定该 Servlet 的访问 URL。这意味着当用户访问 /login URL 时,Servlet 容器会自动实例化并调用这个 Servlet。 

@WebServlet("/SuccessServlet")
public class SuccessServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = (String) request.getAttribute("username");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(username+",欢迎回来!");
    }

}

原始请求是POST请求,所以目标Servlet中重写doPost方法。

10)整体目录结构

11)启动Tomcat

访问

转发:浏览器的地址栏不变

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

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

相关文章

实体好做,还是电商好做?最适合新手的是哪种?

我是电商珠珠 时间过得很快&#xff0c;距离2025年转眼间也就只剩下了9个月&#xff0c;部分人想要充分利用自己的时间去做一些可以赚钱的项目。 现在创业要么做实体店&#xff0c;要么做自媒体&#xff0c;要么就做电商。按照现在的经济发展趋势&#xff0c;开实体店甚至不能…

Tiktok视频播放为何为0?4大原因小白需了解

原因一、养号失败&#xff0c;被判为营销号 注册了tiktok账号以后&#xff0c;是需要一段时间进行养号&#xff0c;培养账号权重的&#xff01;而有些小伙伴未经养号&#xff0c;直接注册上手开始发视频&#xff01;这样很容易导致视频没有播放&#xff01;因为这样连续的一系…

比派电器T6白色系高速吹风机,高品质保证下,追求极致性价比

广东比派电器科技有限公司于2020年成立于东莞市松山湖高新技术企业园区融易大厦&#xff0c;公司聚焦于小家电的研发&#xff0c;生产&#xff0c;销售。专注在小家电的PCBA研发&#xff0c;产品设计&#xff0c;成品生产。提供小家电产品一站式解决方案&#xff0c;致力于成为…

铁威马TOS 6即将登场,全新设计更多功能抢先看!

错过了TOS 6内测的铁粉们注意啦&#xff01; 很高兴与大家宣布 铁威马TOS 6 Beta 将在本月与大家见面 时隔一年多 TOS 6历经严格测试与精细优化 焕然一新的用户界面 由内而外展现全新风采 今天小马就来给大家小剧透 TOS 6新功能抢先看 TOS 6是铁威马迄今为止“最友好最美…

深度强化学习(三)(DQN)

深度强化学习&#xff08;三&#xff09;DQN与Q学习 一.DQN 通过神经网络来近似最优动作价值函数 Q ∗ ( a t , s t ) Q_*(a_t,s_t) Q∗​(at​,st​),在实践中, 近似学习“先知” Q ⋆ Q_{\star} Q⋆​ 最有效的办法是深度 Q \mathrm{Q} Q网络 (deep Q network, 缩写 DQN)…

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…

深度学习模型部署(六)TensorRT工作流and入门demo

TensorRT工作流程 官方给出的步骤&#xff1a; 总结下来可以分为两大部分&#xff1a; 模型生成&#xff1a;将onnx经过一系列优化&#xff0c;生成tensorrt的engine模型 选择batchsize&#xff0c;选择精度precision&#xff0c;模型转换 模型推理&#xff1a;使用python或…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean&#xff0c;Monster.java2.创建一个config文件夹&#xff08;名字任意&#xff09;&#xff0c;用于存放配置Bean的类&#xff08;相当于配置文件&#xff09;3.BeanConfig.java4.测试使用 MainApp.java2.…

Spring中使用自带@Autowired注解实现策略模式

场景 SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else&#xff1a; SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_springboot编写策略工厂-CSDN博客 设计模式…

NASA和IBM联合开发的 2022 年多时相土地分类数据集

简介 美国国家航空航天局&#xff08;NASA&#xff09;和国际商业机器公司&#xff08;IBM&#xff09;合作&#xff0c;利用大规模卫星和遥感数据&#xff0c;包括大地遥感卫星和哨兵-2 号&#xff08;HLS&#xff09;数据&#xff0c;创建了地球观测人工智能基础模型。通过奉…

【Windows】解决Windows磁盘有锁和感叹号方法

文章目录 1、概述2、效果3、解决方案3.1、先看自己电脑环境3.2、查看BitLocker情况3.3、查看设备加密 4、其他方案5、BitLocker5.1、BitLocker 是什么5.2、BitLocker 作用5.3、BitLocker 和 TPM 1、概述 目前在整理自己新电脑的软件&#xff0c;无意间电脑磁盘有锁和感叹号的标…

Dynamic Wallpaper v17.4 mac版 动态视频壁纸 兼容 M1/M2

Dynamic Wallpaper Engine 是一款适用于 Mac 电脑的视频动态壁纸&#xff0c; 告别单调的静态壁纸&#xff0c;拥抱活泼的动态壁纸。内置在线视频素材库&#xff0c;一键下载应用&#xff0c;也可导入本地视频&#xff0c;同时可以将视频设置为您的电脑屏保。 应用介绍 Dynam…

多线程案例及常用模式

一.单例模式——经典的设计模式 什么是单例模式&#xff1a;就是规定一个类只能创建一个对象&#xff0c;也就是保证某个类在程序中只存在唯一一个实例&#xff0c;而不会创建出多个实例 根据对象创建的时机不同&#xff0c;可以分为饿汉模式和懒汉模式 1.饿汉模式 在类加载…

2024.3.12 C++

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height) 定义公有成员函数初始化函数:void init(int w, int h)更改宽度的函数:set w(int w)更改高度的函数:set h(int h)输出该矩形的周长和面积函数:void show() #include <iostream>using nam…

动手学深度学习-注意力机制Transformer

注意力机制 1. 注意力提示 1.1. 生物学中的注意力提示 **自主性提示&#xff08;随意线索&#xff09;&#xff1a;收到认知和意识的控制&#xff0c;有主观意愿的推动。**如下图&#xff0c;所有纸制品都是黑白印刷的&#xff0c;但咖啡杯是红色的。 换句话说&#xff0c;这…

【图像超分】论文复现:Pytorch实现FSRCNN,包含详细实验流程和与SRCNN的比较

文章目录 前言1. FSRCNN网络结构2. 训练FSRCNN3. FSRCNN模型测试4. 训练好的FSRCNN模型超分自己的图像 前言 论文地址&#xff1a;Accelerating the Super-Resolution Convolutional Neural Network 论文精读&#xff1a; 请配合上述论文精读文章使用&#xff0c;效果更佳&…

Python接口自动化核心模块 - 数据库操作和日志

一、Python连接数据库常见模块 MysqlDBpython2时代最火的驱动库。基于C开发&#xff0c;对windows平台不友好。现在已经进入python3时代&#xff0c;基本不再使用MysqlClientmysqldb的衍生版本&#xff0c;完全兼容python3.它是重量级Web开发框架Django中ORM功能依赖工具Pymys…

01_lombok review

文章目录 Lombok父子工程ide中的Maven基础配置前置知识储备 Lombok 怎么引入Lombok依赖&#xff1a; step1&#xff1a;引入Lombok依赖 eg&#xff1a; <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

9:00面试,9:06就出来了,问的实在是太变态了

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

GaussianEditor:根据用户指令编辑三维 GS 场景

Paper: Fang J, Wang J, Zhang X, et al. Gaussianeditor: Editing 3d gaussians delicately with text instructions[J]. arXiv preprint arXiv:2311.16037, 2023. Introduction: https://gaussianeditor.github.io/ Code: Unreleased 本篇的 GaussianEditor 和 NTU 的 Gaussi…