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