Spring Boot管理Spring MVC

Spring Boot真正的核心功能是自动配置和快速整合,通常Spring Boot应用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web启动器嵌入了Spring MVC的依赖,并为Spring MVC提供了大量自动配置,可以适用于大多数Web开发场景。 除了使用自动配置所提供的功能,开发者也可以通过自定义配置类定制Spring MVC的配置。

Spring Boot为Spring MVC自动配置提供的特性

在Spring Boot项目中,一旦引入了Web依赖启动器spring-boot-starter-web,那么Spring Boot整合Spring MVC框架默认实现的一些XxxAutoConfiguration自动配置类就会自动生效,几乎可以在无任何额外配置的情况下进行Web开发。

Spring Boot为Spring MVC提供了自动配置,并在Spring MVC默认功能的基础上添加了以下特性。

(1)引入了视图解析器 ContentNegotiatingViewResolver和BeanNameViewResolver。

(2)为包括WebJars在内的静态资源提供支持。

(3)自动注册 Converter、GenericConverter和Formatter。

(4)支持使用HttpMessageConverters消息转换器。

(5)自动注册 MessageCodesResolver。

(6)支持静态项目首页index.html。

(7)支持定制应用图标favicon.ico。

(8)自动初始化Web数据绑定器ConfigurableWebBindingInitializer。

自定义Spring MVC配置

在Spring Boot应用中使用Spring MVC时,如果希望在为Spring MVC自动配置提供相关特性的同时,再增加一些自定义的Spring MVC配置,例如添加拦截器、视图控制器等,可以通过自定义WebMvcConfigurer类型的配置类来实现。

1.配置静态资源映射

通常Web应用中会需要使用静态资源,例如,JavaScript文件、CSS文件和HTML文件等。单独使用Spring MVC时,导入静态资源文件后,需要配置静态资源的映射,否则无法正常访问。Spring Boot中提供了默认的静态资源映射,当访问项目中任意的静态资源时,Spring Boot会默认从以下路径中从上往下进行查找:

(1)classpath:/META-INF/resources/

(2)classpath:/resources/

(3)classpath:/static/

(4)classpath:/public/

这个查找顺序可以通过源码查看:WebMvcAutoConfiguration--》搜索getStaticLocations--》进入该方法--》寻着轨迹就能找到。

修改静态资源存放位置:

spring.resources.static-locations=字符串数组

例如:

在chapter03项目中的 src/main/resources/static和 src/main/resources目录下分别创建main.html文件和index.html文件,并在项目启动后分别在浏览器中对这两个静态资源进行访问。

如果想访问非默认静态资源文件夹下的资源,可以通过配置类和配置文件2种方式实现自定义静态资源的映射。

(1)通过配置类实现静态资源映射

配置类需要实现WebMvcConfigurer接口,在重写该接口的addResourceHandlers()方法中指定资源访问路径和资源之间的映射关系。

(2)通过配置文件实现静态资源映射

Spring Boot在Spring MVC的自动配置中提供了对应的属性可以配置静态资源访问路径和资源的映射。

下面以通过配置类实现静态资源映射为例,演示配置静态资源映射。

(1)创建静态资源。

在src/main/resources目录下,创建文件夹backend,并在文件夹中创建HTML文件index.html和login.htm。

(2)配置静态资源映射。

在config子包下创建配置类WebMvcConfig,该配置类实现WebMvcConfigurer接口,并重写该接口的方法实现自定义Spring MVC的配置,具体如文件3-11所示。

java 复制代码
import  org.springframework.context.annotation.Configuration;
import  org.springframework.web.servlet.config.annotation.
ResourceHandlerRegistry;
import  org.springframework.web.servlet.config.annotation.
WebMvcConfigurer;
@Configuration
public  class  WebMvcConfig implements  WebMvcConfigurer {

    @Override
    public  void  addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/backend/**")
                .addResourceLocations("classpath:/backend/");
    }

}

(3)测试程序效果。启动项目,在浏览器中访问backend文件夹下的index.html。

2.配置视图控制器

使用Spring MVC默认的配置进行开发时,如果仅实现无业务逻辑的页面跳转,也需要创建Controller类,然后定义方法跳转到页面,操作比较麻烦。对此,可以在视图控制器中添加自定义的映射,直接将请求映射为视图。

下面通过案例演示在视图控制器中配置请求和视图的映射,具体如下。

(1)配置视图控制器映射信息。在文件3-11中重写WebMvcConfigurer接口的addViewControllers()方法,在该方法中添加访问路径和视图的映射。

java 复制代码
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    /*如果在thymeleaf中会出错,因为配置了前缀和后缀,
     *视图名"/backend/login.html"加上前缀后缀后,这个地址肯定不存在,
     *直接写逻辑视图名即可
    */	    
   //registry.addViewController("/backend/toLoginPage").setViewName("/backend/login.html");
	//registry.addViewController("/backend").setViewName("/backend/index.html");
   
    //在thymeleaf环境下访问模板页面
    registry.addViewController("/backend/toLoginPage2").setViewName("login");
    registry.addViewController("/backend").setViewName("index");
}

(2)测试程序效果。启动项目,在浏览器中访问http://localhost:8080/backend/toLoginPage2。

总结:只适合较为简单的无参数get请求跳转,对于有参数或者需要业务处理的跳转需求,最好采用传统方式。

3.配置拦截器

拦截器可以根据请求的URL对请求进行拦截,主要应用于登录校验、权限验证、乱码解决、性能监控和异常处理等方面。在Spring Boot项目中配置拦截器也非常简单,只需要定义拦截器和注册拦截器即可。

拦截过程

下面通过案例演示在Spring Boot项目中配置拦截器。

(1)定义拦截器。创建interceptor子包,在该包下创建拦截器类,该类实现了 HandlerInterceptor接口,并重写了接口的preHandle()方法,具体如文件3-12所示。

java 复制代码
@Component
public class LoginInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 获取请求路径
        String requestURI = request.getRequestURI();
        // 获取登录用户
        Object loginUser = request.getSession().getAttribute("loginUser");
        // 如果请求路径是"/backend"开头的,并且用户没有登录,
        //那么将请求重定向到登录页面或者内部转发
        if (requestURI.startsWith("/backend") && loginUser == null) {
            response.sendRedirect("/toLoginPage");
            //request.getRequestDispatcher("/toLoginPage").forward(request,response);
            return false;
        }
        return true;
    }

}

(2)注册拦截器。

在文件3-11中重写WebMvcConfigurer接口的addInterceptors()方法,在该方法中添加拦截器。

java 复制代码
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(loginInterceptor)
                 .addPathPatterns("/**")
                                 .excludePathPatterns("/toLoginPage");
    }

(3)效果测试

重启项目,启动成功后,在浏览器上访问http://localhost:8080/backend

动手试一试

不拦截静态资源,比如图片,css 。

相关推荐
caihuayuan537 分钟前
Vue生命周期&脚手架工程&Element-UI
java·大数据·spring boot·后端·课程设计
MaCa .BaKa2 小时前
37-智慧医疗服务平台(在线接诊/问诊)
java·vue.js·spring boot·tomcat·vue·maven
八股文领域大手子2 小时前
Spring Boot Controller 如何处理HTTP请求体
java·开发语言·sql·spring·spring cloud
tanxiaomi2 小时前
Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解
java·spring boot·mybatis
小刘|2 小时前
Spring,SpringMVC,SpringBoot,SpringCloud的区别
spring boot·spring·spring cloud
明月与玄武3 小时前
Spring Boot中的拦截器!
java·spring boot·后端
为美好的生活献上中指3 小时前
java每日精进 5.07【框架之数据权限】
java·开发语言·mysql·spring·spring cloud·数据权限
菲兹园长4 小时前
SpringBoot统一功能处理
java·spring boot·后端
一刀到底2114 小时前
spring ai alibaba 使用 SystemPromptTemplate 很方便的集成 系统提示词
spring·ai alibaba
lyrhhhhhhhh5 小时前
Spring框架(1)
java·后端·spring