精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

天堂地址在线www| 久草免费资源站| 国产成人高清激情视频在线观看| 日本不卡在线观看视频| 福利片在线观看| 国产麻豆成人传媒免费观看| 69视频在线播放| 黄色片网站在线播放| 高潮久久久久久久久久久久久久| 欧美中文字幕一区| 国内精品国产三级国产99| 色就是色亚洲色图| 国产伦精品一区二区三区视频青涩| 午夜精品视频网站| 蜜桃av.com| 色88888久久久久久影院| 欧美日韩亚洲综合在线| 国产一区二区视频播放| 久操视频在线观看| 久久精品一区二区三区不卡 | 国产午夜福利精品| 欧美特黄一级大片| 亚洲精品久久久久久下一站 | 国产av天堂无码一区二区三区| 国产精品99999| gogo大胆日本视频一区| 91在线色戒在线| www.亚洲激情| 久久av一区二区三区| 久久久久久久999精品视频| 国产喷水在线观看| 欧美三级情趣内衣| 日韩精品高清在线观看| 久久久无码人妻精品无码| 日韩一级特黄| 欧美日韩在线播放三区四区| aa免费在线观看| 人狥杂交一区欧美二区| 亚洲专区一二三| 国产免费xxx| 黄网页免费在线观看| 国产精品人成在线观看免费| 久久综合色88| 丁香激情综合五月| 超碰91人人草人人干| 五月激情四射婷婷| 国产成人黄色| 亚洲视频在线观看视频| 男生草女生视频| 少妇精品久久久一区二区三区| 亚洲福利视频专区| 一级黄色电影片| 亚洲一级大片| 精品播放一区二区| 亚洲男女在线观看| 国产区精品视频在线观看豆花| 精品欧美乱码久久久久久1区2区 | 精品福利在线| 欧美日韩午夜在线| 99日在线视频| 久久九九精品视频| 亚洲第一福利网站| 久久丫精品国产亚洲av不卡| 天堂成人娱乐在线视频免费播放网站 | 国产黄色片免费观看| 国产精品一区一区| 成人免费视频观看视频| 天天爽夜夜爽夜夜爽| 91原创在线视频| 欧美性色黄大片人与善| 在线激情网站| 亚洲免费在线观看| 亚洲国产精品成人天堂| 免费电影日韩网站| 欧美日韩久久久一区| 久久久精品视频国产| 亚洲1区在线| 精品偷拍各种wc美女嘘嘘| 亚洲性猛交xxxx乱大交| 国产精品传媒精东影业在线 | 亚洲精品一区二区三区蜜桃久| 东京热一区二区三区四区| 欧美成人黄色| 7777精品伊人久久久大香线蕉完整版 | 欧美国产日韩综合| 影音先锋久久精品| 日本国产欧美一区二区三区| 国产宾馆实践打屁股91| 国产精品国产精品国产专区蜜臀ah | 91蜜桃在线视频| 黄色精品在线看| 中文字幕av专区| 中文在线免费一区三区| 亚洲免费一级电影| 日韩a级片在线观看| 国产农村妇女毛片精品久久莱园子| 国产成人极品视频| 精品国产免费无码久久久| 久久伊99综合婷婷久久伊| 99精品视频网站| 在线视频超级| 日韩一级二级三级精品视频| 国产中年熟女高潮大集合| 中文字幕日韩一区二区不卡 | 精品国偷自产在线视频| 国产精品老女人| 国产乱码精品一区二区三 | 亚洲成a人片在线www| 欧美色图一区| 97超级碰碰碰久久久| 国产色综合视频| 久久精品一区二区三区av| 国产免费一区二区视频| 亚洲图片小说区| 亚洲午夜激情免费视频| 国产a∨精品一区二区三区仙踪林| 久久99这里只有精品| 免费成人在线观看av| 污视频在线免费观看网站| 精品视频一区二区不卡| av中文字幕免费观看| 一二三区精品| 国产精品乱码一区二区三区| 精产国品自在线www| 欧美图区在线视频| 无码熟妇人妻av| 一级成人国产| 九九九热999| 福利成人导航| 日韩美女视频一区二区在线观看| 亚洲国产精品一区二区久久hs| 久久久亚洲一区| 六月婷婷久久| 中文字幕乱码在线播放| 亚洲国产欧美久久| 日本一区二区欧美| 成人网男人的天堂| av一区二区三区免费观看| 男人天堂久久| 色爱av美腿丝袜综合粉嫩av| 婷婷激情五月综合| 国产性色一区二区| 精品久久久久久久无码| 国产精品入口久久| 欧日韩在线观看| 欧美成人片在线| 日韩欧美在线观看视频| 国产三级av在线播放| 97国产精品视频| 免费在线观看av网址| 麻豆国产精品视频| 视频一区视频二区视频| 偷拍视频一区二区三区| 国产视频精品久久久| 少妇一级淫片免费放中国 | 亚洲精品免费在线视频| 黄色免费在线看| 日韩一级免费观看| 麻豆chinese极品少妇| 成人午夜在线免费| 成熟丰满熟妇高潮xxxxx视频| 欧美深夜视频| 日本sm极度另类视频| 成人动漫在线免费观看| 欧美日韩高清一区二区| 国产97免费视频| 丰满放荡岳乱妇91ww| 国产91在线视频观看| 狠狠色狠狠色综合婷婷tag| 国产精品一区二区三区免费视频| 欧美jizz18性欧美| 日韩午夜精品视频| 欧美福利视频一区二区| 国产亚洲人成网站| 交换做爰国语对白| 亚洲黄色大片| 日韩国产欧美一区| 免费精品一区| 91精品国产高清| 幼a在线观看| 精品日韩在线观看| 免费黄色片视频| 亚洲色欲色欲www| 亚洲久久久久久| 青青草97国产精品免费观看 | 亚洲精品国精品久久99热一| 波多野结衣视频在线观看| 亚洲色图在线看| 中文字幕国产专区| 国产一区二区三区免费播放| 1024精品视频| 911精品美国片911久久久| 久久久久久久久久久久久久一区| 免费视频观看成人| 欧美最猛性xxxx| 欧美午夜大胆人体| 这里只有精品丝袜| 天堂在线观看免费视频| 欧美挠脚心视频网站| 青青草av在线播放| 亚洲青青青在线视频| 在哪里可以看毛片| 国产精品自拍毛片| 无需播放器的av| 亚洲一区二区成人| 欧美一二三不卡| 青青草综合网| 欧美精品一区二区三区四区五区| 日韩三级网址| 国产在线一区二区三区| 一区二区精品伦理...| 欧美美最猛性xxxxxx| av免费观看一区二区| 亚洲裸体xxxx| 天堂在线观看免费视频| 日韩一级片在线观看| 91国产精品一区| 欧美最新大片在线看| 日韩在线观看第一页| 亚洲综合色区另类av| 国产第一页浮力| 国产精品嫩草99a| 日本xxxxxxxxx18| 91丨九色丨蝌蚪富婆spa| 台湾佬美性中文| 狠狠色丁香婷婷综合| 欧美日韩在线成人| 视频在线在亚洲| 国产成人久久777777| 亚洲欧美日韩精品一区二区| 色欲色香天天天综合网www| 午夜欧美理论片| 肉大捧一出免费观看网站在线播放| 日韩在线影视| 狠狠色综合一区二区| 粉嫩一区二区三区四区公司1| 91影院未满十八岁禁止入内| 视频一区日韩精品| 99re在线观看视频| 中文字幕一区二区三区中文字幕| 91在线视频九色| 国产高清亚洲| 91亚洲一区精品| 日韩在线观看一区二区三区| 99电影在线观看| 草草视频在线一区二区| 国产伦理一区二区三区| 国产一区在线电影| 久久精品人人做人人爽电影| 国产精品一线天粉嫩av| 水蜜桃一区二区三区| 日韩成人三级| 欧美 日韩 国产 在线观看| 91精品啪在线观看国产18| 一区二区三区四区免费观看| 欧美体内she精视频在线观看| 老子影院午夜伦不卡大全| 91久久黄色| 国产xxxxx在线观看| 青青草91视频| 日本泡妞xxxx免费视频软件| 不卡的看片网站| 亚洲第一成人网站| 国产精品色眯眯| 四虎地址8848| 亚洲图片欧美色图| 欧美黑人一区二区| 欧美日韩一区二区三区不卡| 国产黄色免费大片| 日韩激情av在线免费观看| 成人午夜在线观看视频| 久久综合伊人77777蜜臀| 欧美日韩在线视频免费观看| 国产91精品黑色丝袜高跟鞋| 亚洲爱爱视频| 97在线资源站| 无码少妇一区二区三区| 亚洲一区二区精品在线观看| 国产精品www994| 欧美视频第三页| 激情av综合网| 丰满少妇在线观看资源站| ...xxx性欧美| 久久久久久久久久免费视频| 欧美日韩免费一区二区三区| 亚洲免费国产视频| 伊人伊成久久人综合网站| free性欧美hd另类精品| 清纯唯美亚洲综合| aa亚洲一区一区三区| 免费日韩电影在线观看| 欧美一区国产在线| 国产精品69页| 成人综合婷婷国产精品久久蜜臀| 在哪里可以看毛片| 亚洲国产日韩在线一区模特| 中文字幕在线观看视频一区| 精品国产髙清在线看国产毛片 | 精品中文字幕视频| 日韩大片欧美大片| 懂色中文一区二区三区在线视频| 成人羞羞网站| 逼特逼视频在线| 国产一区二区h| 中文字幕伦理片| 激情久久av一区av二区av三区| 国产精品久久久久久久久久久久久久久久| 精品久久久久久亚洲综合网| 日韩毛片久久久| 国产mv久久久| 国产精品chinese在线观看| 一本一道久久久a久久久精品91| 国产日韩一区| jjzz黄色片| 亚洲精品少妇30p| 怡红院男人的天堂| 亚洲欧美日韩天堂一区二区| caoporn视频在线| 99视频网站| 91成人影院| 免费av不卡在线| 欧美国产一区二区| 7799精品视频天天看| 日韩av网站在线| 99色在线观看| 国产激情美女久久久久久吹潮| 天天揉久久久久亚洲精品| 亚洲欧美在线精品| 国产欧美日韩三级| 亚洲不卡在线视频| 国产视频在线观看一区二区| 麻豆免费在线| 久久久久免费网| 亚洲一区二区三区免费在线观看| 国产精品入口麻豆| 亚洲mv大片欧洲mv大片精品| 免费国产精品视频| 欧美精品久久久久久久| 亚洲国产aⅴ精品一区二区| 欧美另类videos| 国产精品亚洲一区二区三区妖精| 三级av在线免费观看| 91精品国产乱码| 中文字幕欧美一| 中文字幕 日韩有码| 国产性猛交xxxx免费看久久| 另类专区亚洲| 日本视频一区在线观看| 天堂久久一区二区三区| 免费看污片网站| 欧美视频精品在线观看| 亚洲成a人v欧美综合天堂麻豆| 国产精品视频久久久| 久久精品国产大片免费观看| 五月天视频在线观看| 在线观看 亚洲| 在线免费观看成人短视频| 日韩美女一级视频| 欧美一级大片在线免费观看| 久久超碰99| 向日葵污视频在线观看| 中文字幕日韩av资源站| 国产xxxx孕妇| 91国在线精品国内播放| 欧美精品momsxxx| 91香蕉视频污版| 日韩理论片在线| 高h放荡受浪受bl| 欧美又大粗又爽又黄大片视频| 精品一区电影| 一级黄色高清视频| 亚洲成人综合网站| 天堂91在线| 国产男女猛烈无遮挡91| 韩国在线一区| 精品人妻无码一区二区三区| 欧美日韩另类一区| 激情在线视频播放| 青青草久久网络| 国产一区二区三区在线观看免费| 国产精品99无码一区二区| 一本色道久久综合狠狠躁篇怎么玩| 欧美成人xxxx| 阿v天堂2017| 国产精品黄色在线观看| 亚洲国产剧情在线观看| 国产精品va在线播放我和闺蜜| 国产精品二区不卡| 加勒比精品视频| 欧美精品aⅴ在线视频| 日韩精品美女| 国产精品美女在线播放| 91在线视频播放| 国产男女无套免费网站| 91产国在线观看动作片喷水| 天天操综合网| 精品成人无码一区二区三区| 欧美xxx久久| 青青久久精品| 日日鲁鲁鲁夜夜爽爽狠狠视频97 |