这是上一篇博客地址:https://blog.csdn.net/qq_41115379/article/details/114292502
这是下一篇博客地址:https://blog.csdn.net/qq_41115379/article/details/114334907
实现业务登录:
目标就是:访问http://localhost:8080/meeting 默认访问login.jsp,输入用户名和密码,点击登录,并且登录成功之后,跳转到index.jsp页面,失败依然到login.jsp页面
先把那些静态文件拷贝到ftl下面
再做两件事,首先是将login.html改成 login.ftl
其次就是把images和styles移到webapp下面
然后在spring-servlet这边配置静态资源
<mvc:resources mapping="/**" location="/"/>
在controller包里创建loginController
package org.javaboy.meeting.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class loginController {
@RequestMapping("/")
public String login(){
return "login";
}
}
这样子直接运行,会出现ftl不能显示css等图片的问题,重启就行了
model下创建Employee
package org.javaboy.meeting.model;
public class Employee {
private Integer employeeid;
private String employeename;
private String username;
private String phone;
private String email;
private Integer status;
private Integer departmentid;
private String password;
private Integer role;
public Integer getEmployeeid() {
return employeeid;
}
public void setEmployeeid(Integer employeeid) {
this.employeeid = employeeid;
}
public String getEmployeename() {
return employeename;
}
public void setEmployeename(String employeename) {
this.employeename = employeename;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getDepartmentid() {
return departmentid;
}
public void setDepartmentid(Integer departmentid) {
this.departmentid = departmentid;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getRole() {
return role;
}
public void setRole(Integer role) {
this.role = role;
}
}
在mapper文件夹下,创建EmployeeMapper接口和EmployeeMapper.xml
package org.javaboy.meeting.mapper;
public interface EmployeeMapper {
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.javaboy.meeting.mapper.EmployeeMapper">
</mapper>
还有在serveice这边创建EmployeeService
package org.javaboy.meeting.service;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
}
可以把model.atturibute 理解为:按照spring一般的编码习惯,model
应该是contrller里面的Map结构吧。Map里面添加key=“student”,value=“student对象”的意思,最后把这个model返回一个jsp,在jsp页面上就能得到这个student对象了
然后是关于 forward和redirect 一个是请求转发,一个是重定位
loginController
package org.javaboy.meeting.controller;
import org.javaboy.meeting.model.Employee;
import org.javaboy.meeting.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class loginController {
@Autowired
EmployeeService employeeService;
@RequestMapping("/")
public String login(){
return "login";
}
@PostMapping("/dologin")
public String dologin(String username, String password, Model model){
Employee employee=employeeService.dologin(username,password);
if(employee==null){
//如果不存在的话
//所以model 到底是干啥的 好像是往前台传数据的按照spring一般的编码习惯,model 应该是contrller里面的Map结构吧。Map里面添加key=“student”,value=“student对象”的意思,最后把这个model返回一个jsp,在jsp页面上就能得到这个student对象了
model.addAttribute("error","用户名或密码输入错误");
return "forward:/";
}else if(employee.getStatus()==0){
model.addAttribute("error","用户待审批");
return "forward:/";
}else if(employee.getStatus()==2){
model.addAttribute("error","用户审批未通过");
return "forward:/";
}else{
//这个就是正常了
return "redirect:/notifications";
}
}
}
再在EmployeeService 这边补充的dologin方法
package org.javaboy.meeting.service;
import org.javaboy.meeting.mapper.EmployeeMapper;
import org.javaboy.meeting.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
public Employee dologin(String username, String password) {
Employee employee= employeeMapper.loadEmpByUsername(username);
//首先排除用户名不存在或者密码输入错误
if(employee==null||!employee.getPassword().equals(password)){
return null;
}
return employee;
}
}
再开始写mapper下面的EmployeeMapper和EmployeeMapper.xml
EmployeeMapper
package org.javaboy.meeting.mapper;
import org.javaboy.meeting.model.Employee;
public interface EmployeeMapper {
Employee loadEmpByUsername(String username);
}
EmployeeMapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.javaboy.meeting.mapper.EmployeeMapper">
<select id="loadEmpByUsername" resultType="org.javaboy.meeting.model.Employee">
select * from employee where username=#{username};
</select>
</mapper>
然后修改login.ftl的对应位置
<div class="page-content">
<div class="content-nav">
登录
</div>
<form action="/dologin" method="post">
<fieldset>
<legend>登录信息</legend>
<table class="formtable" style="width:50%">
<tr>
<td>账号名:</td>
<td>
<input name="username" id="accountname" type="text" />
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input name="password" id="new" type="password" />
</td>
</tr>
<tr>
<td colspan="2" class="command">
<input type="submit" value="登录" class="clickbutton" onclick="window.location.href='notifiactions.html';"/>
<input type="button" value="返回" class="clickbutton" onclick="window.history.back();"/>
</td>
</tr>
</table>
<div style="color: red">${error!''}</div>
</fieldset>
</form>
</div>
再启动一下
就会有各种情况了
当然,输入正确的,会跳转到404,因为还没写好
最后,要把自己登陆的信息传到session里面去
https://www.cnblogs.com/yuyu666/p/9743979.html HttpSession的作用
package org.javaboy.meeting.controller;
import org.javaboy.meeting.model.Employee;
import org.javaboy.meeting.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@Autowired
EmployeeService employeeService;
@RequestMapping("/")
public String login(){
return "login";
}
@PostMapping("/dologin")
public String dologin(String username, String password, Model model, HttpSession httpSession){
Employee employee=employeeService.dologin(username,password);
if(employee==null){
//如果不存在的话
//所以model 到底是干啥的 好像是往前台传数据的按照spring一般的编码习惯,model 应该是contrller里面的Map结构吧。Map里面添加key=“student”,value=“student对象”的意思,最后把这个model返回一个jsp,在jsp页面上就能得到这个student对象了
model.addAttribute("error","用户名或密码输入错误");
return "forward:/";
}else if(employee.getStatus()==0){
model.addAttribute("error","用户待审批");
return "forward:/";
}else if(employee.getStatus()==2){
model.addAttribute("error","用户审批未通过");
return "forward:/";
}else{
//这个就是正常了
//并且保存下来
httpSession.setAttribute("currentuser",employee);
return "redirect:/notifications";
}
}
}
(ps 这里我把loginController 改成了LoginController 看上去更格式了,所以出现问题的话,改一下名字就可以了)
开始修改notification
首先了解:getmapping,postmapping和requestmapping之间的区别https://blog.csdn.net/qq_41973208/article/details/85008962
然后是了解一下get和post的一点点区别https://www.cnblogs.com/logsharing/p/8448446.html:
- 当浏览器发出一个GET请求时,就意味着要么是用户自己在浏览器的地址栏输入,要不就是点击了html里a标签的href中的url
- 浏览器的POST请求都来自表单提交。每次提交,表单的数据被浏览器用编码到HTTP请求的body里。
首先在controller这边创建NotificationsController
package org.javaboy.meeting.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class NotificationsController {
@GetMapping("/notifications")
//这里是get 也就意味着,是需要在浏览器中输入xx/notifications 之后return一个网页
public String notifications(){
return "notifications";
}
}
然后把ftl文件夹下面的notification.html改成.ftl
然后启动访问一下:
http://localhost:8080/notifications
然后试试看登录一个username和密码输入成功的,就会发现可以了
但是有个小瑕疵就是
这边登录成功之后,应该是显示登录的用户
所以需要在notifications.ftl这边修改一下
这段代码的意思是:if currentuser 不等于null的话,就显示他的姓名
<div class="page-header">
<div class="header-banner">
<img src="images/header.png" alt="CoolMeeting"/>
</div>
<div class="header-title">
欢迎访问Cool-Meeting会议管理系统
</div>
<div class="header-quicklink">
欢迎您,
<#if currentuser??>
<strong>${currentuser.employeename!''}</strong>
</#if>
<a href="changepassword.html">[修改密码]</a>
</div>
</div>
而由于这一段东西,在很多地方都有存在的必要,就索性把他单独拉出来写一个
top.ftl
<div class="page-header">
<div class="header-banner">
<img src="images/header.png" alt="CoolMeeting"/>
</div>
<div class="header-title">
欢迎访问Cool-Meeting会议管理系统
</div>
<div class="header-quicklink">
欢迎您,
<#if currentuser??>
<strong>${currentuser.employeename!''}</strong>
</#if>
<a href="changepassword.html">[修改密码]</a>
</div>
</div>
并在login.ftl和notifications.ftl的对应位置 改成
<#include 'top.ftl'>
运行一下:
这些就都正常了
然后就辛苦自己一下,把剩下的html文件都换成ftl,然后把里面的page-header那一部分 都换成<#include ‘top.ftl’>