IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> MVC分层 登录案例的登录实现 -> 正文阅读

[开发测试]MVC分层 登录案例的登录实现

在这里插入图片描述

web 层,接收前台信息,然后调用 service 层,返回结果集

package com.xxxx.note.web;

import com.xxxx.note.po.User;
import com.xxxx.note.service.UserService;
import com.xxxx.note.vo.ResultInfo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    private UserService userService = new UserService();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        接受用户行为
        String actionName = request.getParameter("actionName");
//        判断用户行为,调用对应方法,当前用户行为是登录
        if ("login".equals(actionName)) {
            userLogin(request, response);
        }
    }

    /**
     * 用户登录
     * @param request
     * @param response
     */
    private void userLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1、获取参数
        String userName = request.getParameter("userName");
        String userPwd = request.getParameter("userPwd");
//        2、调用 service 层
        ResultInfo<User> resultInfo = userService.userLogin(userName, userPwd);
        if (resultInfo.getCode() == 1) {
//            成功登陆
//            将用户信息设置到 Session 作用域中
            request.getSession().setAttribute("user", resultInfo.getResult());
//            判断是否选择记住密码
            String rem = request.getParameter("rem");
//            表示记住密码
            if ("1".equals(rem)) {
                Cookie cookie = new Cookie("user", userName + "-" + userPwd);
//                设置失效时间
                cookie.setMaxAge(60 * 60);
                response.addCookie(cookie);
            } else {// 表示没有记住密码
                Cookie cookie = new Cookie("user", null);
//                删除 Cookie 设置 maxAge 为 0
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
//            重定向到 index 界面
            response.sendRedirect("index.jsp");


        } else {
//            登陆失败
//            将 resultInfo 对象设置到 request 作用域中
            request.setAttribute("resultInfo", resultInfo);
//            请求转发到登陆界面
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

service 层:进行逻辑判断,返回结果集

package com.xxxx.note.service;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.xxxx.note.dao.UserDao;
import com.xxxx.note.po.User;
import com.xxxx.note.vo.ResultInfo;

public class UserService {
    private UserDao userDao = new UserDao();
    public ResultInfo<User> userLogin(String userName, String userPwd) {
        ResultInfo<User> resultInfo = new ResultInfo<>();
//        数据回显,当用户输入不正确,回显原来输入的信息
        User u = new User();
        u.setUname(userName);
        u.setUpwd(userPwd);
        resultInfo.setResult(u);

//        1、判断参数是否为空
        if (StrUtil.isBlank(userName) || StrUtil.isBlank(userPwd)) {
            resultInfo.setCode(0);
            resultInfo.setMsg("用户的名称或密码是否为空");
            return resultInfo;
        }
//        2、如果不为空,通过用户名查找用户对象
        User user = userDao.queryUserByName(userName);
//        3、判断是否为空,如果为空
        if (user == null) {
            resultInfo.setCode(0);
            resultInfo.setMsg("该用户不存在");
            return resultInfo;
        }
//        4、用户不为空,比较密码,先将前台传递的密码按照 MD5 算法的方式加密
        userPwd = DigestUtil.md5Hex(userPwd);//一个工具类,进行密码加密操作
//        判断加密后的密码是否与数据库一致
        if (!userPwd.equals(user.getUpwd())) {
            resultInfo.setCode(0);
            resultInfo.setMsg("用户密码不正确");
            return resultInfo;
        }
//        5、登陆成功
        resultInfo.setCode(1);
        resultInfo.setResult(user);
        return resultInfo;

    }
}

dao 层:与数据库做交互
创建连接
定义 sql 语句
预编译
设置参数
返回结果集
关闭连接
返回 User 对象

package com.xxxx.note.dao;

import com.xxxx.note.po.User;
import com.xxxx.note.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDao {
    /**
     * 通过用户名查询
     * @param userName
     * @return
     */
    public User queryUserByName(String userName) {
        User user = null;

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
//            创建连接
            connection = DBUtil.getConnection();
//            定义 sql 语句
            String sql = "select * from tb_user where uname = ?";
//            预编译
            preparedStatement = connection.prepareStatement(sql);
//            设置参数
            preparedStatement.setString(1, userName);
//            返回结果集
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                user = new User();
                user.setUserId(resultSet.getInt("userId"));
                user.setUname(userName);
                user.setHead(resultSet.getString("head"));
                user.setNick(resultSet.getString("nick"));
                user.setMood(resultSet.getString("mood"));
                user.setUpwd(resultSet.getString("upwd"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(resultSet, preparedStatement, connection);
        }
        return user;
    }
}

po 层:User 对象

package com.xxxx.note.po;


import lombok.Getter;
import lombok.Setter;

/**
 * 此注解提供 get set 方法,使用 Lombok 插件,记得添加依赖,并且安装插件
 */
@Getter
@Setter
public class User {
    private Integer userId;
    private String uname;
    private String upwd;
    private String nick;//用户
    private String head;//用户头像
    private String mood;//用户心情

}

util 层:工具类,创建连接,关闭连接

package com.xxxx.note.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DBUtil {
    //    得到配置对象
    private static Properties properties = new Properties();

    static {
//        加载配置文件

//        通过 load 方法,将输入流内容加载进配置文件中
        try {
            InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(in);
//            通过配置文件加载驱动名
            Class.forName(properties.getProperty("jdbcName"));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取数据库连接
     *
     * @return
     */
    public static Connection getConnection() throws SQLException {
        Connection connection;
        String dbUrl = properties.getProperty("dbUrl");
        String dbName = properties.getProperty("dbName");
        String dbPwd = properties.getProperty("dbPwd");
//         得到数据库连接
        connection = DriverManager.getConnection(dbUrl, dbName, dbPwd);

//         得到数据库相关信息
        return connection;
    }

    public static void close(ResultSet resultSet, PreparedStatement preparedStatement, Connection connection) {
//         判断资源如果不为空则关闭
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (preparedStatement != null) {
                preparedStatement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

vo 层: 结果集,有响应码,提示信息和返回对象

package com.xxxx.note.vo;


import lombok.Getter;
import lombok.Setter;

/**
 * 用来封装返回结果的类
 * 有状态码
 *      成功: 1
 *      失败: 0
 * 提示信息
 * 返回对象(String, javaBean, 集合)
 */
@Getter
@Setter
public class ResultInfo<T> {
    private Integer code;// 返回的状态码
    private String msg;// 返回的提示信息
    private T result;// 返回对象,任意类型

}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:56:13  更:2021-07-31 16:56:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:38:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码