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;// 返回对象,任意类型

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_努力努力再努力_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值