员工管理信息系统springboot+mybatis整合项目

1 导入资源

1.1 依赖

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

1.2 html页面

页面资源在我的CSDN可以免费下载,地址如下:

下载链接: 员工管理系统静态资源(原版)

注意:静态资源放入static和templates中

导入静态页面,静态资源放入static和templates中

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!-- css的导入 -->
<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
<link th:href="@{/css/signin.css}" rel="stylesheet">

<!-- 图片的导入 -->
<img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">

<!-- js导入 -->
<script type="text/javascript" th:src="@{/js/jquery-3.2.1.slim.min.js}"></script>
<script type="text/javascript" th:src="@{/js/popper.min.js}"></script>
<script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>
<script type="text/javascript" th:src="@{/js/feather.min.js}"></script>
<script type="text/javascript" th:src="@{/js/Chart.min.js}"></script>

1.3 Thymeleaf使用

  • 简单表达式
    • 变量表达式:${…}
    • 选择变量表达式:*{…}
    • 信息表达式:#{…}
    • 链接URL表达式:@{…}
    • 片段表达式:~{…}
  • 常量
    • 文本常量:‘example’,‘other example’,…
    • 号码常量:1,12, 5.0,12.56,…
    • 布尔常量:true,false
    • 空常量:null
    • 常量标记:one,sometext,other,…
  • 文本操作
    • 字符串串联:+
    • 文字替换:|hello,my name is ${name}|
  • 算术运算
    • 二元运算符:+,-,*,/,%
    • 减号(一元运算符):-
  • 布尔运算
    • 二元运算符:and,or
    • 布尔否定(一元运算符):!,not
  • 比较和相等
    • 比较运算:>,<,>=,<=,(gt,lt,ge,le)
    • 相等运算(一元运算符):==,!=,(eq,ne)
  • 条件运算符
    • If-then:(if) ? (then)
    • If-then-else:(if) ? (then) : (else)
    • Default:(value) ?: (defaultvalue)
  • 特殊令牌
    • 无操作:_

2 pojo

导入lombok,自动写get/set方法

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

注解:
@Data // 使用lombok
@AllArgsConstructor // 有参构造
@NoArgsConstructor // 无参构造

Department.java

package com.cycyong.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data // 使用lombok
@AllArgsConstructor // 有参
@NoArgsConstructor // 无参
public class Department {
    private Integer id;
    private String departmentName;
}

Emoloyee.java

package com.cycyong.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private Integer id;
    private String ename;
    private String email;
    private Integer gender;// 0是男,1是女
    private Integer did;
    private String dname;
    private Date birthday;
}

3 Mapper

3.1 DepartmentMapper

DepartmentMapper.java

注解:

  • @Mapper:表示这是一个Mybatis的Mapper类
  • @Repository:将Dao层的类标识为 Spring Bean
package com.cycyong.mapper;
import com.cycyong.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;

@Mapper
@Repository
public interface DepartmentMapper {
    // 获得部门列表
    public List<Department> getDepartmentList();

    // 根据ID得到部门
    public Department getDepartmentById(int id);
}

Department.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">
<!--namespace 绑定一个对应Dao/Mapper接口-->
<mapper namespace="com.cycyong.mapper.DepartmentMapper">
    <select id="getDepartmentList" resultType="Department">
        select * from springbootweb.department
    </select>
    <select id="getDepartmentById" resultType="Department" parameterType="int">
        select * from springbootweb.department where id = #{id}
    </select>
</mapper>

3.2 EmployeeMapper

package com.cycyong.mapper;
import com.cycyong.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface EmployeeMapper {
    /**
     * 得到全部员工
     * @return list
     */
    public List<Employee> getEmployeeList();

    /**
     * 添加员工
     * @param employee 员工对象
     * @return int 影响行数
     */
    public int addEmployee(Employee employee);

    /**
     * 删除员工
     * @param id
     * @return
     */
    public int deleteEmployee(int id);

    /**
     * 修改员工
     * @param employee
     * @return
     */
    public int updateEmployee(Employee employee);

    /**
     * 按照id查找员工
     * @param id
     * @return
     */
    public Employee queryEmployeeById(int id);
}

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">
<!--namespace 绑定一个对应Dao/Mapper接口-->
<mapper namespace="com.cycyong.mapper.UserMapper">
    <select id="queryUserList" resultType="com.cycyong.pojo.User">
        select * from mybatis.user
    </select>
    <select id="queryUserById"  parameterType="int" resultType="com.cycyong.pojo.User">
        select * from mybatis.user where id = #{id}
    </select>
    <insert id="addUser" parameterType="User">
        insert into mybatis.user (id, name, pwd) VALUES (#{id},#{name},#{pwd})
    </insert>
    <update id="updateUser" parameterType="User">
        UPDATE mybatis.user set name = #{name},pwd = #{pwd} where id = #{id}
    </update>
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id}
    </delete>
</mapper>

4 Service

Service层调Dao层(Mapper)

注解:

  • @Service:标记该类是一个service类,会将当前类自动注入到spring容器
  • @Autowired:可以标注在属性上、方法上和构造器上,来完成自动装配

4.1 DepartmentService/Impl

DepartmentService.java

package com.cycyong.service;
import com.cycyong.pojo.Department;
import java.util.List;
public interface DepartmentService {

    public List<Department> getDepartmentList();
    
    public Department getDepartmentById(int id);
}

DepartmentServiceImpl.java

package com.cycyong.service;

import com.cycyong.mapper.DepartmentMapper;
import com.cycyong.pojo.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DepartmentServiceImpl implements DepartmentService {
    @Autowired
    DepartmentMapper departmentMapper;
    public void setDepartmentMapper(DepartmentMapper departmentMapper) {
        this.departmentMapper = departmentMapper;
    }

    @Override
    public List<Department> getDepartmentList() {
        return departmentMapper.getDepartmentList();
    }

    @Override
    public Department getDepartmentById(int id) {

        return departmentMapper.getDepartmentById(id);
    }
}

4.2 EmployeeService/Impl

EmployeeService.java

package com.cycyong.service;

import com.cycyong.pojo.Employee;

import java.util.List;

public interface EmployeeService {

    public List<Employee> getEmployeeList();

    public int addEmployee(Employee employee);

    public Employee queryEmployeeById(int id);

    public int updateEmployee(Employee employee);

    public int deleteEmployee(int id);
}

EmployeeServiceImpl.java

package com.cycyong.service;
import com.cycyong.mapper.EmployeeMapper;
import com.cycyong.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;

    public void setEmployeeMapper(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }

    @Override
    public List<Employee> getEmployeeList() {
        return employeeMapper.getEmployeeList();
    }

    @Override
    public int addEmployee(Employee employee) {
        return employeeMapper.addEmployee(employee);
    }

    @Override
    public Employee queryEmployeeById(int id) {
        return employeeMapper.queryEmployeeById(id);
    }

    @Override
    public int updateEmployee(Employee employee) {
        return employeeMapper.updateEmployee(employee);
    }

    @Override
    public int deleteEmployee(int id) {
        return employeeMapper.deleteEmployee(id);
    }
}

5 页面国际化

5.1 准备工作

在IDEA中统一设置properties的编码问题!UTF-8
properties配置编码

5.2 编写配置文件

  • 第一步:在resource下创建i18n文件夹
    在这里插入图片描述

  • 第二步:填写添加区域
    在这里插入图片描述

  • 第三步:填写相关信息
    在这里插入图片描述

5.3 国际化解析组件

根据按钮自动切换中文英文!
在Spring中有一个国际化的Locale (区域信息对象);里面有一个叫做LocaleResolver (获取区域信息对象)的解析器!

MyLocaleResolver.java

package com.cycyong.config;

import org.springframework.web.servlet.LocaleContextResolver;
import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

public class MyLocaleResolver implements LocaleResolver {
    // 解析请求
    @Override
    // 获得请求中的语言参数
    public Locale resolveLocale(HttpServletRequest request) {
        String language = request.getParameter("language");
        Locale locale = Locale.getDefault();//如果没有就是用默认的

        // 如果请求的链接携带了地区化的参数
        if(!StringUtils.isEmpty(language)){
            // zh_CN
            String[] split = language.split("_");
            // 国家,地区
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

在MyMvcConfig.java中装配
自定义组件MyLocaleResolver注入bean中才能生效,即交给spring容器中进行管理

//自定义国际化组件就生效了
@Bean//自动装配
public LocaleResolver localeResolver(){
    return new MyLocaleResolver();
}

配置基础路径
如果不在application中进行配置路径则系统找不到
application.properties

# 我们配置文件放在的真实位置
spring.messages.basename=i18n.login

5.4 配置页面国际化

取值为:#{…}

<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>

<input type="text" name="username" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">

<input type="password" name="password" class="form-control" th:placeholder="#{login.password}" required="">

<input type="checkbox" value="remember-me" th:text="#{login.remember}">

<button class="btn btn-lg btn-primary btn-block" type="submit"  th:text="#{login.btn}">Sign in</button>

US
在这里插入图片描述

6 登录/登出

6.1 登录

6.1.1 前端页面

msg为后端返回前端接收信息提示的标签

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
		<meta name="description" content="">
		<meta name="author" content="">
		<title>Signin Template for Bootstrap</title>
		<!-- Bootstrap core CSS -->
		<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
		<!-- Custom styles for this template -->
		<link th:href="@{/css/signin.css}" rel="stylesheet">
	</head>
<!--thymeleaf模板化之后,url统一为@{url}-->
	<body class="text-center">
		<form class="form-signin" th:action="@{/user/login}" method="post">
			<img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">
			<p style="color: red" th:text="${msg}"></p>
			<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}"></h1>
			<input type="text" name="username" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">
			<input type="password" name="password" class="form-control" th:placeholder="#{login.password}" required="">
			<div class="checkbox mb-3">
				<label>
          <input type="checkbox" value="remember-me" th:text="#{login.remember}">
        </label>
			</div>
			<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}"></button>
			<p class="mt-5 mb-3 text-muted">© 2017-2018</p>
			<a class="btn btn-sm" th:href="@{/index.html(language='zh_CN')}">中文</a>
			<a class="btn btn-sm" th:href="@{/index.html(language='en_US')}">English</a>
		</form>
	</body>
</html>

6.1.2 Controller

  1. 控制层拿到name属性为usernamepassword的两个值进行判断
  2. password正确之后创建用户Session,并重定向到主页
  3. password错误则用model返回报错信息
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        HttpServletRequest request,
                        Model model){
        if(!StringUtils.isEmpty(username) && password.equals("123456")){
            // 登录成功,添加session
            request.getSession().setAttribute(Constants.LOGIN_SESSION,username);
            // 重定向到主页
            return "redirect:/main.html";
        }else{
            model.addAttribute("msg","用户名或密码错误!");
            return "index";
        }
    }

6.2 登出

太简单了!直接将Session移除即可,在返回主页的过程中,登录拦截器LoginHandlerInterceptor会检测出Session是否存在!

    @RequestMapping("/user/logout")
    public String logout(HttpServletRequest request){
        request.getSession().removeAttribute(Constants.LOGIN_SESSION);
        return "index";
    }

6.3 登录拦截器

7 提取公共页面

由于前端页面冗余代码太多,可以考虑代码复用
Thymeleaf提供了commonfragment来进行复用,把公共部分提取出来

th:fragment="topbar"
th:replace="~{common/commons::topbar}"

8 员工列表展示

8.1 前端代码

<!DOCTYPE html>
<!-- saved from url=(0052)http://getbootstrap.com/docs/4.0/examples/dashboard/ -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
		<meta name="description" content="">
		<meta name="author" content="">

		<title>Dashboard Template for Bootstrap</title>
		<!-- Bootstrap core CSS -->
		<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
		<!-- Custom styles for this template -->
		<link th:href="@{/css/dashboard.css}" rel="stylesheet">
		<style type="text/css">
			/* Chart.js */
			@-webkit-keyframes chartjs-render-animation {
				from {
					opacity: 0.99
				}
				to {
					opacity: 1
				}
			}	
			@keyframes chartjs-render-animation {
				from {
					opacity: 0.99
				}
				to {
					opacity: 1
				}
			}
			
			.chartjs-render-monitor {
				-webkit-animation: chartjs-render-animation 0.001s;
				animation: chartjs-render-animation 0.001s;
			}
		</style>
	</head>

	<body>
		<div th:replace="~{common/commons::topbar}"></div>

		<div class="container-fluid">
			<div class="row">
				<!--侧边栏sidebar-->
				<div th:replace="~{common/commons::siderbar(active='list.html')}"></div>
				<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
					<h2><a class="btn btn-sm btn-success" th:href="@{/emp}">添加员工</a></h2>
					<div class="table-responsive">
						<table class="table table-striped table-sm">
							<thead>
								<tr>
									<th>id</th>
									<th>lastName</th>
									<th>email</th>
									<th>gender</th>
									<th>department</th>
									<th>date</th>
									<th>操作</th>
								</tr>
							</thead>
							<tbody>
							<tr th:each="emp:${emps}">
								<td th:text="${emp.getId()}"></td>
								<td th:text="${emp.getEname()}"></td>
								<td th:text="${emp.getEmail()}"></td>
								<td th:text="${emp.getGender()==0?'':''}"></td>
								<td th:text="${emp.getDname()}"></td>
								<td th:text="${#dates.format(emp.getBirthday(),'yyyy-MM-dd HH:mm:ss')}"></td>
								<td>
									<a class="btn btn-sm btn-primary" th:href="@{/toUpdateEmp/{id}(id=${emp.getId()})}">编辑</a>
									<a class="btn btn-sm btn-danger" th:href="@{/deleteEmp/{id}(id=${emp.getId()})}">删除</a>
								</td>
							</tr>
							</tbody>
						</table>
					</div>
				</main>
			</div>
		</div>

		<!-- Bootstrap core JavaScript
    ================================================== -->
		<!-- Placed at the end of the document so the pages load faster -->
		<script type="text/javascript" th:src="@{/js/jquery-3.2.1.slim.min.js}"></script>
		<script type="text/javascript" th:src="@{/js/popper.min.js}"></script>
		<script type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script>

		<!-- Icons -->
		<script type="text/javascript" th:src="@{/js/feather.min.js}"></script>
		<script>
			feather.replace()
		</script>

		<!-- Graphs -->
		<script type="text/javascript" th:src="@{/js/Chart.min.js}"></script>
		<script>
			var ctx = document.getElementById("myChart");
			var myChart = new Chart(ctx, {
				type: 'line',
				data: {
					labels: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
					datasets: [{
						data: [15339, 21345, 18483, 24003, 23489, 24092, 12034],
						lineTension: 0,
						backgroundColor: 'transparent',
						borderColor: '#007bff',
						borderWidth: 4,
						pointBackgroundColor: '#007bff'
					}]
				},
				options: {
					scales: {
						yAxes: [{
							ticks: {
								beginAtZero: false
							}
						}]
					},
					legend: {
						display: false,
					}
				}
			});
		</script>
	</body>
</html>

8.2 Controller

1.使用model将员工列表返回前端

    @RequestMapping("/emps")
    public String List(Model model){
        List<Employee> employeeList = employeeService.getEmployeeList();
        model.addAttribute("emps",employeeList);
        return "emp/list";
    }

2.使用each将emps中的每一个员工对象遍历出来即可

<table class="table table-striped table-sm">
	<thead>
		<tr>
			<th>id</th>
			<th>lastName</th>
			<th>email</th>
			<th>gender</th>
			<th>department</th>
			<th>date</th>
			<th>操作</th>
		</tr>
	</thead>
	<tbody>
	<tr th:each="emp:${emps}">
		<td th:text="${emp.getId()}"></td>
		<td th:text="${emp.getEname()}"></td>
		<td th:text="${emp.getEmail()}"></td>
		<td th:text="${emp.getGender()==0?'':''}"></td>
		<td th:text="${emp.getDname()}"></td>
		<td th:text="${#dates.format(emp.getBirthday(),'yyyy-MM-dd HH:mm:ss')}"></td>
		<td>
			<a class="btn btn-sm btn-primary" th:href="@{/toUpdateEmp/{id}(id=${emp.getId()})}">编辑</a>
			<a class="btn btn-sm btn-danger" th:href="@{/deleteEmp/{id}(id=${emp.getId()})}">删除</a>
		</td>
	</tr>
	</tbody>
</table>

3.操作部分的请求
写法:

th:href="@{/toUpdateEmp/{id}(id=${emp.getId()})}"
th:href="@{/deleteEmp/{id}(id=${emp.getId()})}"
<td>
	<a class="btn btn-sm btn-primary" th:href="@{/toUpdateEmp/{id}(id=${emp.getId()})}">编辑</a>
	<a class="btn btn-sm btn-danger" th:href="@{/deleteEmp/{id}(id=${emp.getId()})}">删除</a>
</td>

9 员工CRUD

代码不一一展示了,有兴趣的可以在我的CSDN中查看源码:
链接: Java员工管理系统整合SpringBoot+mybatis实现完整版
下面只讲解一些注意的地方:

9.1 增加员工

添加员工的部门名的下拉列表必须先加载出来,修改员工也是如此

  • select的name属性为did
  • 用each遍历部门名
  • value设置为部门id
<div class="form-group">
	<label>department</label>
	<select class="form-control" name="did">
		<option th:each="dept:${departments}" th:text="${dept.getDname()}" th:value="${dept.getId()}"></option>
	</select>
</div>

9.2 删除员工

    @RequestMapping("/deleteEmp/{id}")
    public String deleteEmployee(@PathVariable("id") int id){
        employeeService.deleteEmployee(id);
        return "redirect:/emps";
    }

9.3 修改员工

数据回显

    @GetMapping("/toUpdateEmp/{id}")
    public String toUpdatePage(@PathVariable("id") int id,Model model){
        Employee employee = employeeService.queryEmployeeById(id);
        List<Department> departmentList = departmentService.getDepartmentList();
        System.out.println(employee);
        System.out.println(departmentList);
        model.addAttribute("employee",employee);
        model.addAttribute("departments",departmentList);
        return  "emp/update";
    }

修改

    @RequestMapping("/updateEmp")
    public String UpdateEmployee(Employee employee){
        employeeService.updateEmployee(employee);
        return "redirect:/emps";
    }

10 拦截器

10.1 登录拦截器

登录拦截器LoginHandlerInterceptor实现HandlerInterceptor 即可

HandlerInterceptor的三个方法:

public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
  • preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理
  • postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
  • afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面)

LoginHandlerInterceptor.java

  1. 判断用户session是否存在
  2. 不存在则请求转发回登录页面,并附上msg提示信息。不放行
  3. 存在则放行即可
package com.cycyong.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断有没有session即可
        Object attribute = request.getSession().getAttribute("loginUser");
        if (attribute==null){
            request.setAttribute("msg","没有权限,请先登录");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return false;//不放行
        }else{
            return true;//放行
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

在同时也可排除某些方法或变量允许通过,新建一个配置类让他去实现WebMvcConfigurer ,并重写addInterceptors方法即可

    // 自定义拦截器,并排除某些请求或资源
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**",
                        "/img/**");
//        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").
//                excludePathPatterns("/index.html","/","/user/login","/static/**");
    }

10.2 命名变换

在spring中,可能会有仅仅需要页面跳转而没有具体的业务逻辑的代码,如下所示
我们点击前端某处的时候跳转到登录或者注册的HTML页面,但是controller方法都是空的,仅仅return了一个页面

@GetMapping("/login.html")
    public String loginPage(){
        return "login";
}
@GetMapping("/reg.html")
public String regPage(){
    return "reg";
}

长此以往我们的controller中会有很多这样的空方法,为了避免这种问题,我们使用SpringMVC中的addViewController来实现与上相同的逻辑。
新建一个配置类让他去实现WebMvcConfigurer ,并重写addViewController方法,参数传入就是controller中的urlsetViewName中传入的参数就是原return的页面。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login.html").setViewName("login");
        registry.addViewController("/reg.html").setViewName("reg");
    }
}

这样子更符合开发实际!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cycyong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值