目录

初版(代码糅在一块)

mvc三层架构

bean层

数据访问层(持久层dao),负责数据库中的信息操作管理

业务逻辑层service

表现层controller

初版(代码糅在一块)

结合了spring后,以及前面l连接数据库的内容,做出初版的页面匹配代码

先创建一个User类,如果输入的用户名存在,就从数据库中将这个用户的信息读取出来存储到我们创建的user类中,然后与输入的密码进行匹配

通过lombok插件,可以省略类里面的很多的创建步骤

import lombok.*;
//set,get方法,构造方法有参无参,toString方法
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    private String userid;
    private String username;
    private String password;

}
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
//返回值是String类型的内容
@RestController
public class UserController3 {
    //登录的接口
    @RequestMapping("/userlogin")
    public String userlogin(String username,String password){
       try {
            //连接数据库的驱动
           Class.forName("com.mysql.jdbc.Driver");
           Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/test", "root", "123456");
           PreparedStatement ps = conn.prepareStatement("select * from login where username=?");
           ps.setString(1,username);
           ResultSet rs = ps.executeQuery();
           //查询的用户下面没有内容,返回用户不存在
           if(!rs.next()){
               return "该用户不存在";
           }
           //刚才的rs中已经读取到了关于用户的所有信息,我们将他通过数据库中的字段名称获取后,通过User类的构造方法储存
           User user = new User(
                   rs.getString("userid"),
                   rs.getString("username"),
                   rs.getString("password"));
           //如果数据库中存储对应的密码与你输入的密码不匹配,返回密码错误,把不为空的值放在前可以有效避免空指针异常,
           if(!(user.getPassword()).equals(password)){
               return "你的密码错误";
           }
            conn.close();
            ps.close();
            rs.close();
       }catch (Exception e){
            e.printStackTrace();
       }
        return "登录成功";
    }
}

我们来进行测试:

输入正确的用户名以及密码

 输入正确的用户名和错误的密码

不存在的用户

mvc三层架构

上面写的代码实现了3部分功能,页面访问输用户需求内容用作交互,验证用户名用户密码是否正确,以及查寻数据库中的内容,这三部分的代码都堆在一起,日后如果有需要修改的地方是非常让人头疼的,于是我们引入了架构

最常见的mvc架构:

UI(表现层controller): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

BLL:(业务逻辑层service): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

DAL:(数据访问层dao): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

先给出目录图:

请忽略掉test,只是用来测试功能的

 连接数据库以及创建构造器的工具类:JDBCUtil 之前有写过

(18条消息) jdbc 模拟增删查_zzds111的博客-CSDN博客

bean层

用来存储在数据库中查询到的用户信息,

我们在bean文件目录下创建User类, 在dao层查询到的数据会利用这个User类存储,方便在各层之间使用

import lombok.*;

//set,get方法,构造方法有参无参,toString方法
    @Setter
    @Getter
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
public class User
{
    private String userid;
    private String username;
    private String password;

}

数据访问层(持久层dao),负责数据库中的信息操作管理

我们这里就是通过传入的用户名,获取该用户在数据库里的所有信息

然后通过结果集中的getString方法获取用户信息,将信息通过User类的set方法传入user对象中,将user对象返回到service层判断。

import comshujia.spring.mvc.Until.JDBCUtil;
import comshujia.spring.mvc.bean.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
    public User loginDao(String username){
        //查询数据库,将查询到的信息存储 ->User(id,username,password)
        //这里先将user定义为null,如果后面查询不到用户信息就返回空的user
        User user = null;
        try {
            Connection conn = JDBCUtil.getConn();
            PreparedStatement ps = JDBCUtil.getPs("select * from login1 where username=?");
            ps.setString(1,username);
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
            //这里我们需要新创建一个user,因为上面的为空会报空指针异常
                user = new User();
                user.setUserid(rs.getString("userid"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
//        finally {
//            JDBCUtil.closeAll();
//        }
        return user;

    }
}

业务逻辑层service

我们在这一层的任务就是判断dao层返回的信息是否符合设置的逻辑规则,再将判断后的结果返回给表现层controll

所以先传需要传入用户名和密码两个参数

创建UserDao的对象,传入用户名,获取到存储该用户信息的user对象

如果这个对象是空的显示用户名不存在,查询到了内容再看看密码是否匹配

import comshujia.spring.mvc.bean.User;
import comshujia.spring.mvc.dao.UserDao;

//验证登录能否成功
public class UserService {
    public String loginService(String username,String password){
        UserDao userDao = new UserDao();
        //验证用户是否存在
        User user = userDao.loginDao(username);
        if(user==null){
            return "用户不存在";
        }
        if(!user.getPassword().equals(password)){
            return "密码错误";
        }
        // 验证用户码是否正确
        return "登录成功";
    }

}

表现层controller

负责与前端的交互,用户可以输入用户名,密码等信息,并且返回一个操作结果进行展示

import comshujia.spring.mvc.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserConntroller {
    @RequestMapping("/userlogin")
    public String userlogin(String username,String password){
        //登录成功还是失败需要业务逻辑层的验证
        UserService userService = new UserService();
        String message = userService.loginService(username,password);
        return message;
    }
}

演示:

这是我创建的数据表

运行application

 输入正确的用户名和密码

 输入正确的用户名和错误的密码

输入错误的用户名

 避雷:我在上面的dao层连接数据库后,写了一个关闭连接

 之后遇到的问题是,网页访问第一次正常,第二次开始就异常

 这是因为我写的JDBC工具类,为了方便将连接驱动写在了静态代码块中,这样的后果就是只会连接一次驱动,我关闭了连接后,多次调用工具类是没有用的,static中的内容只会执行一次

为了观感直接写一个打印一个获取连接的字符串

 我们再登录页面多刷新几次

控制台始终只会打印一次 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐