JavaWeb:用户注册登录案例

冷不防 2024-03-30 13:39 248阅读 0赞

1.1 用户登录

1.1.1 需求分析

在这里插入图片描述

  1. 用户在登录页面输入用户名和密码,提交请求给LoginServlet
  2. LoginServlet中接收请求和数据[用户名和密码]
  3. LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表
  4. 将查询的结果封装到User对象中进行返回
  5. LoginServlet中判断返回的User对象是否为null
  6. 如果为nul,说明根据用户名和密码没有查询到用户,则登录失败,返回”登录失败”数据给前端
  7. 如果不为null,则说明用户存在并且密码正确,则登录成功,返回”登录成功”数据给前端

1.1.2 环境准备

  1. 复制静态页面到项目的webapp目录下,效果如下:

在这里插入图片描述

  1. 创建db1数据库,创建tb_user表,创建User实体类

2.1 将sql语句执行下:

在这里插入图片描述

2.2 创建User.java实体类

  1. package com.dcxuexi.pojo;
  2. /***
  3. * @Title User
  4. * @Description TOTD
  5. * @Auter DongChuang
  6. * @Date 2023/1/1 16:33
  7. * @Version 1.0.0
  8. */
  9. public class User {
  10. private Integer id;
  11. private String username;
  12. private String password;
  13. public Integer getId() {
  14. return id;
  15. }
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19. public String getUsername() {
  20. return username;
  21. }
  22. public void setUsername(String username) {
  23. this.username = username;
  24. }
  25. public String getPassword() {
  26. return password;
  27. }
  28. public void setPassword(String password) {
  29. this.password = password;
  30. }
  31. @Override
  32. public String toString() {
  33. return "User{" +
  34. "id=" + id +
  35. ", username='" + username + '\'' +
  36. ", password='" + password + '\'' +
  37. '}';
  38. }
  39. }
  1. 在项目的pom.xml导入MybatisMysql驱动坐标


    org.mybatis
    mybatis
    3.5.10
    1. <dependency>
    2. <groupId>mysql</groupId>
    3. <artifactId>mysql-connector-java</artifactId>
    4. <version>8.0.30</version>
    5. </dependency>
  2. 创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口

4.1 在resources目录下创建mybatis-config.xml配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--起别名-->
  7. <typeAliases>
  8. <package name="com.dcxuexi.pojo"/>
  9. </typeAliases>
  10. <environments default="development">
  11. <environment id="development">
  12. <transactionManager type="JDBC" />
  13. <dataSource type="POOLED">
  14. <property name="driver" value="com.mysql.jdbc.Driver"/>
  15. <!--
  16. useSSL:关闭SSL安全连接 性能更高
  17. useServerPrepStmts:开启预编译功能
  18. & 等同于 & ,xml配置文件中不能直接写 &符号
  19. -->
  20. <property name="url" value="jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true"/>
  21. <property name="username" value="root"/>
  22. <property name="password" value="1234"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <mappers>
  27. <!--扫描mapper-->
  28. <package name="com.dcxuexi.mapper"/>
  29. </mappers>
  30. </configuration>

4.2 在com.dcxuexi.mapper包下创建UserMapper接口

  1. package com.dcxuexi.mapper;
  2. /***
  3. * @Title UserMapper
  4. * @Description TOTD
  5. * @Auter DongChuang
  6. * @Date 2023/1/1 16:45
  7. * @Version 1.0.0
  8. */
  9. public interface UserMapper {
  10. }

4.3 resources目录下创建UserMapper.xml

注意:在resources下创建UserMapper.xml的目录时,要使用/分割

在这里插入图片描述

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.dcxuexi.mapper.UserMapper">
  6. </mapper>

至此我们所需要的环境就都已经准备好了,具体该如何实现?

1.1.3 代码实现

  1. UserMapper接口中提供一个根据用户名和密码查询用户对象的方法

    package com.dcxuexi.mapper;

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

    /*

    • @Title UserMapper
    • @Description TOTD
    • @Auter DongChuang
    • @Date 2023/1/1 16:45
    • @Version 1.0.0
      */
      public interface UserMapper {

      /**

      • 根据用户名和密码查询用户对象
      • @param username
      • @param password
      • @return
        */
        User select(@Param(“username”) String username, @Param(“password”) String password);
        }

UserMapper.xml实现根据用户名和密码查询用户对象。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.dcxuexi.mapper.UserMapper">
  6. <select id="select" resultType="com.dcxuexi.pojo.User">
  7. select * from tb_user
  8. where username = #{username}
  9. and password = #{password}
  10. </select>
  11. </mapper>

说明

@Param注解的作用:用于传递参数,是方法的参数可以与SQL中的字段名相对应。

  1. 修改login.html

    <!DOCTYPE html>





    login






    LOGIN IN


    Username:



    Password:








  2. 编写LoginServlet

    @WebServlet(“/loginServlet”)
    public class LoginServlet extends HttpServlet {

    1. @Override
    2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    3. //1. 接收用户名和密码
    4. String username = request.getParameter("username");
    5. String password = request.getParameter("password");
    6. //2. 调用MyBatis完成查询
    7. //2.1 获取SqlSessionFactory对象
    8. String resource = "mybatis-config.xml";
    9. InputStream inputStream = Resources.getResourceAsStream(resource);
    10. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    11. //2.2 获取SqlSession对象
    12. SqlSession sqlSession = sqlSessionFactory.openSession();
    13. //2.3 获取Mapper
    14. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    15. //2.4 调用方法
    16. User user = userMapper.select(username, password);
    17. //2.5 释放资源
    18. sqlSession.close();
  1. //获取字符输出流,并设置content type
  2. response.setContentType("text/html;charset=utf-8");
  3. PrintWriter writer = response.getWriter();
  4. //3. 判断user释放为null
  5. if(user != null){
  6. // 登陆成功
  7. writer.write("登陆成功");
  8. }else {
  9. // 登陆失败
  10. writer.write("登陆失败");
  11. }
  12. }
  13. @Override
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. this.doGet(request, response);
  16. }
  17. }
  1. 启动服务器测试在这里插入图片描述

4.1 如果用户名和密码输入错误,则

在这里插入图片描述

4.2 如果用户名和密码输入正确,则

在这里插入图片描述

至此用户的登录功能就已经完成了。

1.2 用户注册

1.2.1 需求分析

在这里插入图片描述

  1. 用户在注册页面输入用户名和密码,提交请求给RegisterServlet
  2. RegisterServlet中接收请求和数据[用户名和密码]
  3. RegisterServlet中通过Mybatis实现调用UserMapper来根据用户名查询数据库表
  4. 将查询的结果封装到User对象中进行返回
  5. RegisterServlet中判断返回的User对象是否为null
  6. 如果为nul,说明根据用户名可用,则调用UserMapper来实现添加用户
  7. 如果不为null,则说明用户不可以,返回”用户名已存在”数据给前端

1.2.2 代码编写

  1. 编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

    1. package com.dcxuexi.mapper;
    2. import com.dcxuexi.pojo.User;
    3. import org.apache.ibatis.annotations.Param;
    4. /***
    5. * @Title UserMapper
    6. * @Description TOTD
    7. * @Auter DongChuang
    8. * @Date 2023/1/1 16:45
    9. * @Version 1.0.0
    10. */
    11. public interface UserMapper {
    12. /**
    13. * 根据用户名和密码查询用户对象
    14. * @param username
    15. * @param password
    16. * @return
    17. */
    18. User select(@Param("username") String username, @Param("password") String password);
    19. /**
    20. * 根据用户名查询用户对象
    21. * @param username
    22. * @return
    23. */
    24. User selectByUsername(String username);
    25. /**
    26. * 添加用户
    27. * @param user
    28. */
    29. void add(User user);
    30. }

    UserMapper.xml实现方法

    <?xml version=”1.0” encoding=”UTF-8” ?>
    <!DOCTYPE mapper

    1. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">





    insert into tb_user
    values(null,#{username},#{password})

  2. 修改register.html

    <!DOCTYPE html>




    欢迎注册






    欢迎注册


    已有帐号? 登录
















    用户名




    密码















  3. 创建RegisterServlet

    package com.dcxuexi.web;

    import com.dcxuexi.mapper.UserMapper;
    import com.dcxuexi.pojo.User;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;

    /*

    • @Title RegisterServlet
    • @Description TOTD
    • @Auter DongChuang
    • @Date 2023/1/1 17:47
    • @Version 1.0.0
      */
      @WebServlet(“/registerServlet”)
      public class RegisterServlet extends HttpServlet {

      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      1. //1. 接收用户数据
      2. String username = req.getParameter("username");
      3. String password = req.getParameter("password");
      4. //封装用户对象
      5. User user = new User();
      6. user.setUsername(username);
      7. user.setPassword(password);
      8. //2. 调用mapper 根据用户名查询用户对象
      9. //2.1 获取SqlSessionFactory对象
      10. String resource = "mybatis-config.xml";
      11. InputStream inputStream = Resources.getResourceAsStream(resource);
      12. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      13. //2.2 获取SqlSession对象
      14. SqlSession sqlSession = sqlSessionFactory.openSession();
      15. //2.3 获取Mapper
      16. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      17. //2.4 调用方法
      18. User user2 = userMapper.selectByUsername(username);
      19. resp.setContentType("text/html;charset=utf-8");
      20. //3. 判断用户对象释放为null
      21. if (user2 == null){
      22. // 用户名不存在,添加用户
      23. userMapper.add(user);
      24. // 提交事务
      25. sqlSession.commit();
      26. // 释放资源
      27. sqlSession.close();
      28. resp.getWriter().write("用户注册成功");
      29. }else {
      30. // 用户名存在,给出提示信息
      31. resp.getWriter().write("用户名已存在");
      32. }

      }

      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      1. this.doGet(req, resp);

      }
      }

  4. 启动服务器进行测试在这里插入图片描述

4.1 如果测试成功,则在数据库中就能查看到新注册的数据在这里插入图片描述

4.2 如果用户已经存在,则在页面上展示 用户名已存在 的提示信息在这里插入图片描述

1.3 SqlSessionFactory工具类抽取

上面两个功能已经实现,但是在写Servlet的时候,因为需要使用Mybatis来完成数据库的操作,所以对于Mybatis的基础操作就出现了些重复代码,如下

  1. String resource = "mybatis-config.xml";
  2. InputStream inputStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactory sqlSessionFactory = new
  4. SqlSessionFactoryBuilder().build(inputStream);

有了这些重复代码就会造成一些问题:

  • 重复代码不利于后期的维护
  • SqlSessionFactory工厂类进行重复创建

    • 就相当于每次买手机都需要重新创建一个手机生产工厂来给你制造一个手机一样,资源消耗非常大但性能却非常低。所以这么做是不允许的。

那如何来优化呢?

  • 代码重复可以抽取工具类
  • 对指定代码只需要执行一次可以使用静态代码块

有了这两个方向后,代码具体该如何编写?

  1. package com.dcxuexi.util;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. /***
  8. * @Title SqlSessionFactoryUtils
  9. * @Description TOTD
  10. * @Auter DongChuang
  11. * @Date 2023/1/1 18:05
  12. * @Version 1.0.0
  13. */
  14. public class SqlSessionFactoryUtils {
  15. private static SqlSessionFactory sqlSessionFactory;
  16. static {
  17. //静态代码块会随着类的加载而自动执行,且只执行一次
  18. try {
  19. String resource = "mybatis-config.xml";
  20. InputStream inputStream = Resources.getResourceAsStream(resource);
  21. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. public static SqlSessionFactory getSqlSessionFactory(){
  27. return sqlSessionFactory;
  28. }
  29. }

工具类抽取以后,以后在对MybatisSqlSession进行操作的时候,就可以直接使用

  1. SqlSessionFactory sqlSessionFactory =SqlSessionFactoryUtils.getSqlSessionFactory();

这样就可以很好的解决上面所说的代码重复和重复创建工厂导致性能低的问题了。

LoginServlet类优化如下:

  1. package com.dcxuexi.web;
  2. import com.dcxuexi.mapper.UserMapper;
  3. import com.dcxuexi.pojo.User;
  4. import com.dcxuexi.util.SqlSessionFactoryUtils;
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. import java.io.PrintWriter;
  17. /***
  18. * @Title LoginServlet
  19. * @Description TOTD
  20. * @Auter DongChuang
  21. * @Date 2023/1/1 17:02
  22. * @Version 1.0.0
  23. */
  24. @WebServlet("/loginServlet")
  25. public class LoginServlet extends HttpServlet {
  26. @Override
  27. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  28. //1. 接收用户名和密码
  29. String username = req.getParameter("username");
  30. String password = req.getParameter("password");
  31. System.out.println("username = " + username);
  32. //2. 调用MyBatis完成查询
  33. //2.1 获取SqlSessionFactory对象
  34. //String resource = "mybatis-config.xml";
  35. //InputStream inputStream = Resources.getResourceAsStream(resource);
  36. //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  37. SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
  38. //2.2 获取SqlSession对象
  39. SqlSession sqlSession = sqlSessionFactory.openSession();
  40. //2.3 获取Mapper
  41. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  42. //2.4 调用方法
  43. User user = userMapper.select(username, password);
  44. //2.5 释放资源
  45. sqlSession.close();
  46. //获取字符输出流,并设置content type
  47. resp.setContentType("text/html;charset=utf-8");
  48. PrintWriter writer = resp.getWriter();
  49. if (user!=null){
  50. // 登陆成功
  51. writer.write(username+"登陆成功");
  52. }else {
  53. // 登陆失败
  54. writer.write("登陆失败");
  55. }
  56. }
  57. @Override
  58. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  59. this.doGet(req, resp);
  60. }
  61. }

RegisterServlet类优化如下:

  1. package com.dcxuexi.web;
  2. import com.dcxuexi.mapper.UserMapper;
  3. import com.dcxuexi.pojo.User;
  4. import com.dcxuexi.util.SqlSessionFactoryUtils;
  5. import org.apache.ibatis.io.Resources;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. /***
  17. * @Title RegisterServlet
  18. * @Description TOTD
  19. * @Auter DongChuang
  20. * @Date 2023/1/1 17:47
  21. * @Version 1.0.0
  22. */
  23. @WebServlet("/registerServlet")
  24. public class RegisterServlet extends HttpServlet {
  25. @Override
  26. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  27. //1. 接收用户数据
  28. String username = req.getParameter("username");
  29. String password = req.getParameter("password");
  30. //封装用户对象
  31. User user = new User();
  32. user.setUsername(username);
  33. user.setPassword(password);
  34. //2. 调用mapper 根据用户名查询用户对象
  35. //2.1 获取SqlSessionFactory对象
  36. //String resource = "mybatis-config.xml";
  37. //InputStream inputStream = Resources.getResourceAsStream(resource);
  38. //SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  39. SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
  40. //2.2 获取SqlSession对象
  41. SqlSession sqlSession = sqlSessionFactory.openSession();
  42. //2.3 获取Mapper
  43. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  44. //2.4 调用方法
  45. User user2 = userMapper.selectByUsername(username);
  46. resp.setContentType("text/html;charset=utf-8");
  47. //3. 判断用户对象释放为null
  48. if (user2 == null){
  49. // 用户名不存在,添加用户
  50. userMapper.add(user);
  51. // 提交事务
  52. sqlSession.commit();
  53. // 释放资源
  54. sqlSession.close();
  55. resp.getWriter().write("用户注册成功");
  56. }else {
  57. // 用户名存在,给出提示信息
  58. resp.getWriter().write("用户名已存在");
  59. }
  60. }
  61. @Override
  62. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  63. this.doGet(req, resp);
  64. }
  65. }

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 【Java案例用户登录注册

    案例介绍: 编写程序实现简单的用户登录注册功能。程序包含以下4个功能: (1)登录功能,用户输入正确的账号密码登录成功; (2)注册功能,输入用户名和密码进行注册; (

    相关 登录注册案例

    在集合的基础上,我们可以做一个登录注册案例 登陆注册案例分析: 利用面向对象的思想,我们必须先找到能完成某个功能的类,接着调用里面的方法完成它 登陆注册案例中的类:

    相关 用户注册登录流程

    用户注册: 1.用户填写参数,移出鼠标效验手机号,登录账号,邮箱, 2.判断用户id是否是超级管理员用户,超级管理员是不允许修改的 3.随机生成盐,用户赋值盐

    相关 移动端用户登录&注册案例

    用的是TypeScript语言,主要是展示相关的思想逻辑,而不是语法。会说明注册和登录页面进行局部切换的逻辑、用账号密码登录的相关逻辑、用手机号和验证码登录的相关逻辑、获取验证