javaWeb登录和注册案例

用户登录及注册案例

一、用户登录

1. 准备阶段

1.1涉及的知识点

  • MyBatis作为框架,简化JDBC来操作数据库
  • Maven作为一个管理和构建java项目的工具
  • MySQL作为数据库来存放用户信息
  • Servlet作为一个接口由Tomcat运行,处理浏览器的请求和响应

1.2流程说明

  1. 用户填写用户名密码,提交到LoginServlet
  2. 在LoginServlet中使用MyBatis查询数据库,验证用户名密码是否正确
  3. 如果正确,响应“登录成功”,如果错误,响应“登录失败”

在这里插入图片描述

2. 具体流程

2.1环境的搭建

2.1.1具体内容
  • 创建一个Maven项目
  • 将下载的静态页面复制到项目中的webapp目录(web项目核心目录)下
  • 创建数据库,创建一个表来存放用户数据
  • 创建User实体类
  • 导入MyBatis和MySQL驱动坐标
  • 创建mybatis-config.xml核心配置文件
  • 创建UserMapper.xml映射文件和UserMpper接口
2.1.2创建Maven项目

1.新建模块

2.选择Maven

3.选择“从原型创建”并选择如下原型

在这里插入图片描述

2.1.3静态页面文件

将下载到的静态页面的文件导入web项目核心文件目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6oAMw1D-1686128244906)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606163346904.png)]

2.1.4创建数据库
-- 创建一个表
CREATE TABLE tb_user(
	id INT PRIMARY KEY auto_increament,
	username VARCHAR(20) UNIQUE,
	password VARCHAR(30)
);

-- 添加数据
INSERT INTO tb_user(username,password) VALUES('mr.zhao','3220021'),('zhengwei','3122002298'),('zhaoying','123456');

SELECT * FROM tb_user;

2.1.5创建User实体类

在源代码java文件目录下创建一个com.zwcode.pojo的包,然后在该包中创建User实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIdvzsNo-1686128244906)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606164749036.png)]

package com.zwcode.pojo;

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


    public Integer getId() {
        return id;
    }

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

2.1.6导入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>5.1.46</version>
    </dependency>

  </dependencies>
  • 记得导入后要点击刷新
2.1.7mybatis-config.xml核心配置文件
  • 核心配置文件的代码可以从官网拷贝;mybatis官网
  • 核心文件主要是用于配置数据库连接环境信息的
  • 如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<?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.zwcode.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:///accountinfo?useSSL=false&amp;useServerPrepStmts=true"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--扫描mapper-->
        <package name="com.zwcode.mapper"/>
    </mappers>
</configuration>
2.1.8UserMapper.xml映射文件和UserMpper接口
  • 映射文件中定义了sql语句,对sql语句进行统一的管理

  • 接口中定义了方法,可以通过mybatis创建的代理对象来调用方法去执行对应的sql语句

  • 执行sql语句的具体流程:

    1.sqlSession对象通过getMapper方法获取Mapper接口的代理对象

    2.代理对象调用Mapper接口中的方法

    3.根据Mapper接口的全类名来查找映射文件

    4.根据接口中方法名来找到映射文件中的sql语句,并执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iw5sdeqJ-1686128244907)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606173417886.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7s9hbeD-1686128244907)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606173427840.png)]

//UserMapper接口
package com.zwcode.mapper;

import com.zwcode.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("select * from tb_user where username= #{username} and password=#{password}")
    User select(@Param("username") String username, @Param("password") String password);
}
<!-- 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.zwcode.mapper.UserMapper">

</mapper>

3. 登录逻辑代码

3.1修改login.html中的action

  • 当用户在页面里按下登录按钮,用户的数据就会被发送到action对应的文件中
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="css/login.css" rel="stylesheet">
</head>

<body>
<div id="loginDiv">
    <form action="/loginDemo1/loginServlet" method="post" id="form">
        <h1 id="loginMsg">LOGIN IN</h1>
        <p>Username:<input id="username" name="username" type="text"></p>

        <p>Password:<input id="password" name="password" type="password"></p>

        <div id="subDiv">
            <input type="submit" class="button" value="login up">
            <input type="reset" class="button" value="reset">&nbsp;&nbsp;&nbsp;
            <a href="register.html">没有账号?点击注册</a>
        </div>
    </form>
</div>

</body>
</html>

3.2loginServlet类

3.2.1创建
  1. 选择新建一个servelt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aYPuYJPK-1686128244907)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606181814679.png)]

  1. 修改WebServlet注解,配置Servlet访问路径
@WebServlet("/loginServlet")
3.2.2接收用户信息
//1.接受用户名和密码
    String username = request.getParameter("username");
    String password = request.getParameter("password");
3.2.3调用MyBatis查询
//2.1 获取SqLSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2.2获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //2.3获取Mapper
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    //2.4调用方法
    User user = userMapper.select(username,password);
    //2.5释放资源
    sqlSession.close();
3.2.4判断账户密码正确性
//获取字符输出流,并设置content type
    response.setContentType("text/html;charset=utf-8");
    PrintWriter writer = response.getWriter();
    //判断逻辑
    if(user!=null){
        //登录成功
        writer.write("登录成功!");
    }else{
        //登录失败
        writer.write("登录失败!");
    }
3.2.5完整代码
package com.zwcode.web;

import com.zwcode.pojo.User;
import com.zwcode.mapper.UserMapper;
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;
import java.io.PrintWriter;

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.接受用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");


        //2.调用MyBatis完成查询
        //2.1 获取SqLSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.2获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4调用方法
        User user = userMapper.select(username,password);
        //2.5释放资源
        sqlSession.close();


        //3. 判断user释放为null
        //获取字符输出流,并设置content type
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //判断逻辑
        if(user!=null){
            //登录成功
            writer.write("登录成功!");
        }else{
            //登录失败
            writer.write("登录失败!");
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

4.运行

4.1完整文件目录

4.2运行截图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mU8k0zNE-1686128244908)(C:\Users\86137\AppData\Roaming\Typora\typora-user-images\image-20230606183103301.png)]

二、用户注册

1.与用户登录代码不同点

  1. 用户注册要用到另外一个html文件,其中的action要改为注册的servlet目录

  2. 在与loginServlet同一个包下创建一个新的Servlet文件,取名为registerServlet

  3. UserMapper接口中要新定义一系列方法

  4. 在用mybatis查询时用mapper对象调用userMapper接口中方法不同

  5. 最后的判断逻辑也不同

2.具体不同的代码和操作

2.1 register.html中action的更改

action="/loginDemo1/registerServlet"

2.2创建新的servlet文件

2.3 UserMapper接口中要新定义一系列方法

//根据用户名查询用户
    @Select("select * from tb_user where username= #{username}")
    User selectByUsername(String username);

    //添加用户
    @Insert("insert into tb_user values(null,#{username},#{password})")
    void add(User user);

2.4 registerServlet中调用mybatis查询

//2.调用mybatis查询
    //2.1获取SqlSessionFactory对象
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2.2获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //2.3获取Mapper
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    //2.4调用方法
    User u=userMapper.selectByUsername(username);

2.5 判断逻辑

//3.判断用户对象是否为null
    if(u==null){
        //添加用户
        userMapper.add(user);
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("用户注册成功!");
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }else{
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("用户已存在!");
    }

2.6 registerServlet类完整代码

package com.zwcode.web;

import com.zwcode.mapper.UserMapper;
import com.zwcode.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.annotation.Resource;
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;
import java.io.StringReader;

@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.接收用户信息
        //1.1获取用户名和密码
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        //1.2创建一个User对象
        User user=new User();
        user.setUsername(username);
        user.setPassword(password);

        //2.调用mybatis查询
        //2.1获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2.2获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //2.3获取Mapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //2.4调用方法
        User u=userMapper.selectByUsername(username);

        //3.判断用户对象是否为null
        if(u==null){
            //添加用户
            userMapper.add(user);
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("用户注册成功!");
            //提交事务
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }else{
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("用户已存在!");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}


  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 JavaWeb 分层实现注册功能的案例: 首先,我们需要创建一个 User 实体类,保存用户信息: ```java public class User { private int id; private String username; private String password; private String email; // 省略 getter 和 setter 方法 } ``` 接着,我们创建一个 UserDao 接口,定义增删改查等操作: ```java public interface UserDao { // 添加用户 void addUser(User user) throws SQLException; // 根据用户名查找用户 User findUserByUsername(String username) throws SQLException; // 根据邮箱查找用户 User findUserByEmail(String email) throws SQLException; } ``` 然后,我们创建一个 UserDaoImpl 类,实现 UserDao 接口,实现具体的操作: ```java public class UserDaoImpl implements UserDao { // 获取数据库连接 private Connection getConnection() throws SQLException { // ... } @Override public void addUser(User user) throws SQLException { String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getEmail()); pstmt.executeUpdate(); } } @Override public User findUserByUsername(String username) throws SQLException { String sql = "SELECT * FROM users WHERE username = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); user.setEmail(rs.getString("email")); return user; } else { return null; } } } } @Override public User findUserByEmail(String email) throws SQLException { // 和 findUserByUsername 类似 } } ``` 最后,我们创建一个 UserService 类,调用 UserDao 的方法完成注册功能: ```java public class UserService { private UserDao userDao = new UserDaoImpl(); public void register(User user) throws SQLException { // 判断用户名是否已存在 User u = userDao.findUserByUsername(user.getUsername()); if (u != null) { throw new IllegalArgumentException("用户名已存在"); } // 判断邮箱是否已存在 u = userDao.findUserByEmail(user.getEmail()); if (u != null) { throw new IllegalArgumentException("邮箱已被注册"); } // 添加用户 userDao.addUser(user); } } ``` 这样,我们就完成了一个简单的 JavaWeb 分层实现注册功能的案例。需要注意的是,这里的数据库连接等细节并没有完全实现,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值