精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發 前端
一種從基于資源的位置列表中提供靜態資源的便捷方法。如下如果請求以 /resources 開頭,則會使用相對路徑查找并提供網絡應用程序根目錄下 /public 或類路徑中 /static 下的靜態資源。

環境:SpringBoot2.7.12

1. 啟用Spring MVC功能

@Configuration
@EnableWebMvc
public class WebConfig {
}

2. 類型轉換配置

如需要自定義數據類型的轉換,可以通過如下方式注冊

@Configuration
public 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) ;
          }
        } ;
      }
    });
  }
  
}

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

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

所有如你有自定義的轉換器,自定義的優先級比系統自帶的要高。

3. 數據驗證

默認情況下,如果類路徑上存在 Bean Validation(例如 Hibernate Validator),則 LocalValidatorFactoryBean 會被注冊為全局 Validator,與控制器方法參數上的 @Valid 和 Validated 一起使用。

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

4. 請求攔截器

@Configuration
public 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("/**") ;
  }
}

上面配置了一個攔截任意請求的攔截器,在請求到達時會先驗證請求header中token是否為null。

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

5. 請求內容類型

自定義Spring MVC 如何從請求中確定所請求的媒體類型(例如,接受頭、URL 路徑擴展、查詢參數等)。

默認情況下,只選中"Accept" header。

@Configuration
public class WebConfig implements WebMvcConfigurer {


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

上面的配置最終是對ContentNegotiationManager對象進行添加MappingMediaTypeFileExtensionResolver文件擴展解析器。

@Bean
public 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();
}

部分代碼

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對象。如下接口

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

在classpath下新建test.yaml文件,內容隨意。有了這些還不夠,我們需要能夠解析處理*.yaml的文件。所以還需要視圖解析器

@Component
public 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才能正確的輸出我們所需要的文件內容。這個功能是不是太麻煩了,沒撒用??。

6. 自定義消息轉換器

現希望將對象轉換為YAML個數的數據進行輸出,我們可以配置自定義的HttpMessageConverter進行轉換輸出。

public class YamlHttpMessageConverter implements HttpMessageConverter<Object> {


  @Override
  public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    return User.class.isAssignableFrom(clazz) ;
  }


  @Override
  public List<MediaType> getSupportedMediaTypes() {
    return Arrays.asList(new MediaType("application", "yaml")) ;
  }


  @Override
  public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
      throws IOException, HttpMessageNotWritableException {
    StreamUtils.copy(new org.yaml.snakeyaml.Yaml().dump(t), StandardCharsets.UTF_8, outputMessage.getBody()) ;
  }


}

注冊上面的轉換器

@Configuration
public class WebConfig implements WebMvcConfigurer {
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    // 注意這里已定義指定位置,不然就被json輸出了
    converters.add(0, new YamlHttpMessageConverter()) ;
  }
}

測試接口

@GetMapping("/yaml")
public Object yaml() {
  return new User(10, "zhangsan") ;
}

輸出結果

圖片圖片

7. 視圖控制器

一種快捷定義視圖Controller接口的方式

@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    // 當訪問/index時將直接輸出test視圖內容
    registry.addViewController("/index").setViewName("test") ;
  }
}

這里為了簡單直接使用BeanNameViewReolver技術,自定義一個以test為名的View Bean對象

@Component("test")
public class PackView implements View {
  @Override
  public String getContentType() {
    return "text/html" ;
  }
  @Override
  public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
    response.getWriter().print("View Controllers") ;
  }
}

輸出

圖片圖片

8. 視圖解析器

可以通過上面案例5中定義的YamlViewResolver注冊方式,也可以通過如下方式注冊

@Configuration
public class WebConfig implements WebMvcConfigurer {
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.viewResolver(new YamlViewResolver()) ;
  }
}

這樣注冊的解析器,都會添加到ViewResolverComposite這個解析器集合中。

9. 靜態資源配置

一種從基于資源的位置列表中提供靜態資源的便捷方法。如下如果請求以 /resources 開頭,則會使用相對路徑查找并提供網絡應用程序根目錄下 /public 或類路徑中 /static 下的靜態資源。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {


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

以上是本篇文章的所有內容,希望對你有幫助。

完畢?。?!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2009-12-04 15:43:03

PHP JSON擴展

2025-05-23 10:38:43

2011-12-05 13:44:34

JavaSpringMVC

2023-09-28 08:49:41

springBean

2017-04-28 08:32:40

Spring BootDubbo Activ使用

2017-05-09 10:34:21

Spring BootDubbo Activ擴展

2020-03-06 18:43:58

Spring MVC控制器Java

2017-05-08 08:20:34

False注入MySQLSQL注入

2021-10-31 19:39:11

注解Spring 核心類

2022-01-05 08:53:13

Spring原理分析MVC

2020-01-16 18:30:07

技術SQL優化

2009-09-27 14:01:29

Spring MVC

2023-11-24 08:00:00

2015-08-24 08:59:13

Git技巧

2013-06-07 14:35:19

Mac OS X

2009-08-13 18:00:48

Eclipse重構功能擴展點

2019-05-09 09:35:17

Spring Boot技術開發

2021-04-12 06:09:38

Spring擴展點應用

2025-04-18 05:50:59

Spring接口Aware
點贊
收藏

51CTO技術棧公眾號

av一本久道久久综合久久鬼色| 欧美丰满日韩| 色综合久久综合| 日本午夜精品一区二区三区| 中文字幕欧美在线观看| 91精品国产乱码久久久久久久| 欧美xxxxxxxxx| 亚洲中文字幕无码不卡电影| 精品欧美色视频网站在线观看| 国产91露脸合集magnet| 57pao成人永久免费视频| 91麻豆制片厂| 岛国精品一区| 欧美日韩国产高清一区| 丁香六月激情婷婷| av网站在线免费观看| 国产精品77777| 国产精品wwww| 日本一级二级视频| 精品国产乱码久久久| 日韩天堂在线观看| 91热这里只有精品| 黄色在线免费观看网站| 最好看的中文字幕久久| 欧美在线播放一区二区| 亚洲欧美国产高清va在线播放| 蜜桃av噜噜一区二区三区小说| 欧美精品第一页在线播放| 国产精品国产三级国产专业不 | 国产毛片一区二区三区| 欧美一区二区三区四区在线观看 | 波兰性xxxxx极品hd| 精品网站aaa| 欧美一区二区三区四区在线观看| 日本美女高潮视频| 国产高潮在线| 亚洲二区在线视频| 妞干网这里只有精品| 国产在线播放av| 99精品久久久久久| 99porn视频在线| 国产又粗又黄又爽| 免费精品视频在线| 国产极品精品在线观看| a v视频在线观看| 黄色成人av网站| 久热精品视频在线免费观看| 免费看成人片| 亚洲女人18毛片水真多| 狠狠色伊人亚洲综合成人| 国产精品成人国产乱一区| 国产午夜免费福利| 亚洲三级国产| 96精品视频在线| 日本va欧美va国产激情| 亚洲经典在线看| 韩剧1988免费观看全集| 国产真实乱人偷精品视频| 欧美日韩精品一本二本三本| 美女少妇精品视频| 97成人资源站| 午夜精品999| 精品粉嫩超白一线天av| 在线黄色免费看| 四虎国产精品成人免费影视| 欧美日韩国产在线播放网站| 91制片厂毛片| 祥仔av免费一区二区三区四区| 欧美日韩一本到| 999久久久精品视频| 成人超碰在线| 亚洲国产精品自拍| 国产九九九九九| 中文不卡1区2区3区| 一本久久a久久免费精品不卡| 日本一区二区黄色| 日日av拍夜夜添久久免费| 在线欧美一区二区| 男生操女生视频在线观看| 高清欧美日韩| 日韩一级高清毛片| 国产精品成人无码专区| 欧美日韩xxxx| www.日韩视频| 日本特黄特色aaa大片免费| 亚洲美洲欧洲综合国产一区| 日本电影亚洲天堂| 一区二区三区精| 国产69精品一区二区亚洲孕妇| 国产在线精品日韩| 国产日产精品久久久久久婷婷| 国产真实精品久久二三区| 91香蕉国产在线观看| 人人妻人人澡人人爽久久av| 久久久综合精品| 中国人体摄影一区二区三区| 91九色在线播放| 在线中文字幕一区二区| 黄色一级片免费播放| 欧美绝顶高潮抽搐喷水合集| 国产一区二区三区在线视频| 欧美特级一级片| 亚欧美中日韩视频| 国产日韩在线免费| 熟妇人妻一区二区三区四区| 亚洲婷婷久久综合| 日本在线中文字幕一区| 中文字幕无线精品亚洲乱码一区 | 国产调教精品| 国产亚洲精品美女久久久久| 日本中文字幕有码| 伊人成综合网yiren22| 日韩性生活视频| 日韩av男人天堂| 久久精品国产一区二区三区免费看| 超碰在线观看97| 国产在线高清| 欧美日韩国产精品一区| 五月激情婷婷在线| 久草成人资源| 高清一区二区三区日本久| ,一级淫片a看免费| 久久日一线二线三线suv| 欧美一二三不卡| 亚洲狼人综合| 在线成人激情黄色| youjizz在线视频| 成人网在线播放| 日韩a级黄色片| 免费日韩成人| 69成人精品免费视频| 精品人妻少妇嫩草av无码| 欧美三级不卡| 亚洲自拍偷拍一区| av免费观看一区二区| 黑人巨大精品欧美一区二区一视频 | 欧美性xxxx图片| 亚洲性人人天天夜夜摸| 91九色视频在线观看| 看黄网站在线| 欧美日韩国产综合视频在线观看 | 亚洲欧美日韩一区二区| 中文字幕国产传媒| 国产综合久久久| 日本久久精品视频| 涩爱av在线播放一区二区| 亚洲国产中文字幕在线视频综合| 性生活一级大片| 91精品蜜臀一区二区三区在线| 国产精品一区二区久久| 国产区在线视频| 欧洲精品一区二区三区在线观看| 国产美女精品久久| 久久高清一区| 欧美综合77777色婷婷| 亚洲精品福利电影| 亚洲精品有码在线| 中文字幕在线天堂| 欧美国产日韩精品免费观看| 欧美精品成人网| 色777狠狠狠综合伊人| 国产精品一区二区三| 日本三级视频在线观看| 在线播放日韩导航| 天天做夜夜爱爱爱| 国产精品一区二区视频| 久久av高潮av| 激情亚洲另类图片区小说区| 91国内在线视频| 奇米影视888狠狠狠777不卡| 91搞黄在线观看| 久久日免费视频| 国产一区视频网站| av在线com| 亚洲精品亚洲人成在线| 国产精品偷伦一区二区| 亚洲精品天堂| 亚洲精品国产精品自产a区红杏吧| 丰满少妇乱子伦精品看片| 日韩福利电影在线| 夜夜爽99久久国产综合精品女不卡| 日韩在线你懂得| 久久久综合免费视频| 免费观看成年在线视频网站| 精品视频一区三区九区| 精品爆乳一区二区三区无码av| 波多野结衣中文一区| 国产麻花豆剧传媒精品mv在线| 成人一区不卡| 国产精品自拍首页| 日韩经典一区| 欧美精品久久久久久久免费观看| 黄色在线观看网| 日韩亚洲欧美综合| 免费黄色网址在线| 亚洲视频在线一区二区| 亚洲中文字幕一区| 免费成人av在线| 欧美男女爱爱视频| 色135综合网| 九九久久99| 国产精品高清一区二区| 欧美亚洲视频在线观看| 欧美成人hd| 亚洲精品一区二区三区婷婷月| 99久久精品免费看国产交换| 欧美日韩亚洲系列| 少妇久久久久久被弄高潮| 久久男人中文字幕资源站| 欧美色图校园春色| 日本系列欧美系列| 亚洲熟妇无码一区二区三区| 欧美gayvideo| 欧美成人综合一区| 伊人久久噜噜噜躁狠狠躁| 国产精品网站大全| 伊人网在线播放| 久久久久久久久久久网站| av网站在线免费观看| 亚洲欧美另类中文字幕| 亚洲美女综合网| 51精品视频一区二区三区| 波多野结衣高清视频| 欧美日韩一区二区三区| 欧美xxxx在线观看| www.99re7| 国产精品久久久久久亚洲伦| 一卡二卡三卡四卡| 成人在线视频首页| 精产国品一区二区三区| 久久99这里只有精品| 国产三级三级三级看三级| 国产日韩欧美三区| 97超碰人人澡| 精品9999| 麻豆tv在线播放| 欧美三区视频| av电影一区二区三区| 欧美激情欧美| 在线播放豆国产99亚洲| 日韩欧美一区免费| 婷婷久久青草热一区二区| 最新国产一区| 欧美另类一区| 欧美猛男做受videos| 免费一区二区三区在在线视频| 加勒比久久高清| 久久精品国产第一区二区三区最新章节 | 中文字幕第31页| 欧美色男人天堂| 亚洲在线免费观看视频| 欧美性猛交xxxxxxxx| 精品国产青草久久久久96| 欧美这里有精品| 中文字幕人妻一区二区在线视频 | 东京久久高清| 国产精品一区二区av| 成午夜精品一区二区三区软件| 99久久国产免费免费| 91麻豆精品激情在线观看最新| 成人在线视频电影| 六月丁香久久丫| 精品无人区一区二区三区| 亚洲资源网站| 四虎影院一区二区三区 | 国产一区一区| 不卡视频一区二区三区| 成人资源在线| 日本一区视频在线观看| 日韩久久久久| 一本色道久久88亚洲精品综合| 涩爱av色老久久精品偷偷鲁| 999热视频| 欧美黑白配在线| 日本视频一区二区在线观看| 91麻豆精品国产91久久久平台| 99亚洲精品视频| 亚洲福利电影| 99草草国产熟女视频在线| 精品在线免费视频| 日本黄色www| 91色视频在线| 韩国一级黄色录像| 午夜国产不卡在线观看视频| 91精品国产高清一区二区三密臀| 在线精品视频小说1| 国产尤物视频在线观看| 亚洲国产三级网| 91激情在线| 久久免费观看视频| 欧美日韩精品一区二区三区视频| 91免费高清视频| 无码少妇一区二区三区| 伊甸园精品99久久久久久| 亚洲国产日韩欧美一区二区三区| 免费裸体美女网站| 国产精品一区二区久久不卡| 黄色aaa视频| 亚洲精选在线视频| 男人天堂av在线播放| 欧美一区二区三区影视| 九色视频成人自拍| 精品中文字幕乱| 欧美黑人巨大xxxxx| 91久久伊人青青碰碰婷婷| 国产毛片一区二区三区 | 亚洲在线国产日韩欧美| 夜夜夜夜夜夜操| 久久天堂av综合合色蜜桃网 | 婷婷久久综合九色综合伊人色| 中文字幕日韩第一页| 亚洲黄页视频免费观看| 欧美尤物美女在线| 欧美专区第一页| www.丝袜精品| 六月婷婷激情网| 日韩av一区二区三区四区| 国产综合内射日韩久| 亚洲视频一二区| 夜夜躁日日躁狠狠久久av| 亚洲精品一线二线三线无人区| 黄网站免费在线播放| 国产成人在线一区二区| 美女视频免费精品| 在线观看18视频网站| 免费在线视频一区| www.久久国产| 精品久久久久久中文字幕| 国产高清免费av| 日韩在线视频播放| 日韩中文在线播放| 蜜桃久久精品乱码一区二区 | 日韩在线第三页| 99精品国产99久久久久久白柏 | 在线免费观看黄色| 日本国产欧美一区二区三区| 久久久免费毛片| 国产资源在线免费观看| 国产福利一区在线| 午夜爽爽爽男女免费观看| 欧美午夜精品理论片a级按摩| 你懂得在线网址| 国产成人精品久久亚洲高清不卡| 爱高潮www亚洲精品| 男人添女荫道口女人有什么感觉| 国产麻豆一精品一av一免费| 日韩一级片大全| 91精品国产麻豆国产自产在线| 日韩免费网站| 成人综合网网址| 欧美精品入口| 99免费观看视频| 亚洲福利一二三区| 人妻精品无码一区二区| 97人人做人人爱| 妖精一区二区三区精品视频 | 久久国内精品视频| 亚洲人做受高潮| 欧美一级片免费看| 男人天堂亚洲天堂| 国产亚洲精品自在久久| 香蕉成人久久| 欧美激情 一区| 欧美高清激情brazzers| www久久日com| 国产欧美日韩在线播放| 免费久久99精品国产自在现线| 91精彩刺激对白露脸偷拍| 91成人在线精品| 久久bbxx| 国产精品手机视频| 每日更新成人在线视频| 亚洲综合欧美综合| 91麻豆精品国产91久久久资源速度| 97超碰在线公开在线看免费| 国产精品美女久久久久av福利| 在线亚洲国产精品网站| 日韩丰满少妇无码内射| 欧美高清激情brazzers| 9999在线视频| 日韩久久久久久久| 国产一区二区三区高清播放| 精品久久免费视频| 亚洲最新视频在线| 免费看日产一区二区三区| 免费av手机在线观看| 国产精品色一区二区三区| 精品人妻一区二区三区换脸明星 | 黄色成人在线观看网站| 日韩一级片一区二区| 91网站视频在线观看| 97超碰人人草| 国产69久久精品成人| 天天综合久久| 97人妻精品一区二区三区免| 精品视频一区 二区 三区| 草美女在线观看| 亚洲国产成人不卡| 不卡视频免费播放| 一级特黄aaa|