JavaWeb 25 Smbms 登录流程的实现

本文档详细介绍了SMBMS系统的登录流程实现,包括前端HTML页面的编写,使用jQuery进行Ajax登录请求,以及后端DAO接口和实现类的编写。业务层和服务层的交互确保了登录验证的执行,最后通过Servlet处理登录请求并进行响应。同时,提到了关于接口与实现类使用场景的解释,并给出了Servlet的配置和视图层的交互注意事项。
摘要由CSDN通过智能技术生成

8.2 Smbms 登录流程的实现


在这里插入图片描述

  1. 编写前端页面
<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>
  1. 编写操作数据库的类
  • 先写 接口
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;
    }
}
  1. 编写业务层 类,然后去调用 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 部分,没啥太大的区别。确实是这样的。

  1. 控制层 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 接口() 是不成立的!因为 抽象的 东西 无法 实例化,但是 可以 声明 一个 对象变量,作为 变量 来接收 一个 内存地址。

  1. 注册 控制层
<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>
  1. 视图层 在点击登录提交数据的时候,理应 指向 这个 被注册 servlet 程序。

在这里插入图片描述

温馨提示:如果 出现了 css 加载失败的话,那么 请你不要 写 <DOCTYPE=text/html> 这样的代码 在 jsp 文件里。

@Test 如果 提示 没有,那么就是让你 去导入 最新的 Junit 包了。自己去 导入一下吧。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值