日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring MVC核心擴展點及使用技巧總結和使用案例

來源: 責編: 時間:2024-02-01 12:46:37 216觀看
導讀環境:SpringBoot2.7.121. 啟用Spring MVC功能@Configuration@EnableWebMvcpublic class WebConfig {}2. 類型轉換配置如需要自定義數據類型的轉換,可以通過如下方式注冊@Configurationpublic class WebConfig implement

環境:SpringBoot2.7.12xrF28資訊網——每日最新資訊28at.com

1. 啟用Spring MVC功能

@Configuration@EnableWebMvcpublic class WebConfig {}

xrF28資訊網——每日最新資訊28at.com

2. 類型轉換配置

如需要自定義數據類型的轉換,可以通過如下方式注冊xrF28資訊網——每日最新資訊28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {    @Override  public void addFormatters(FormatterRegistry registry) {    registry.addConverterFactory(new ConverterFactory<String, Number>() {      @Override      public <T extends Number> Converter<String, T> getConverter(Class<T> targetType) {        return new Converter<String, T>() {          public T convert(String source) {            return (T) Integer.valueOf(source) ;          }        } ;      }    });  }  }

xrF28資訊網——每日最新資訊28at.com

以上添加了從String到Integer的轉換(這里只是舉例,系統默認已經有了從String到Number的轉換器)。每種轉換器最終被包裝成ConvertersForPair對象,該對象中有個隊列保存了所有的轉換器。后添加的添加到首位,如下:xrF28資訊網——每日最新資訊28at.com

private static class ConvertersForPair {    private final Deque<GenericConverter> converters = new ConcurrentLinkedDeque<>();    public void add(GenericConverter converter) {      this.converters.addFirst(converter);    }}

xrF28資訊網——每日最新資訊28at.com

所有如你有自定義的轉換器,自定義的優先級比系統自帶的要高。xrF28資訊網——每日最新資訊28at.com

3. 數據驗證

默認情況下,如果類路徑上存在 Bean Validation(例如 Hibernate Validator),則 LocalValidatorFactoryBean 會被注冊為全局 Validator,與控制器方法參數上的 @Valid 和 Validated 一起使用。xrF28資訊網——每日最新資訊28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  public Validator getValidator() {    return new LocalValidatorFactoryBean();  }}

xrF28資訊網——每日最新資訊28at.com

4. 請求攔截器xrF28資訊網——每日最新資訊28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(new HandlerInterceptor() {      @Override      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)          throws Exception {        if (request.getHeader("token") == null) {          return false ;        }        return true ;      }    }).addPathPatterns("/**") ;  }}

xrF28資訊網——每日最新資訊28at.com

上面配置了一個攔截任意請求的攔截器,在請求到達時會先驗證請求header中token是否為null。xrF28資訊網——每日最新資訊28at.com

xrF28資訊網——每日最新資訊28at.com

攔截器并不適合作為安全層,因為它有可能與控制器Controller路徑匹配不匹配,而Controller路徑匹配還可以透明地匹配尾部斜線和路徑擴展名以及其他路徑匹配選項。其中許多選項已被棄用,但仍有可能出現不匹配。一般情況下,我們建議使用 Spring Security,它包含一個專用的 MvcRequestMatcher,可與 Spring MVC 路徑匹配保持一致,還具有安全防火墻,可阻止 URL 路徑中許多不需要的字符。xrF28資訊網——每日最新資訊28at.com

xrF28資訊網——每日最新資訊28at.com

5. 請求內容類型

自定義Spring MVC 如何從請求中確定所請求的媒體類型(例如,接受頭、URL 路徑擴展、查詢參數等)。xrF28資訊網——每日最新資訊28at.com

默認情況下,只選中"Accept" header。xrF28資訊網——每日最新資訊28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  @Override  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {    // 這樣配置后,視圖技術就能夠根據你請求的Accept輸出指定的文件內容了    configurer.mediaType("yaml", new MediaType("application", "yaml")) ;  }}

上面的配置最終是對ContentNegotiationManager對象進行添加MappingMediaTypeFileExtensionResolver文件擴展解析器。xrF28資訊網——每日最新資訊28at.com

@Beanpublic ContentNegotiationManager mvcContentNegotiationManager() {  if (this.contentNegotiationManager == null) {    ContentNegotiationConfigurer configurer = new ContentNegotiationConfigurer(this.servletContext);    configurer.mediaTypes(getDefaultMediaTypes());    configureContentNegotiation(configurer);    this.contentNegotiationManager = configurer.buildContentNegotiationManager();  }  return this.contentNegotiationManager;}protected ContentNegotiationManager buildContentNegotiationManager() {  this.factory.addMediaTypes(this.mediaTypes);  return this.factory.build();}

部分代碼xrF28資訊網——每日最新資訊28at.com

public class ContentNegotiationManagerFactoryBean {  public ContentNegotiationManager build() {    if (!CollectionUtils.isEmpty(this.mediaTypes) && !this.favorPathExtension && !this.favorParameter) {      this.contentNegotiationManager.addFileExtensionResolvers(          new MappingMediaTypeFileExtensionResolver(this.mediaTypes));    }  }}

有了MappingMediaTypeFileExtensionResolver解析器后,還需要Controller接口返回ModelAndView對象。如下接口xrF28資訊網——每日最新資訊28at.com

@GetMapping("/contentType")public ModelAndView contentType() {  return new ModelAndView("test") ;}

xrF28資訊網——每日最新資訊28at.com

在classpath下新建test.yaml文件,內容隨意。有了這些還不夠,我們需要能夠解析處理*.yaml的文件。所以還需要視圖解析器xrF28資訊網——每日最新資訊28at.com

@Componentpublic class YamlViewResolver implements ViewResolver {  @Override  public View resolveViewName(String viewName, Locale locale) throws Exception {    if (!viewName.endsWith(".yaml")) {      return null ;    }    return new View() {      // 支持的類型      public String getContentType() {        return "application/yaml" ;      };      @Override      public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {        ClassPathResource resource = new ClassPathResource(viewName) ;        InputStream is = resource.getInputStream() ;                OutputStream outputStream = response.getOutputStream();          byte[] buffer = new byte[4096];          int bytesRead = -1;          while ((bytesRead = is.read(buffer)) != -1) {            outputStream.write(buffer, 0, bytesRead);          }          outputStream.flush() ;          is.close();          outputStream.close() ;      }    } ;  }}

有了這些我們配置Spring MVC才能正確的輸出我們所需要的文件內容。這個功能是不是太麻煩了,沒撒用

本文鏈接:http://www.www897cc.com/showinfo-26-70401-0.htmlSpring MVC核心擴展點及使用技巧總結和使用案例

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 項目明明部署成功了, BUG 怎么還在啊?產品急了

下一篇: 別瞎寫工具類了,Spring自帶的不香嗎?

標簽:
  • 熱門焦點
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top 主站蜘蛛池模板: 漳平市| 城步| 龙门县| 张北县| 南丹县| 扎鲁特旗| 望都县| 深州市| 会东县| 大田县| 沁阳市| 白水县| 广丰县| 石泉县| 苏州市| 北流市| 碌曲县| 晋中市| 卓尼县| 精河县| 吉水县| 海安县| 额尔古纳市| 永福县| 黔西县| 资兴市| 石城县| 桐柏县| 永嘉县| 城市| 德昌县| 阿城市| 乌恰县| 盐亭县| 宝山区| 苗栗县| 长丰县| 隆昌县| 宜兰市| 霍林郭勒市| 鹤壁市|