文章目录
零、学习目标
- 了解Spring Boot中Spring MVC自动配置
- 掌握Spring Boot中Spring MVC功能扩展和定制
在Web开发中,会涉及到静态资源的访问支持、视图解析器的配置、转换器和格式化器的定制、文件上传下载等功能,甚至还需要考虑到与Web服务器关联的Servlet相关组件的定制,Spring Boot框架支持整合一些常用Web框架从而实现Web开发,并默认支持Web开发中的一些通用功能。
一、Spring MVC 自动配置
(一)自动配置概述
在Spring Boot项目中,一旦引入了Web依赖启动器spring-boot-starter-web
,那么Spring Boot整合Spring MVC框架默认实现的一些XxxAutoConfiguration
自动配置类就会自动生效,几乎可以在无任何额外配置的情况下进行Web开发。
(二)Spring Boot整合Spring MVC 的自动化配置功能特性
- 内置了两个视图解析器:
ContentNegotiatingViewResolver
和BeanNameViewResolver
; - 支持静态资源以及
WebJars
; - 自动注册了转换器和格式化器;
- 支持Http消息转换器;
- 自动注册了消息代码解析器;
- 支持静态项目首页
index.html
; - 支持定制应用图标
favicon.ico
; - 自动初始化Web数据绑定器
ConfigurableWebBindingInitializer
。
二、Spring MVC 功能拓展实现
(一)创建Spring Boot项目 - SpringMvcDemo2021
- 使用Spring Initializr方式创建Spring Boot项目,并在Dependencies依赖选择中选择Web依赖启动器和Thymeleaf依赖启动器
(二)改造当前项目 - 移植上一讲项目的内容
- 复制第10讲案例【Thymeleaf18N】的html模板文件,国际化配置文件,全局配置文件和相关Java文件(除入口文件)到当前项目的相应位置
- 启动应用,查看是否成功
- 访问登录页面 - http://localhost:8080/toLoginPage
- 访问显示全部用户页面 - http://localhost:8080/allUsers
(三)写MVC配置文件,定义视图跳转
1、注释掉控制器LoginController的toLoginPage()方法上的注解
2、实现接口WebMvcConfigurer,并重写addViewControllers方法
package net.hw.lesson11.config;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import sun.misc.Contended;
/**
* 功能:自定义MVC配置
* 作者:华卫
* 日期:2021年02月27日
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 添加视图控制器
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 当通过login.html访问时,直接跳转到login视图对应的页面,即login.html页面
registry.addViewController("login.html").setViewName("login");
// 通过toLoginPage访问时,也直接跳转到视图名login对应的页面,login.html页面
registry.addViewController("toLoginPage").setViewName("login");
}
}
- 注意:自定义MVC配置类一定要添加注解
@Configuration
- 说明:toLoginPage()方法里通过model设置了属性
currentYear
,会在跳转到登录页面传递给前端,但是直接通过刚才定义的视图控制器来跳转,就没有数据的传递,因此,得修改登录页面代码,暂时不要显示年份,以免程序报错。
3、修改登录页面,注释掉显示年份的代码
3、启动应用,测试效果
- 访问
http://localhost:8080/toLoginPage
- 访问
http://localhost:8080/login.html
- 两种方式都可跳转到login.html页面,当然此时都没有显示年份。
(四)编写拦截器,让登录页面显示年份
拦截器作用,就是在访问请求前或后进行相关的处理,比如访问资源前判断用户是否登录,如果登录则可以访问,否则不能进行访问。本案例是在访问请求后获取当年年份数据,带到登录页面去显示出来。
1、实现接口HandlerInterceptor,并实现postHandle()方法
- 说明:请求前要处理就得重写preHandle()方法,请求后要处理就得重写postHandle()方法,请求完成之后要处理就得重写afterCompletion()方法
package net.hw.lesson11.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
/**
* 功能:自定义拦截器
* 作者:华卫
* 日期:2021年02月27日
*/
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
}
}
2、在MyMvcConfig重写addInterceptors()方法,加载自定义拦截器
扫描二维码关注公众号,回复:
12610699 查看本文章
3、修改登录页面,取消显示年份的注释
- 编译会报错,说无法解析
currentYear
,不用管它,因为数据不是来自控制器,而是来自拦截器,要运行时请求后才能获取数据,因此编译会报错。
4、启动应用,测试效果
- 访问
http://localhost:8080/toLoginPage
- 访问
http://localhost:8080/login.html
- 两种方式都可以显示出年份,说明自定义拦截器中的postHandle()生效了。
(五)编写登录拦截器,防止非登录用户查看全部用户信息
- 要求未登录用户不能查看用户信息,但是定义拦截器前,通过路径
http://localhost:8080/allUsers
是可以看到所有用户信息的。
1、还原登录控制器中的toLoginPage方法的注解
2、在自定义MVC配置中注释掉相应的视图控制器
3、在登录控制里修改login()方法
4、在自定义拦截器里重写preHandle()方法
- 拦截非登录用户,直接重定向到登录页面,强制其登录
5、在自定义MVC配置文件里排除不能拦截的路径
6、启动应用,测试效果
- 未登录前,访问
http://localhost:8080/allUsers
,直接跳转到登录页面。登录成功后,才可以查看全部用户信息。