• SpringMVC之注册/登录/发送JSON



    提示:以下是本篇文章正文内容,Java系列学习将会持续更新

    应用介绍

    基于 Spring MVC 的web开发技术,实现了一个具有 登录/注册/发送JSON数据 的小应用。

    与 Servlet 相比,Spring 更加简单、方便,省去了大量繁琐的步骤。

    也是对前面 Spring 基础学习的一次实践:

    1. 熟悉 Spring 注解在不同场景下的应用
    2. 熟悉 Spring 的 Ioc / DI 特性
    3. 熟悉 Spring 动态绑定技术

    程序访问入口:
     登录:127.0.0.1:8080/login.html
     注册:127.0.0.1:8080/register.html
     JSON数据:127.0.0.1:8080/user/user-list.json

    回到目录…

    main

    java

    login

    LoginApplication.java

    启动类,什么也不需要写。

    @SpringBootApplication
    public class LoginApplication {
        public static void main(String[] args) {
            SpringApplication.run(LoginApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    AppConfig.java

    配置类,将 DataSource单例对象连接到数据库,并提交给 Spring 管理。

    @Configuration
    public class AppConfig {
        @Bean
        public DataSource getDataSource(@Value("${spring.datasource.url}") String url,
                                        @Value("${spring.datasource.username}") String username,
                                        @Value("${spring.datasource.password}") String password) {
            MysqlDataSource mysqlDataSource = new MysqlDataSource();
            mysqlDataSource.setURL(url);
            mysqlDataSource.setUser(username);
            mysqlDataSource.setPassword(password);
            return mysqlDataSource;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    回到目录…

    User.java

    实体类,将表中的数据包装成对象。

    @Data
    public class User {
        private Integer uid;
        private String username;
        @JsonIgnore // 表示在 JSON 格式下,不显示password
        private String password;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    UserDao.java

    持久层(Dao),表示是一个获取对象的类 (实际操作数据库)。

    @Repository
    public class UserDao {
        private final DataSource dataSource;
        @Autowired // 构造方法注入 DataSource 对象
        public UserDao(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
    	// 向表中插入新用户
        @SneakyThrows
        public void insert(User user) {
            String sql = "insert into users (username, password) values (?, ?)";
            try (Connection c = dataSource.getConnection()) {
                try (PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
                    ps.setString(1, user.getUsername());
                    ps.setString(2, user.getPassword());
                    ps.executeUpdate();
                    try (ResultSet rs = ps.getGeneratedKeys()) {
                        rs.next();
                        user.setUid(rs.getInt(1));
                    }
                }
            }
        }
    
    	// 根据用户名获取表中的用户数据
        @SneakyThrows
        public User selectOneByUsername(String username) {
            String sql = "select uid, username, password from users where username = ?";
            try (Connection c = dataSource.getConnection()) {
                try (PreparedStatement ps = c.prepareStatement(sql)) {
                    ps.setString(1, username);
                    try (ResultSet rs = ps.executeQuery()) {
                        if (!rs.next()) {
                            return null;
                        }
                        User user = new User();
                        user.setUid(rs.getInt("uid"));
                        user.setUsername(rs.getString("username"));
                        user.setPassword(rs.getString("password"));
                        return user;
                    }
                }
            }
        }
    
    	// 生成链表(包含表中所有用户数据)
        @SneakyThrows
        public List<User> selectList() {
            List<User> userList = new ArrayList<>();
            String sql = "select uid, username, password from users order by uid desc";
            try (Connection c = dataSource.getConnection()) {
                try (PreparedStatement ps = c.prepareStatement(sql)) {
                    try (ResultSet rs = ps.executeQuery()) {
                        while (rs.next()) {
                            User user = new User();
                            user.setUid(rs.getInt("uid"));
                            user.setUsername(rs.getString("username"));
                            user.setPassword(rs.getString("password"));
    
                            userList.add(user);
                        }
                    }
                }
            }
            return userList;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    回到目录…

    UserService.java

    业务逻辑类,表示具体的业务逻辑,注册、登录。。。

    @Slf4j
    @Service
    public class UserService {
        private final UserDao userDao;
    
        @Autowired
        public UserService(UserDao userDao) {
            this.userDao = userDao;
        }
    
        // 注册
        public void register(User user) {
            userDao.insert(user);
        }
    
        // 登录
        public User login(String username, String password) {
            User user = userDao.selectOneByUsername(username);
            if (user == null) {
                log.debug("用户名对应的用户不存在");
                return null;
            }
            if (!user.getPassword().equals(password)) {
                log.debug("密码不对");
                return null;
            }
            log.debug("用户名 + 密码都正确");
            return user;
        }
    
        // 用户列表
        public List<User> getUserList() {
            return userDao.selectList();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    回到目录…

    UserController.java

    控制类,处理http请求。

    @Slf4j
    @Controller
    @RequestMapping("/user")
    public class UserController {
        private final UserService userService;
    
        @Autowired
        public UserController(UserService userService) {
            this.userService = userService;
        }
    
        // 注册动态资源
        @PostMapping(value = "/register.do", produces = "text/html; charset=utf-8")
        @ResponseBody
        public String register(User user) {
            log.debug("用户传入参数: {}", user);
            userService.register(user);
            // 注册成功,返回HTML标签
            return "注册成功!去登录";
        }
    
        // 登录动态资源
        @PostMapping("/login.do")
        public String login(String username, String password, HttpServletRequest request) {
            User user = userService.login(username, password);
            if (user == null) {
                // 不存在该用户
                log.debug("用户登录失败,重定向回登录页");
                return "redirect:/login.html"; // "redirect:" 是固定的,后边加目标 URL
            }
    
            // 登录成功 - 建立会话
            HttpSession session = request.getSession(true);
            session.setAttribute("currentUser", user);
            // 展示用户列表
            return "redirect:/user/user-list.json";
        }
    
        // 演示一个用户列表的 JSON,要求,用户必须已经登录
        private static class ResultView {
            public boolean success;
            public User currentUser;
            public List<User> userList;
    
            // 用户不存在,返回一堆空
            public ResultView() {
                this.success = false;
                this.currentUser = null;
                this.userList = new ArrayList<>();
            }
    
            // 用户存在,返回数据
            public ResultView(User currentUser, List<User> userList) {
                this.success = true;
                this.currentUser = currentUser;
                this.userList = userList;
            }
        }
    
        @GetMapping("/user-list.json")
        @ResponseBody   // 表示处理 JSON
        public ResultView userList(HttpServletRequest request) {
            User currentUser = null;
            HttpSession session = request.getSession(false); // 参数 false,防止新建会话
            if (session != null) {
                currentUser = (User) session.getAttribute("currentUser");
            }
            if (currentUser == null) {
                return new ResultView();
            }
            // 获取数据链表
            List<User> userList = userService.getUserList();
            return new ResultView(currentUser, userList);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    回到目录…

    resources

    static

    login.html
    DOCTYPE html>
    <html lang="zh-hans">
    <head>
        <meta charset="UTF-8">
        <title>登录title>
    head>
    <body>
        <form method="post" action="/user/login.do">
            <input type="text" name="username">
            <input type="password" name="password">
            <button>登录button>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    register.html
    DOCTYPE html>
    <html lang="zh-hans">
    <head>
        <meta charset="UTF-8">
        <title>注册title>
    head>
    <body>
        <form method="post" action="/user/register.do">
            <input type="text" name="username">
            <input type="password" name="password">
            <button>注册button>
        form>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    application.yml

    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/lianxi?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
    
    • 1
    • 2
    • 3
    • 4
    • 5

    回到目录…


    总结:
    提示:这里对文章进行总结:
    以上就是今天的学习内容,本文是SpringMVC的学习,学习基于SpringMVC的web开发技术,也是对Spring注解的综合应用,实现了一个具有注册/登录/发送JSON数据功能的小应用。之后的学习内容将持续更新!!!

  • 相关阅读:
    【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )
    CNN进行猫狗识别(PyTorch)
    【数据结构】排序--选择排序(堆排序)
    国外Twilio 发送sms短信
    [论文笔记] SecPod:一个基于虚拟化安全系统的框架
    使用GPU搭建支持玛雅(Maya)和Adobe AI,DW,PS的职校云计算机房
    金仓数据库KingbaseES客户端编程接口指南-Gokb(2. 概述)
    《基于Tensorflow的知识图谱实战》 --- 有趣的词嵌入--word embedding(二)| fastText和预训练词向量
    python socket 制作http服务器 (面向对象封装)
    DataParalle(DP) Summary介绍
  • 原文地址:https://blog.csdn.net/qq15035899256/article/details/126555706