最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot實現(xiàn)WebMvcConfigurer接口定制mvc配置詳解

 更新時間:2023年09月20日 10:43:28   作者:CD4356  
這篇文章主要介紹了Springboot實現(xiàn)WebMvcConfigurer接口定制mvc配置詳解,spring?boot拋棄了傳統(tǒng)xml配置文件,通過配置類(標注@Configuration的類,@Configuration配置類相當于一個xml配置文件)以JavaBean形式進行相關(guān)配置,需要的朋友可以參考下

引言

spring boot拋棄了傳統(tǒng)xml配置文件,通過配置類(標注@Configuration的類,@Configuration配置類相當于一個xml配置文件)以JavaBean形式進行相關(guān)配置。

正常情況下,spring boot的自動配置可以滿足我們的大部分需求。但在保留spring boot提供的便利,又需要增加額外SpringMVC配置的時候,可以自定義一個配置類(標注@Configuration的類)并實現(xiàn)WebMvcConfigurer接口來定制SpringMvc配置

SpringBoot 1.5通過繼承WebMvcConfigurerAdapter抽象類來定制SpringMvc配置。SpringBoot 2.0后,WebMvcConfigurerAdapter抽象類過時了,改為實現(xiàn)WebMvcConfigurer接口來定制SpringMvc配置

/**
 * SpringBoot 1.5
 */	
@Configuration
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter {
}
-------------------------------------------------------------------------------------------
/**
 * SpringBoot 2.0
 */
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
}

WebMvcConfigurer接口源碼,具體可看WebMvcConfigurer官方文檔

package org.springframework.web.servlet.config.annotation;
import java.util.List;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.Formatter;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
/**
 * 采用JavaBean的形式代替?zhèn)鹘y(tǒng)的xml配置文件對Spring MVC進行定制
 */
public interface WebMvcConfigurer {
	//幫助配置HandlerMappings路徑匹配選項,例如尾部斜杠匹配,后綴注冊,路徑匹配器和路徑幫助器
	default void configurePathMatch(PathMatchConfigurer configurer) {
	}
	//配置內(nèi)容協(xié)商選項
	default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}
	//配置異步請求處理選項
	default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	}
	//通過轉(zhuǎn)發(fā)到Servlet容器的“默認” Servlet,配置處理程序以委派未處理的請求
	default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
	}
	//除了默認注冊的之外,還添加Converters和Formatters
	default void addFormatters(FormatterRegistry registry) {
	}
	//添加Spring MVC生命周期攔截器,以對控制器方法調(diào)用和資源處理程序請求進行預處理
	default void addInterceptors(InterceptorRegistry registry) {
	}
	//添加處理程序以從Web應用程序根目錄,類路徑等中的特定位置提供靜態(tài)資源,例如圖像,js和css文件
	default void addResourceHandlers(ResourceHandlerRegistry registry) {
	}
	//配置跨源請求處理
	default void addCorsMappings(CorsRegistry registry) {
	}
	//配置預先配置了響應狀態(tài)代碼和/或用于呈現(xiàn)響應主體的視圖的簡單自動化控制器
	default void addViewControllers(ViewControllerRegistry registry) {
	}
	//配置視圖解析器,以將從控制器返回的基于字符串的視圖名稱轉(zhuǎn)換為具體的View 實現(xiàn)以執(zhí)行渲染
	default void configureViewResolvers(ViewResolverRegistry registry) {
	}
	//添加解析器以支持自定義控制器方法參數(shù)類型
	default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
	}
	//添加處理程序以支持自定義控制器方法返回值類型
	default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
	}
	//配置HttpMessageConverters用于讀取或?qū)懭胝埱蠡蝽憫黧w的
	default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
	}
	//提供MessageCodesResolver用于從數(shù)據(jù)綁定和驗證錯誤代碼構(gòu)建消息代碼的自定義
	default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
	}
	//配置異常解析器
	default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
	}
	//擴展或修改默認配置的異常解析器列表
	default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
	}
	//提供MessageCodesResolver用于從數(shù)據(jù)綁定和驗證錯誤代碼構(gòu)建消息代碼的自定義
	default MessageCodesResolver getMessageCodesResolver() {
		return null;
	}
}

WebMvcConfigurer接口中定義了許多SpringMvc相關(guān)的方法,通過在配置類中重寫相應的方法即可定制相關(guān)的SpringMvc配置,下面我會挑幾個較常用的方法進行解析

自定義靜態(tài)資源映射 addResourceHandlers()

spring boot默認將 /** 靜態(tài)資源訪問映射到 classpath:/static/ 目錄下.

如果spring boot的默認配置不能滿足你的需求或你想修改它的默認配置,則可定義一個配置類來實現(xiàn)WebMvcConfigurer接口,并重寫它的addResourceHandlers()方法來定制靜態(tài)資源訪問映射訪問映射。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
    /**
     * 添加靜態(tài)資源訪問映射配置
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
        registry.addResourceHandler("/image/**").addResourceLocations("classpath:/static/image/");
        //意思是:url中讀取到/upload時,就會自動將/upload解析成D:/idea/java_workspace/image/upload
        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/idea/java_workspace/image/upload/");
        /**
         * Linux系統(tǒng)
         * registry.addResourceHandler("/upload/**").addResourceLocations("file:/home/image/upload/");
         */
    }
}
  • addResourceHandler(“xxx”) 用于指定對外暴露的訪問路徑;
  • addResourceLocations(“xxx”) 用于指定文件放置的目錄;

文件的放置目錄分兩種:項目內(nèi)部的文件 和 項目外部的文件;具體配置方式如下:

//配置內(nèi)部靜態(tài)資源文件訪問映射
registry.addResourceHandler("/image/**").addResourceLocations("classpath:/static/image/");
//配置外部靜態(tài)資源文件訪問映射(Windows系統(tǒng))
registry.addResourceHandler("/image/**").addResourceLocations("file:D:/idea/java_workspace/image/");
//配置外部靜態(tài)資源文件訪問映射(Linux系統(tǒng))
registry.addResourceHandler("/image/**").addResourceLocations("file:/home/image/");

友情提示:內(nèi)部靜態(tài)資源文件一般使用spring boot的默認配置即可(即:將 /** 靜態(tài)資源訪問映射到 classpath:/static/ 目錄);重寫addResourceHandlers()方法一般用來定制外部靜態(tài)資源的訪問映射。

攔截器 addInterceptors()

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
    /**
     * 添加攔截器鏈配置
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注冊攔截器1,對商家管理系統(tǒng)進行權(quán)限驗證
        InterceptorRegistration registration1 = registry.addInterceptor(new ShopAdminInterceptor());
        //指定攔截器1要攔截的請求(支持*通配符)
        registration1.addPathPatterns("/shop_admin/**");
        //注冊攔截器2,對超級管理員系統(tǒng)進行權(quán)限驗證
        InterceptorRegistration registration2 = registry.addInterceptor(new SuperAdminInterceptor());
        /*指定攔截器2要攔截的請求(支持*通配符)*/
        registration2.addPathPatterns("/super_admin/**");
        //指定攔截器2不攔截的請求(支持*通配符)
        registration2.excludePathPatterns("/super_admin/toLogin");
    }
}

自定義攔截器類1

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShopAdminInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲取用戶登陸信息
        Person person = (Person) request.getSession().getAttribute("person");
        //判斷用戶是否有權(quán)限進入商家管理后臺系統(tǒng)
        if(person != null && person.getUserId() > 0
                && person.getEnableStatus() == 1 && person.getPersonType() == 2){
            //如果驗證通過,則返回true,放行請求,即用戶接下來的操作可以正常執(zhí)行
            return true;
        }
        //如果不滿足登陸驗證,則跳轉(zhuǎn)到登陸頁面
        response.sendRedirect("/o2o/local/to_login");
        return false;
    }
}

自定義攔截器類2

import com.cd.o2o2.entity.Person;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SuperAdminInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲取用戶登陸信息
        Person person = (Person) request.getSession().getAttribute("person");
        //判斷用戶是否有權(quán)限進入超級管理員后臺系統(tǒng)
        if(person != null && person.getUserId() > 0
                && person.getEnableStatus() == 1 && person.getPersonType() == 3){
            //如果驗證通過,則返回true,放行請求,即用戶接下來的操作可以正常執(zhí)行
            return true;
        }
        //如果不滿足登陸驗證,則跳轉(zhuǎn)到登陸頁面
        response.sendRedirect("/o2o/local/to_login");
        return false;
    }
}

無業(yè)務邏輯頁面跳轉(zhuǎn) addViewControllers()

項目開發(fā)中,時常會涉及到無業(yè)務邏輯的頁面跳轉(zhuǎn); 這個頁面跳轉(zhuǎn)沒有涉及到任何的業(yè)務邏輯,只是單純的路由跳轉(zhuǎn)過程;但卻需要在Controller中編寫路由方法來完成,每一個頁面跳轉(zhuǎn)都需要定義一個路由方法,個人感覺是挺麻煩滴。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/frontend")
public class FrontendController {
    /**
     * 首頁路由
     */
    @RequestMapping("/index")
    private String index(){
        return "frontend/index";
    }
    /**
     * 店鋪列表路由
     */
    @RequestMapping("/to_shop_list")
    private String toShopList(){
        return "frontend/shop_list";
    }
    /**
     * 店鋪列表路由
     */
    @RequestMapping("/shop_detail")
    private String shopDetail(){
        return "frontend/shop_detail";
    }
}

SpringBoot中,可以通過重寫addViewControllers()方法來配置無業(yè)務邏輯的頁面跳轉(zhuǎn); 擺脫路由方法這個麻煩,當然你習慣使用路由方法來實現(xiàn)無業(yè)務邏輯的頁面跳轉(zhuǎn)也是沒問題滴哦.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
   	/**
     * 添加無業(yè)務邏輯頁面跳轉(zhuǎn)配置
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //首頁路由
        registry.addViewController("/frontend/index").setViewName("frontend/index");
        //店鋪列表路由
        registry.addViewController("/frontend/to_shop_list").setViewName("frontend/shop_list");
        //店鋪列表路由
        registry.addViewController("/frontend/shop_detail").setViewName("frontend/shop_detail");
    }
}

合而為一

package com.cd.o2o2.config.web;
import com.cd.o2o2.interceptor.ShopAdminInterceptor;
import com.cd.o2o2.interceptor.SuperAdminInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class SpringMvcConfiguration implements WebMvcConfigurer {
    /**
     * 添加靜態(tài)資源訪問映射配置
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    	//內(nèi)部靜態(tài)資資源訪問映射
        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");
        registry.addResourceHandler("/image/**").addResourceLocations("classpath:/static/image/");
       //外部靜態(tài)資資源訪問映射
        registry.addResourceHandler("/upload/**").addResourceLocations("file:D:/idea/java_workspace/image/upload/");
    }
    /**
     * 添加攔截器鏈配置
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注冊攔截器1,對商家管理系統(tǒng)進行權(quán)限驗證
        InterceptorRegistration registration1 = registry.addInterceptor(new ShopAdminInterceptor());
        //指定攔截器1要攔截的請求(支持*通配符)
        registration1.addPathPatterns("/shop_admin/**");
        //注冊攔截器2,對超級管理員系統(tǒng)進行權(quán)限驗證
        InterceptorRegistration registration2 = registry.addInterceptor(new SuperAdminInterceptor());
        //指定攔截器2要攔截的請求(支持*通配符)
        registration2.addPathPatterns("/super_admin/**");
    }
    /**
     * 添加無業(yè)務邏輯頁面跳轉(zhuǎn)配置
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //首頁路由
        registry.addViewController("/frontend/index").setViewName("frontend/index");
        //店鋪列表路由
        registry.addViewController("/frontend/to_shop_list").setViewName("frontend/shop_list");
        //店鋪列表路由
        registry.addViewController("/frontend/shop_detail").setViewName("frontend/shop_detail");
    }
}

到此這篇關(guān)于Springboot實現(xiàn)WebMvcConfigurer接口定制mvc配置詳解的文章就介紹到這了,更多相關(guān)WebMvcConfigurer接口配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)服務器巡查的代碼

    java實現(xiàn)服務器巡查的代碼

    接到上級領(lǐng)導任務,需要實現(xiàn)一個這樣的需求,一大批服務器,需要檢查服務器能否ping通,ssh密碼是否正常,以及檢查服務器的cpu,內(nèi)存,硬盤占用情況,下面通過java代碼實現(xiàn)服務器巡查功能,需要的朋友一起看看吧
    2021-12-12
  • java設(shè)計模式之委派模式原理分析

    java設(shè)計模式之委派模式原理分析

    這篇文章主要介紹了java設(shè)計模式之委派模式原理分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Springboot?Shiro?anno不啟作用問題及解決

    Springboot?Shiro?anno不啟作用問題及解決

    在Shiro配置中遇到靜態(tài)資源被攔截的問題,通過排除LinkedHashMap過濾次序和將過濾器手動創(chuàng)建而不是注冊到容器中解決,同時,確保JwtUtil類也不注冊到容器中,以避免請求報Not?authorized錯誤
    2026-03-03
  • IntelliJ?IDEA中初始化Java類的常用快捷方法詳解

    IntelliJ?IDEA中初始化Java類的常用快捷方法詳解

    這篇文章主要為大家詳細介紹了IntelliJ?IDEA中初始化Java類并設(shè)置所有屬性的常用快捷方法,文中的示例代碼講解詳細,需要的小伙伴可以參考下
    2026-02-02
  • Spring 實現(xiàn)給Bean屬性注入null值

    Spring 實現(xiàn)給Bean屬性注入null值

    這篇文章主要介紹了Spring 實現(xiàn)給Bean屬性注入null值的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot?2.x和3.x的核心區(qū)別詳解(這些變化你必須知道)

    SpringBoot?2.x和3.x的核心區(qū)別詳解(這些變化你必須知道)

    Spring Boot 3與Spring Boot 2之間存在多個方面的顯著區(qū)別,這些區(qū)別主要體現(xiàn)在Java版本依賴、模塊化支持、Web框架、技術(shù)棧和依賴項更新、功能增強和改進等方面,這篇文章主要介紹了SpringBoot?2.x和3.x核心區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • 全面解讀Java?NIO(看這篇就夠了)

    全面解讀Java?NIO(看這篇就夠了)

    Java?NIO是Java1.4之后推出來的一套IO接口,NIO提供了一種完全不同的操作方式,?NIO支持面向緩沖區(qū)的、基于通道的IO操作,這篇文章主要介紹了Java?NIO詳解(看這篇就夠了),需要的朋友可以參考下
    2023-05-05
  • 一文帶你掌握java8中的reduce操作

    一文帶你掌握java8中的reduce操作

    reduce?操作是一種通用的歸約操作,它可以實現(xiàn)從?Stream?中生成一個值,其生成的值不是隨意的,而是根據(jù)指定的計算模型,下面我們就來深入了解下java8中的reduce操作吧
    2023-12-12
  • 最全總結(jié)SpringBean的作用域管理

    最全總結(jié)SpringBean的作用域管理

    今天給大家詳細總結(jié)了SpringBean的作用域管理,文中有非常詳細的圖文介紹以及代碼示例,對正在學習java的小伙伴們還很有幫助,需要的朋友可以參考下
    2021-05-05
  • 每日幾道java新手入門面試題,通往自由的道路

    每日幾道java新手入門面試題,通往自由的道路

    這篇文章主要為大家分享了最有價值的是幾道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對hashCode方法的設(shè)計、垃圾收集的堆和代進行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

和平区| 吉木萨尔县| 德惠市| 乌鲁木齐市| 白山市| 赤峰市| 高邮市| 饶河县| 巴林左旗| 富锦市| 永吉县| 旅游| 桂平市| 长垣县| 邵武市| 宜兰县| 北海市| 桦甸市| 吴堡县| 无棣县| 九台市| 泸溪县| 哈密市| 丰县| 林芝县| 海宁市| 柯坪县| 高州市| 东光县| 澄城县| 平湖市| 乐安县| 乌鲁木齐市| 和平区| 鸡东县| 福安市| 黔西县| 高陵县| 连南| 阿尔山市| 大足县|