一、admin登录页面
本质就是发送一个请求,跳转到damin-login.jsp中,可以不用写controller 直接在pringmvc的配置文件中配置一个
当用户发/admin/to/login/page.html 这个请求时会到 admin-login.jsp 这个页面
当然了 这个jsp会被视图解析器拼串 所以就是/WEB-INF/admin-login.jsp
<mvc:view-controller path="/admin/to/login/page.html" view-name="admin-login"/>
1. 使用layyer弹层组件
加入layer的库文件和样式文件
在页面上引入layer
二、登录
1. 目标:
2. 思路
- 现在比较时髦的登录写法:先通过账号在数据库中查,把对应的Admin查出来封装到实体类中,在从service层进行账号密码的处理。
- 因为 账号密码登录也属于业务,所以最好在service层完成
- 如果通过账号查询出来的admin对象为null,那么直接就抛出异常 LoginFialedException 【自定义的登录异常】
- 如果查到对象之后,再用密码进行比对【密码需要使用md5加密】成功就把admin对象返回controller层存到session里面再跳转到后台主页面,失败就抛异常
3. 代码
1) 创建登录失败的异常
package com.yixuexi.crowd.exception;
/**
* @date: 2021/1/12 13:14
* @author: 易学习
* 自定义异常:登录失败后抛出的异常。
*/
public class LoginFailedException extends RuntimeException{
private static final long serialVersionUID = 1L;
public LoginFailedException() {
super();
}
public LoginFailedException(String message) {
super(message);
}
}
2) Service层的方法 验证登录【当下潮流】
在抛出异常参数我这里用的是常量类中的常量
public static final StringMESSAGE_ACCT_IS_NULL == “账号不存在!”
@Override
public Admin getAdminByLoginAcct(String loginAcct, String userPswd) {
// 1.根据登录账号查询Admin对象
AdminExample adminExample = new AdminExample();
AdminExample.Criteria criteria = adminExample.createCriteria();
criteria.andLoginAcctEqualTo(loginAcct);
List<Admin> admins = adminMapper.selectByExample(adminExample);
// 2.判断Admin对象是否为null
// ①如果是集合是null,或者集合中元素等于0个 那说明没有查到
if (admins == null || admins.size() == 0){
throw new AdminErrorException(CrowdConstant.MESSAGE_ACCT_IS_NULL);
}
// ②一般是不会出现这个问题的,不可能有两个loginAcct相同
if (admins.size() > 1){
throw new RuntimeException(CrowdConstant.MESSAGE_SYSTEM_ERROR_LOGIN_ACCT_NOT_UNIQUE);
}
Admin admin = admins.get(0);
if (admin == null){
// 3.如果为null则抛出异常 【账号不存在!】
throw new AdminErrorException(CrowdConstant.MESSAGE_ACCT_IS_NULL);
}
// 4.如果存在,将密码从数据库中取出来
String passwordDB = "";
passwordDB = admin.getUserPswd();
// 5.将表单提交的明文密码进行加密
String md5Str = CrowdUtil.md5(userPswd);
// 6.对密码进行比较,不一致抛异常,一致返回Admin对象
// ①这里使用Objects工具类提供的工具方法
if (Objects.equals(md5Str,passwordDB)){
return admin;
}
// 抛出异常 【账号或密码不正确】
throw new LoginFailedException(CrowdConstant.MESSAGE_LOGIN_FAILED);
}
3) controller 层
前往后台主页面的方式调整:
- return “admin-main” 这样是转发的形式到页面,每次用户F5刷新时,就又会提交一次,进行查询数据库,验证…
使用重定向,因为admin-main.jsp是在/WEB-INF/ 所以就需要用view-controller 专门来配一个请求路径
/**
* @date: 2021/1/12 13:32
* @author: 易学习
*/
@Controller
public class AdminHandler {
@Autowired
private AdminService adminService;
@RequestMapping("/admin/do/login.html")
public String doLogin(@RequestParam("loginAcct") String loginAcct,
@RequestParam("userPswd") String userPswd,
HttpSession session
){
// 这个方法如果返回一个admin对象则说明账号密码正确
// 如果密码不正确,则上一级就已经抛出异常了
Admin adminByLoginAcct = adminService.getAdminByLoginAcct(loginAcct, userPswd);
// 将对象【用户信息】存到session作用域中
session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, adminByLoginAcct);
// return "admin-main" 这样是转发的形式到页面,每次用户F5刷新时,就又会提交一次,进行查询数据库,验证...
// 使用重定向,因为admin-main.jsp是在/WEB-INF/ 所以就需要用view-controller 专门来配一个请求路径
return "redirect:/admin/to/main/page.html";
}
}
4) spring-web-mvc.xml配置view-controller
<mvc:view-controller path="/admin/to/main/page.html" view-name="admin-main"/>
三、 用户退出逻辑
/**
* 用户退出登录
* @param session
* @return
*/
@RequestMapping("/admin/do/logout.html")
public String logout(HttpSession session){
// 强制session失效
session.invalidate();
// 重定向发请求,被view-controller解析
return "redirect:/admin/to/login/page.html";
}
四、JSP页面抽取
将想要的片段复制下来保存到一个新的jsp文件中
- 在需要页面的地方这样写 <%@include file=”/WEB-INF/include-head.jsp”%>
- 像一般的nav 或者 head都可以抽取出来
- 起名:include-nav.jsp include.head.jsp