员工管理信息系统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
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>
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
- 控制层拿到
name
属性为username
和password
的两个值进行判断 password
正确之后创建用户Session
,并重定向到主页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提供了common
和fragment
来进行复用,把公共部分提取出来
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
- 判断用户
session
是否存在 - 不存在则请求转发回登录页面,并附上
msg
提示信息。不放行 - 存在则放行即可
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中的url
,setViewName
中传入的参数就是原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");
}
}
这样子更符合开发实际!