练习01-登录注册(简单)

news2024/11/16 21:30:25

一、用户登录/注册实现

综合前面学的知识来实现简单的注册登录功能

1.准备工作

  • 注册登录页面

  • 数据库,数据表

  • mybatis

    • 坐标引入,MySQL驱动

    • 配置

    • 映射文件

  • 用户实体类

  • Servlet代码

2.页面

不想手写的可以看博主IT黄大大【带源码】

【炫酷登录界面】详解5款高级的前端登录页面及实现源码(附完整源码)_好看的前端页面-CSDN博客

也可以根据需要自己仿照着改,我是直接拿来用练习了~

3.数据库

使用IDEA,Navicat等工具创建点初始数据即可

4.mybatis配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <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:///【数据库名】?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
​
<!--        包扫描,扫描mapper-->
        <package name="com/mapper"/>
    </mappers>
</configuration>

映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="com.mapper.UserMapper">
    <sql标签>
        sql代码
        ...
    </sql标签>
</mapper>

依赖:

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>
<!--        mysql驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
  <!--单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>
  <!--Servlet-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>compile</scope>
</dependency>

5.用户实体类

没啥要说的,下一个

6.具体

映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
​
<mapper namespace="com.mapper.UserMapper">
​
    <select id="selectByUsername" resultType="string">
        select username from user where username = #{username};
    </select>
​
    <select id="selectByEmail" resultType="string">
        select email from user where email = #{email};
    </select>
​
    <select id="selectInfoBy_U_P" resultType="com.pojo.User">
        select * from user where username = #{username} and password = #{password}
    </select>
​
    <select id="selectInfoBy_E_P" resultType="com.pojo.User">
        select * from user where email = #{email} and password = #{password}
    </select>
​
    <insert id="add">
        insert into
        user
        (username,email,password)
        values
        (#{username},#{email},#{password});
    </insert>
</mapper>

封装工具类

package com.util;
​
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
​
import java.io.IOException;
import java.io.InputStream;
​
public class SqlSessionFactoryUtils {
    private static final SqlSessionFactory SQL_SESSION_FACTORY;
​
​
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
        SQL_SESSION_FACTORY = new SqlSessionFactoryBuilder().build(inputStream);
    }
​
    public static SqlSessionFactory getSqlSessionFactory(){
        return SQL_SESSION_FACTORY;
    }
}

UserMapper

package com.mapper;
​
import com.pojo.User;
import org.apache.ibatis.annotations.Param;
​
​
public interface UserMapper {
    /**
     * 注册:根据用户名查询User对象
     * @param username 用户名
     * @return User对象,如果为null,则代表不存在该用户,该用户名可用
     */
    String selectByUsername(String username);
​
    /**
     * 注册:根据邮箱查询User对象
     * @param email 用户名
     * @return User对象,如果为null,则代表不存在该用户,该邮箱可用
     */
    String selectByEmail(String email);
​
    /**
     * 登录:根据用户名和密码查询User是否存在
     * @param username 用户名
     * @param password 密码
     * @return User对象,如果为null,则代表不存在该用户
     */
    User selectInfoBy_U_P(@Param("username") String username,@Param("password") String password);
​
    /**
     * 登录:根据邮箱和密码查询User是否存在
     * @param email 邮箱
     * @param password 密码
     * @return User对象,如果为null,则代表不存在该用户
     */
    User selectInfoBy_E_P(@Param("email") String email,@Param("password") String password);
​
    /**
     * 注册:添加用户
     * @param username 用户名
     * @param email 邮箱
     * @param password 密码
     */
    void add(@Param("username") String username,@Param("email") String email,@Param("password") String password);
​
}

Servlet

login

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    User user;
    final String voucher = request.getParameter("voucher");
    final String password = request.getParameter("password");
    //查询
    //1.获取SqlSessionFactory对象
    final SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
​
    //2.获取SqlSession对象
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    //3.获取Mapper
    final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //4.调用方法
   if (voucher.contains("@")){
       user = mapper.selectInfoBy_E_P(voucher,password);
   }else{
       user = mapper.selectInfoBy_U_P(voucher,password);
   }
    //5.释放资源
    sqlSession.close();
    response.setContentType("text/html;charset=utf-8");
    final PrintWriter writer = response.getWriter();
    if (user != null){
        //成功
        writer.write("登录成功");
    }else{
        //失败
        writer.write("登录失败");
    }
​
}

register:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    final String username = request.getParameter("username");
    final String email = request.getParameter("email");
    final String password = request.getParameter("password");
    response.setContentType("text/html;charset=utf-8");
    //查询
    //1.获取SqlSessionFactory对象
    final SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
​
    //2.获取SqlSession对象
    final SqlSession sqlSession = sqlSessionFactory.openSession();
    //3.获取Mapper
    final UserMapper mapper = sqlSession.getMapper(UserMapper.class);
​
    final PrintWriter writer = response.getWriter();
    //4.调用方法
​
    if (mapper.selectByUsername(username) != null){
        System.out.println("1");
        writer.write("注册失败:用户名已存在");
    }else if (mapper.selectByEmail(email) != null){
        System.out.println("2");
        writer.write("注册失败:邮箱已使用");
    }else {
        mapper.add(username, email, password);
        sqlSession.commit();
        writer.write("注册成功");
    }
​
    //5.释放资源
    sqlSession.close();
​
​
}

核心就这点,结束

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

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

相关文章

贝叶斯优化CNN-GRU回归预测(matlab代码)

贝叶斯优化CNN-GRU回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想&#xff0c;通过不断探索各种参数组合的结果&#xff0c;根据已有信息计算期望值&#xff0c;并选择期望值最大的组合作为最佳策略&#xff0c;从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…

PostgreSQL数据优化——死元组清理

最近遇到一个奇怪的问题&#xff0c;一个百万级的PostgreSQL表&#xff0c;只有3个索引。但是每次执行insert或update语句就要几百ms以上。经过查询发现是一个狠简单的问题&#xff0c;数据库表死元组太多了&#xff0c;需要手动清理。 在 PG 中&#xff0c;update/delete 语句…

每日五道java面试题之springMVC篇(二)

目录&#xff1a; 第一题. 请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f;第二题. MVC是什么&#xff1f;MVC设计模式的好处有哪些?第三题. 注解原理是什么?第四题. Spring MVC常用的注解有哪些&#xff1f;第五题. SpingMvc中的…

【数据结构初阶 9】内排序

文章目录 &#x1f308; 1. 直接插入排序&#x1f308; 2. 希尔排序&#x1f308; 3. 简单选择排序&#x1f308; 4. 堆排序&#x1f308; 5. 冒泡排序&#x1f308; 6. 快速排序6.1 霍尔版快排6.2 挖坑版快排6.3 双指针快排6.4 非递归快排 &#x1f308; 7. 归并排序7.1 递归版…

用户管理【MySQL】

文章目录 查看用户信息创建用户修改密码删除用户授予权限收回权限 查看用户信息 在名为mysql的数据库中有一个表user维护着 MySQL 的用户信息。 其中&#xff1a; user&#xff1a; 表示该用户的用户名。host&#xff1a; 表示该用户可以从哪个主机登录&#xff0c;localhost…

了解飞行时间传感

简介:测距技术 人类和许多动物利用各种感官来测量与其他物体的距离。视觉是最常用的。在晚上,触觉可以用来感受其他物体的存在——当然触觉对于视障人

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记06_共谋(下)

1. 博弈论 1.1. 当市场竞争对手之间普遍存在着误解和不信任情绪时&#xff0c;从长远来看&#xff0c;他们一半时间是在合作&#xff0c;另一半时间则是在背叛承诺 1.2. 当一方越了解对手&#xff0c;或者说可以更好地掌握对方的战略性行为时&#xff0c;他才可能找到展开合作…

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…

理解linux进程

基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体 windows上的进程 由上图可以看出在OS中进程可以同时存在并且非常多 大概理解进程 进程内核task_s…

SpringSecurity两种验证方式及调用流程

一、HttpBasic方式 <security:http-basic/> 二、Formlogin方式 <security:form-login login-page"/userLogin" /> 三、SpringSecurity执行流程

OpenCV的常用数据类型

OpenCV涉及的常用数据类型除包含C的基本数据类型,如&#xff1a;char、uchar&#xff0c;int、unsigned int,short 、long、float、double等数据类型外, 还包含Vec&#xff0c;Point、Scalar、Size、Rect、RotatedRect、Mat等类。C中的基本数据类型不需再做说明下面重点介绍一下…

redisson解决redis服务器的主从一致性问题

redisson解决redis的主节点和从节点一致性的问题。从而解决锁被错误获取的情况。 实际开发中我们会搭建多台redis服务器&#xff0c;但这些服务器分主次&#xff0c;主服务器负责处理写的操作&#xff08;增删改&#xff09;&#xff0c;从服务器负责处理读的操作&#xff0c;…

全国保护性耕作/常规耕作农田分类数据集

基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据集。分类代码&#xff1a;0值代表非农田&#xff0c;1值表示第一…

掌握React中的useEffect:函数组件中的魔法钩子

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Django 模版基本语法

Django学习笔记 模版语法 本质&#xff1a;在HTML中写一些占位符&#xff0c;由数据对这些占位符进行替换和处理。 views.py def page2(request):#定义一些变量将变量传送给templates中的html文件name1 sallyname2 yingyinghobbys [swimming,badminton,reading]person {…

数学建模【对粒子群算法中惯性权重和学习因子的改进】

一、改进原因 这是前面 数学建模【粒子群算法】 中的一部分&#xff0c;这里提到了w存在的一些问题&#xff0c;那么本篇介绍一些方法对w和因子进行一些改进&#xff0c;提高粒子群算法的效率和准确度。 二、改进方法 1.线性递减惯性权重 惯性权重w体现的是粒子继承先前的速度…

如何获取用户请求的真实ip,并返回访问者的ip地理位置?node,vue

一、获取真实IP 方式1、前端调用免费公共接口获取 前端获取访问者的真实的外网ip,可以通过调用接口https://api.ipify.org/来获取。你也可以直接在网页上访问它来看自己的外网ip。 ipify介绍&#xff1a; ipify是一个免费的公共 API&#xff0c;用于获取设备的公共 IP 地址。…

备考2025年AMC8数学竞赛:吃透2000-2024年600道AMC8真题就够

我们继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的孩子来说&#xff0c;吃透AMC8历年真题是备考最科学、最有效的方法之一。 即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么…

conda pack环境迁移并下载安装离线包

背景 训练服务器为了安全起见&#xff0c;限制不能联网&#xff0c;无法直接创建虚拟环境及安装模型的依赖库&#xff0c;所以需要把另一台测试服务器已经部署好的虚拟环境迁移到训练服务器上&#xff0c;并在不能联网的情况下安装一些离线包。过程记录如下记录。 一、环境迁移…

指针篇章(3)-(指针之间的区别)

学习目录 ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…