第一天总结之后端登录功能的实现

时间:2023-01-15 07:56:41

第一天总结之后端登录功能的实现

一、 前端页面

第一天总结之后端登录功能的实现
从图片 很明显知道 两个intput输入框 一个输入username 一个输入password
第一天总结之后端登录功能的实现

   从前端的页面代码 可以找到form表单
根据form表单的action属性了解到 点击登录跳转到 controller 层的 LoginServlet 

二、controller 层

创建一个 LoginServlet 用于接收页面的请求

    获取前端页面  input输入框的 username   和 password   通过request.getParameter()方法获取
    然后 将获取的  username和password  传到 service  层  用来进行业务判段
    new 对象  调方法 获取返回值 true或false 
    判断 
         如果账号密码正确:
               获取session 对象:   通过request.getSession() 获取session对象
               然后将username 存放到 session域中  目的是为了 在主页面的 右上角显示  用户名
               重定向到主页面的 servlet       UserFuzzyServlet 
        如果账号密码错误:
              重定向到登录页面 重新登录

LoginServlet 代码如下:

package com.qfedu.controller;

import com.qfedu.service.AdminService;
import com.qfedu.service.impl.AdminServiceImpl;

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

@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求字符集  防止post请求 中文乱码
        request.setCharacterEncoding("utf-8");
        //获取前端input输入框的username和password
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //获取service 对象  调用service方法
        AdminService adminService =new AdminServiceImpl();
        boolean login = adminService.login(username, password);
        if(login){
            //登录成功
            //设置session
            HttpSession session = request.getSession();
            //设置session的时间
            session.setMaxInactiveInterval(60*60);
            session.setAttribute("username",username);
            //设置默认属性
            session.setAttribute("userDelete",true);
            session.setAttribute("userResetPassword",true);
            session.setAttribute("userUpdate",true);
            //跳转到主页面
            //注意!!  如果直接重定向到页面   会将页面原本的数据覆盖  所以只能通过  重定向到指定servlet 然后由该servlet获取数据  带着指定数据 转发到页面
            response.sendRedirect("UserFuzzyServlet");
        }else{
            //登录失败  回到登录界面
           // request.getRequestDispatcher("/after/login.jsp").forward(request,response);
            response.sendRedirect(request.getContextPath()+"/after/login.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

三、service层

在service文件夹下创建一个 接口类 AdminService

  对应登录的  业务逻辑       判断账号密码是否正确
  书写抽象方法      boolean login(String username,String password);
  参数为controller 层 的 servlet传过来的 username和password  
  返回值为boolean类型

AdminService代码如下:

package com.qfedu.dao;

import com.qfedu.entity.Admin;

import java.util.List;

public interface AdminDao {
    List<Admin> loginDao(String username);
}

在service文件夹下的impl文件夹下创建 AdminServiceImpl 类 作为接口类的实现类

  在其中实现 接口的方法    
       因为管理员只有一条数据 所以只需要通过 username 查询     
           将username 传递到dao层  进行数据库的操作
           因为目的是 通过username查询数据   所以数据库的返回值为  存放对象的List集合 
           获取dao层数据库的操作返回的 存放对象的List集合 
           判断集合是否为空  如果不为空 然后集合中对象的password是否等于传入的password    正确返回true  否则返回false

AdminServiceImpl代码如下:

package com.qfedu.dao.impl;

import com.qfedu.dao.AdminDao;
import com.qfedu.entity.Admin;
import com.qfedu.utils.BaseDaoUtil;

import java.util.List;

public class AdminDaoImpl extends BaseDaoUtil implements AdminDao {

    @Override
    public List<Admin> loginDao(String username) {
        String sql="select * from admin where username=? ";
        Object[] objs={username};
        return super.query(sql,objs,Admin.class);
    }
}

四、dao层

在dao文件夹下创建一个 接口类 AdminDao

  对应登录的  数据库操作       通过封装的 sql语句和 username 查询数据
  
  书写抽象方法     List<Admin> loginDao(String username);
  参数为dao 层 的 service传过来的   
  返回值为boolean类型

AdminService代码如下:

package com.qfedu.dao;

import com.qfedu.entity.Admin;

import java.util.List;

public interface AdminDao {
    List<Admin> loginDao(String username);
}

在dao文件夹下的impl文件夹下创建 AdminDaoImpl 类 作为接口类的实现类 并继承BaseDao类 从而直接使用其方法

  在其中实现 接口的方法       
           因为utils工具包中  的 工具类  BaseDaoUtil 中 查询数据的方法的参数为 sql语句
  Object[]  数组  和 实体类的class文件
  所以需要将username 存放到 Object【】  数组中
  书写sql语句 select * from admin where username=?    通过username查询出对应的数据
  然后调用封装好的BaseDaoUtil进行查询操作

AdminDaoImpl代码如下:

package com.qfedu.dao.impl;

import com.qfedu.dao.AdminDao;
import com.qfedu.entity.Admin;
import com.qfedu.utils.BaseDaoUtil;

import java.util.List;

public class AdminDaoImpl extends BaseDaoUtil implements AdminDao {

    @Override
    public List<Admin> loginDao(String username) {
        String sql="select * from admin where username=? ";
        Object[] objs={username};
        return super.query(sql,objs,Admin.class);
    }
}

五、entity 实体类

在entity下创建Admin 实体类

 属性要与表的数据字段一一对应 
 私有化属性 并添加get  set方法 
package com.qfedu.entity;

public class Admin {
    private Integer id;
    private String username;
    private String password;

    public Admin() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}