8.2 Smbms 登录流程的实现
- 编写前端页面
<html>
<head lang="en">
<meta charset="UTF-8">
<title>系统登录 --聚旺福超市订单管理系统</title>
<link type="text/css" rel="stylesheet" href="css/style.css" />
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type="text/javascript">
$(function(){
$("#login").click(function(){
var userCode = $("#userCode").val();
var password = $("#userPassword").val();
$.post("user/gologin",{"userCode":userCode,"password":password},function(result){
if(result != null){
if(result.flag==0){ //登录成功
//保存用户名称到cookie,以便自动登录系统
var date = new Date();
//获取过期时间(单位:毫秒)
date.setTime(date.getTime()+parseInt($("#time").val())*1000);
//保存cookie信息
$.cookie("usercode",result.data.usercode,{expires:date,path:"/"});
//跳转到首页
location.href="user/frame";
}else{ //登录失败
//显示失败信息
$(".info").html(result.msg);
}
}
},"json");
})
})
</script>
</head>
<body class="login_bg">
<section class="loginBox">
<header class="loginHeader">
<h1>聚旺福超市订单管理系统</h1>
</header>
<section class="loginCont">
<form class="loginForm" action="jsp/frame.jsp" name="actionForm" id="actionForm" method="post" >
<div class="info"></div>
<div class="inputbox">
<label for="userCode">用户名:</label>
<input type="text" class="input-text" id="userCode" name="userCode" placeholder="请输入用户名"/>
</div>
<div class="inputbox">
<label for="userPassword">密码:</label>
<input type="password" id="userPassword" name="userPassword" placeholder="请输入密码"/>
</div>
<div class="inputbox">
<label for="time">时间:</label>
<select id="time">
<option value="60">1分钟</option>
<option value="3600">1小时</option>
<option value="86400">1天</option>
<option value="604800">7天</option>
</select>
</div>
<div class="subBtn">
<input type="button" id="login" value="登录"/>
<input type="reset" value="重置"/>
</div>
</form>
</section>
</section>
</body>
</html>
- 编写操作数据库的类
- 先写 接口
package com.muquanyu.dao.user;
import com.muquanyu.pojo.SmbmsUser;
import java.sql.Connection;
public interface UserDao {
//得到要登录的用户
public SmbmsUser getLoginUser(Connection connection,String userCode);
}
- 再写 类
package com.muquanyu.dao.user;
import com.muquanyu.dao.BaseDao;
import com.muquanyu.pojo.SmbmsUser;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl implements UserDao {
@Override
public SmbmsUser getLoginUser(Connection connection, String userCode) {
PreparedStatement pstm = null;
ResultSet rs = null;
SmbmsUser user = null;
if(connection != null){
String sql = "select * from smbms_user where userCode=?";
Object[] params = {userCode};
try {
rs = BaseDao.execute(connection, sql, params, pstm, rs);
if(rs.next()){
user = new SmbmsUser();
user.setId(rs.getInt("id"));
user.setUserCode(rs.getString("userCode"));
user.setUserName(rs.getString("userName"));
user.setUserPassword(rs.getString("userPassword"));
user.setGender(rs.getInt("gender"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
user.setUserRole(rs.getInt("userRole"));
user.setCreationDate(rs.getDate("creationDate"));
user.setCreatedBy(rs.getInt("createdBy"));
user.setModifyBy(rs.getInt("modifyBy"));
user.setModifyDate(rs.getDate("modifyDate"));
}
//数据库连接 先不用关.
BaseDao.closeResource(null, pstm, rs);
} catch (SQLException e) {
e.printStackTrace();
}
}
return user;
}
}
- 编写业务层 类,然后去调用 DAO 部分。
package com.muquanyu.service.user;
import com.muquanyu.dao.BaseDao;
import com.muquanyu.dao.user.UserDao;
import com.muquanyu.dao.user.UserDaoImpl;
import com.muquanyu.pojo.SmbmsUser;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
public class UserServiceImpl implements UserService{
//业务层 都会去 调用 DAO 层,所以我们要 去引入 DAO 层
private UserDao userDao;//直接 用组合的方式 引入
public UserServiceImpl(){
userDao = new UserDaoImpl();
}
@Override
public SmbmsUser login(String userCode, String password) {
Connection connection = null;
SmbmsUser user= null;
connection = BaseDao.getConnection();
user = userDao.getLoginUser(connection, userCode);
return user;
}
@Test
public void test(){
UserServiceImpl userService = new UserServiceImpl();
SmbmsUser user = userService.login("wen", "123456722");
System.out.println(user.getUserPassword());
}
}
实际上你会发现,业务层 的代码,基本上 就是 调一下 DAO 部分,没啥太大的区别。确实是这样的。
- 控制层 Servlet 代码的编写
package com.muquanyu.servlet.user;
import com.muquanyu.pojo.SmbmsUser;
import com.muquanyu.service.user.UserService;
import com.muquanyu.service.user.UserServiceImpl;
import com.muquanyu.util.Constants;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
//servlet 肯定去 调 业务层呀(控制层 --> 业务层)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("LoginServlet--start.....");
//获取用户名和密码(从 视图层获取)
String userCode = req.getParameter("userCode");
String userPassword = req.getParameter("userPassword");
//直接调用业务层,和我们获取到的用户名,密码进行对比
UserService userService = new UserServiceImpl();
SmbmsUser user = userService.login(userCode,userPassword);
if(user == null){
System.out.println("用户名不正确!没有这个用户!");
req.setAttribute("error","用户名不存在!");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}else{
if(userPassword.equals(user.getUserPassword())){
System.out.println("登录成功!已把所有用户信息录入session!");
req.getSession().setAttribute(Constants.USER_SESSION, user);
resp.sendRedirect("/smbms_war/jsp/frame.jsp");
}
else{
System.out.println("密码不正确!");
req.setAttribute("error","密码不正确!");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
//super.doPost(req, resp);
}
}
可能 大家 会 有个 问题,为啥 不直接 用 类名 对象 = new 类名()
而是 采用 接口 对象 = new 实现类()
其实这个 无所谓呀,但是 我要 跟大家 讲一下啊。接口 对象 = new 实现类名()
是 只能 用 接口 里面 定义的那些方法。就 好像 向上转换 的道理那样。而 类名 对象 = new 类名()
是可以 调用 更多的 方法和 属性的。所以 我才说 无所谓啊。这个 看个人需求,但是 大家 千万 别 理解错了,接口 对象 = new 接口() 是不成立的!因为 抽象的 东西 无法 实例化,但是 可以 声明 一个 对象变量,作为 变量 来接收 一个 内存地址。
- 注册 控制层
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.muquanyu.servlet.user.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
- 视图层 在点击登录提交数据的时候,理应 指向 这个 被注册 servlet 程序。
温馨提示:如果 出现了 css 加载失败的话,那么 请你不要 写 <DOCTYPE=text/html> 这样的代码 在 jsp 文件里。
@Test 如果 提示 没有,那么就是让你 去导入 最新的 Junit 包了。自己去 导入一下吧。