JavaWeb用户登录


参考: 来自b站

0.总体思路和完整代码

1.数据库创建对应的用户表
2.前台页面-登录页面
3.后台实现-登录功能

代码:https://github.com/wangwyForNewTime/JavaWeb-login-JSP-MySQL/tree/main

1.数据库建立

建立这样一个简单的数据库就好啦
在这里插入图片描述

2.前台页面

其实up主实例得很好,简单明了。
不过毕竟我本科的时候是靠前端技术才能抱到后端大佬的大腿的,所以这里给一个我曾经的包含表单验证的代码:登录注册前端页面

然后我简单使用的是:

<%--
  Created by IntelliJ IDEA.
  User: 大喵喵
  Date: 2023/2/24
  Time: 23:28

  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>index</title>
  <link rel="stylesheet" href="css/bootstrap.min.css">
  <link rel="stylesheet" href="css/index.css">

</head>
<body>

<div class="mainbac">
  <h1>MayBe Something System </h1>
  <!-- <div class="lii">Please Choose Your Operation</div> -->
  <div class="duzi" >
    <ul class="nav nav-tabs nav-justified">
      <li style="border-top: 3px solid lightgray;border-right: 3px solid lightgray;border-bottom: none;font-size: 17px;"><a href="#" style="border-bottom: none;">&nbsp;&nbsp;&nbsp;&nbsp;</a></li>
    </ul>


      <div class="one" id="one">


        <form action="index" method="post" id="loginForm" class="bs-example bs-example-form">
          <div class="input-group" style="margin-top: 20px;">
            <span class="input-group-addon">&nbsp; ID&nbsp;</span>
            <input type="text" class="form-control" name="uname" value="${messageModel.object.userName}">
          </div>
          <br>
          <div class="input-group" style="margin-top: 20px;">
           <span class="input-group-addon" value="${messageModel.object.userPwd}">密码</span>
            <input type="password" class="form-control" name="upwd">
         </div>

             <span id="msg" >${
    
    messageModel.msg}</span>
         <div class="input-group" style="margin-top: 50px;">
             <button type="submit" class="btn btn-primary" style="width: 240px;position: relative;left: 50%;margin-left: -20px;" id="loginBtn">&nbsp;&nbsp;&nbsp;&nbsp;</button>
         </div>
       </form>

      </div>
  </div>


</div>
</body>
</html>

3.集成mybatis

mybatis是干啥的我也不清楚,反正java代码要链接数据库就得用它。

3.1 准备好jar包

①建一个文件夹用来放jar包
在这里插入图片描述
在这里插入图片描述

②准备所需jar包
在这里插入图片描述

准备mybatis.jar,参考:[1]
github官网:官方下载
在这里插入图片描述
准备mysql-connector-j.jar,参考:[2]
官网:官方下载
在这里插入图片描述
然后把刚刚图片显示的俩文件放到刚刚建的lib文件夹下就行。
③ 添加依赖
在这里插入图片描述
选module
在这里插入图片描述

扫描二维码关注公众号,回复: 17361456 查看本文章

在这里插入图片描述
在这里插入图片描述

3.2 准备层

虽然分层思想核心我并不明白,但总归可以依葫芦画瓢

分层思想(解耦:高内聚低耦合)
1.controller层 接收请求(调用service层,返回结果) 响应结果
2.service层 业务逻辑判断
3.mapper 接口类
4.mapper .xml mybatis 与数据库的相关操作
5.entity (po、model ) JavaBean实体
6.util 工具类(通用的方法/类)
7.test 测试类/方法

在这里插入图片描述
最后建立这么多
在这里插入图片描述

3.3 entity 实体类

创建实体类,取名为User
在这里插入图片描述
idea使用技巧alt+insert快速写getset函数

package com.xxxx.entity;

public class User {
    
    
    private Integer userId;
    private String userName;
    private String userPwd;

    public Integer getUserId() {
    
    
        return userId;
    }

    public void setUserId(Integer userId) {
    
    
        this.userId = userId;
    }

    public String getUserName() {
    
    
        return userName;
    }

    public void setUserName(String userName) {
    
    
        this.userName = userName;
    }

    public String getUserPwd() {
    
    
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
    
    
        this.userPwd = userPwd;
    }
}

3.4 mapper

参考:[1]
在这里插入图片描述
UserMapper.xml

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

<!-- namespace就是接口的包名加类名 -->
<mapper namespace="com.xxxx.mapper.UserMapper">
    <select id="queryUserByName" resultType="com.xxxx.entity.User" parameterType="String">
        <!-- 写SQL语句 -->
        select * from pa where username = #{
    
    username}
    </select>
</mapper>

UserMapper.java

package com.xxxx.mapper;
import com.xxxx.entity.User;
/*
 * 用户接口类
 * */
public interface UserMapper {
    
    
   public User queryUserByName(String username);
}


3.5 mybatis配置文件

注意是在src根目录下创建着俩文件
在这里插入图片描述

mysql.properties,注意test1为数据库名字,按需更换,密码是MySQL的密码:
参考:[1]

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8
username = root
password = 1234

mybatis-config.xml,注意mysql.properties相当于存放的是mybatis-config.xml的参数。mybatis-config.xml在property name="keyword"时,keyword需要对应。比如mysql.properties用的username这样的拼写,那么mybatis-config.xml需要对应写property name="username" 而不能property name="uname"

mybatis-config.xml:
参考:[1]

<?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>

    <properties resource="mysql.properties"/>
    <!-- 默认使用的环境 ID(比如:default="development")
    也就是说我们可以配置多套<environment>环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--                JDBC 驱动-->
                <property name="driver" value="${driver}"/>
                <!--                url数据库的 JDBC URL地址。-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com.xxxx.mapper"/>
    </mappers>

</configuration>

3.6 util

建立一个GetSqlSession.java
在这里插入图片描述

/**
 *
 */
package com.xxxx.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class GetSqlSession {
    
    
   public static SqlSession createSqlSession(){
    
    
       SqlSessionFactory sqlSessionFactory = null;
       InputStream input = null;
       SqlSession session = null;

       try{
    
    
           //获取mybatis的环境配置文件
           String resource ="mybatis-config.xml";
           //以流的方式获取resourse
           input = Resources.getResourceAsStream(resource);
           //创建会话工厂
           sqlSessionFactory=new SqlSessionFactoryBuilder().build(input);
           //通过工厂得到SqlSession
           session=sqlSessionFactory.openSession();
           return session;
       } catch (IOException e) {
    
    
           e.printStackTrace();
           return null;
       }
   }

   public static void main(String[] args){
    
    
       System.out.println(createSqlSession());
   }


}


3.7 测试

新建test.java
在这里插入图片描述

package com.xxxx.test;

import com.xxxx.entity.User;
import com.xxxx.mapper.UserMapper;
import com.xxxx.util.GetSqlSession;
import org.apache.ibatis.session.SqlSession;

public class Test {
    
    
    public static void  main(String[] args){
    
    
        //获取sqlSession对象
        SqlSession session = GetSqlSession.createSqlSession();
        //得到对应的Mapper
        UserMapper userMapper = session.getMapper(UserMapper.class);
        //调用方法,返回用户对象
        User user = userMapper.queryUserByName( "wen");
        System.out.println(user);
    }
}

运行结果
在这里插入图片描述

4.后台功能

4.1 总体思路

分层思想:
在这里插入图片描述

思路:
1.接收客户端的请求(接收参数:姓名、密码)
2.参数的非空判断
如果参数为空
通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面 return
3.通过用户姓名查询用户对象
4.判断用户对象是否为空
如果为空
通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面 return
5.将数据库中查询到的用户密码与前台传递的密码作比较
如果不相等,通过消息模型对象返回结果(设置状态、设置提示信息、回显数据)
将消息模型对象设置到request作用域中
请求转发跳转到登录页面
如果相等,表示登录成功
将用户信息设置到session作用域中
重定向跳转到首页

controller层(接收请求、响应结果)
1.接收客户端的请求(接收参数:姓名、密码)
2.调用service层的方法, 返回消息模型对象
3.将消息模型对象设置到request作用域中
4.请求转发跳转到登录页面
service层(业务 逻辑)
1.参数的非空判断
如果参数为空
将状态码、提示信息、回显数据设置到消息模型对
返回消息模型对象
2.调用dao层的查询方法,通过用户名查询用户对象
3.判断用户对象是否为空
将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
4.将成功状态、提示信息、用户对象设置消息模型对象,并return
mapper层(Dao层 )
定义对应的接口

4.2 消息模型对象

在这个目录下,创建MessageModel.java文件在这里插入图片描述

package com.xxxx.entity.vo;
/*
* 消息模型对象(数据响应)
*      状态码
*        1=成功,0=失败
*      提示信息
*        字符串
*      回显数据
*        object对象
* */
public class MessageModel {
    
    
    private Integer code=1; //状态码(1=成功,0=失败)
    private String msg="success!";//提示信息
    private Object object;//回显对象(基本数据类型、字符串类型、List、Map等)


    public Integer getCode() {
    
    
        return code;
    }

    public void setCode(Integer code) {
    
    
        this.code = code;
    }

    public String getMsg() {
    
    
        return msg;
    }

    public void setMsg(String msg) {
    
    
        this.msg = msg;
    }

    public Object getObject() {
    
    
        return object;
    }

    public void setObject(Object object) {
    
    
        this.object = object;
    }
}

4.3 业务逻辑

先写一个小工具人代码用于判断非空
在这里插入图片描述

package com.xxxx.util;
/*
* 字符串工具类
* */
public class StringUtil {
    
    
    /*
    * 判断字符是否为空
    *      如果为空返回true
    * */
    public  static  boolean isEmpty(String str){
    
    
        if(str ==null || "".equals(str.trim())){
    
    
            return true;
        }
        return false;
    }
}

再写主业务逻辑

在这里插入图片描述

package com.xxxx.service;

import com.xxxx.entity.User;
import com.xxxx.entity.vo.MessageModel;
import com.xxxx.mapper.UserMapper;
import com.xxxx.util.GetSqlSession;
import com.xxxx.util.StringUtil;
import org.apache.ibatis.session.SqlSession;

/*
* 业务逻辑
* */
public class Userservice {
    
    
    /**
     * 用户登录
     * 1.参数的非空判断
     *      如果参数为空
     *      将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
     * 2.调用dao层的查询方法,通过用户名查询用户对象
     * 3.判断用户对象是否为空
     *      将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
     * 4.将成功状态、提示信息、用户对象设置消息模型对象,并return
     */

    public MessageModel userLogion(String uname, String upwd) {
    
    
        MessageModel messageModel=new MessageModel();

        //1.参数的非空判断
        if(StringUtil.isEmpty(uname) || StringUtil.isEmpty(upwd)){
    
    
            //将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象

            messageModel.setCode(0);
            messageModel.setMsg("UseName or PassWord cannot be null");
            //回显数据
            User u=new User();
            u.setUserName(uname);
            u.setUserPwd(upwd);
            return  messageModel;
        }

       // 2.调用dao层的查询方法,通过用户名查询用户对象
        SqlSession session= GetSqlSession.createSqlSession();
        UserMapper userMapper=session.getMapper(UserMapper.class);
        User user= userMapper.queryUserByName(uname);

        //3.判断用户对象是否为空
        if(user==null){
    
    
            //将状态码、提示信息、回显数据设置到消息模型对象中,返回消息模型对象
            messageModel.setCode(0);
            messageModel.setMsg("no this user");
            //回显数据
            User u=new User();
            u.setUserName(uname);
            u.setUserPwd(upwd);
            return  messageModel;
        }
        //4.比较密码

        if(!upwd.equals(user.getUserPwd())){
    
    
            System.out.println(user.getUserName()+"   "+user.getUserPwd()+"   "+user.getUserId());
            messageModel.setCode(0);
            messageModel.setMsg("the password wrong");
            return  messageModel;
        }
        //5.登录成功,将用户信息设置带消息模型中

        messageModel.setObject(user);
        return  messageModel;
    }
}

4.4 Servlet

在这里插入图片描述

package com.xxxx.controller;

import com.xxxx.entity.vo.MessageModel;
import com.xxxx.service.Userservice;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/index")//这个/很重要
public class UserServlet extends HttpServlet {
    
    
    //实例化UserService对象
    private  Userservice userService =new Userservice();
    /*
    * 用户登录
    1.接收客户端的请求(接收参数:姓名、密码)
    2.调用service层的方法 ,返回消息模型对象
    3.判断消息模型的状态码
       如果状态码是失败
           将消息模型对象设置到request作用城中,请求转发跳转到login.jsp
       如果状态码是成功
           将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
    * */
    @Override
    protected  void  service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    
    
       // 1.接收客户端的请求(接收参数:姓名、密码)
        String uname =request.getParameter("uname");
        String upwd=request.getParameter("upwd");
        //2.调用service层的方法 ,返回消息模型对象
        MessageModel messageModel=userService.userLogion(uname,upwd);
        //3.判断消息模型的状态码
        if(messageModel.getCode()==1){
    
    //成功
            //将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
            request.getSession().setAttribute("user",messageModel.getObject());
            response.sendRedirect("test.jsp");
        }else{
    
    //失败
            //将调息模型中的用户信息没置到session作用城中,重定向跳转到index. jsp
            request.setAttribute("messageModel",messageModel);
            request.getRequestDispatcher("index.jsp").forward(request,response);
        }
    }
}


在写这部分代码的时候,一直报错找不到javax.servlet.annotation.WebServlet,直接在网上搜,全是教各种配置,导入jar包,折腾了很久很久,但一直报错,真的很冒火。然后越发不对劲,后来csdn关键词链接给了一个可能性,是tomcat版本原因。果然是,tomcat10以上的版本导入包的时候语句已经改变,变成了import jakarta.servlet.annotation.WebServlet;具体原因以及操作参考这个博主

4.5 IDEA的毛病

虽然写的时候不报红,服务器运行时就这找不到那找不到
例如,一个java: 无法访问org.apache.ibatis.session.SqlSession 我直接搜错误,网上全是MAVEN的情况怎么解决,关键我没用到MAVEN呀。但我发现这个函数就是在mybatis的jar包里面的,报找不到,就是jar包没添加上,所以我采用了单独添加jar包
在这里插入图片描述

在这里插入图片描述
然后apply,搞定

猜你喜欢

转载自blog.csdn.net/Cream_Cicilian/article/details/129234038