当前位置:首页 > 科技  > 软件

Spring MVC核心扩展点及使用技巧总结和使用案例

来源: 责编: 时间:2024-02-01 12:46:37 252观看
导读环境:SpringBoot2.7.121. 启用Spring MVC功能@Configuration@EnableWebMvcpublic class WebConfig {}2. 类型转换配置如需要自定义数据类型的转换,可以通过如下方式注册@Configurationpublic class WebConfig implement

环境:SpringBoot2.7.125Tu28资讯网——每日最新资讯28at.com

1. 启用Spring MVC功能

@Configuration@EnableWebMvcpublic class WebConfig {}

5Tu28资讯网——每日最新资讯28at.com

2. 类型转换配置

如需要自定义数据类型的转换,可以通过如下方式注册5Tu28资讯网——每日最新资讯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) ;          }        } ;      }    });  }  }

5Tu28资讯网——每日最新资讯28at.com

以上添加了从String到Integer的转换(这里只是举例,系统默认已经有了从String到Number的转换器)。每种转换器最终被包装成ConvertersForPair对象,该对象中有个队列保存了所有的转换器。后添加的添加到首位,如下:5Tu28资讯网——每日最新资讯28at.com

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

5Tu28资讯网——每日最新资讯28at.com

所有如你有自定义的转换器,自定义的优先级比系统自带的要高。5Tu28资讯网——每日最新资讯28at.com

3. 数据验证

默认情况下,如果类路径上存在 Bean Validation(例如 Hibernate Validator),则 LocalValidatorFactoryBean 会被注册为全局 Validator,与控制器方法参数上的 @Valid 和 Validated 一起使用。5Tu28资讯网——每日最新资讯28at.com

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

5Tu28资讯网——每日最新资讯28at.com

4. 请求拦截器5Tu28资讯网——每日最新资讯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("/**") ;  }}

5Tu28资讯网——每日最新资讯28at.com

上面配置了一个拦截任意请求的拦截器,在请求到达时会先验证请求header中token是否为null。5Tu28资讯网——每日最新资讯28at.com

5Tu28资讯网——每日最新资讯28at.com

拦截器并不适合作为安全层,因为它有可能与控制器Controller路径匹配不匹配,而Controller路径匹配还可以透明地匹配尾部斜线和路径扩展名以及其他路径匹配选项。其中许多选项已被弃用,但仍有可能出现不匹配。一般情况下,我们建议使用 Spring Security,它包含一个专用的 MvcRequestMatcher,可与 Spring MVC 路径匹配保持一致,还具有安全防火墙,可阻止 URL 路径中许多不需要的字符。5Tu28资讯网——每日最新资讯28at.com

5Tu28资讯网——每日最新资讯28at.com

5. 请求内容类型

自定义Spring MVC 如何从请求中确定所请求的媒体类型(例如,接受头、URL 路径扩展、查询参数等)。5Tu28资讯网——每日最新资讯28at.com

默认情况下,只选中"Accept" header。5Tu28资讯网——每日最新资讯28at.com

@Configurationpublic class WebConfig implements WebMvcConfigurer {  @Override  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {    // 这样配置后,视图技术就能够根据你请求的Accept输出指定的文件内容了    configurer.mediaType("yaml", new MediaType("application", "yaml")) ;  }}

上面的配置最终是对ContentNegotiationManager对象进行添加MappingMediaTypeFileExtensionResolver文件扩展解析器。5Tu28资讯网——每日最新资讯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();}

部分代码5Tu28资讯网——每日最新资讯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对象。如下接口5Tu28资讯网——每日最新资讯28at.com

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

5Tu28资讯网——每日最新资讯28at.com

在classpath下新建test.yaml文件,内容随意。有了这些还不够,我们需要能够解析处理*.yaml的文件。所以还需要视图解析器5Tu28资讯网——每日最新资讯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.28at.com/showinfo-26-70401-0.htmlSpring MVC核心扩展点及使用技巧总结和使用案例

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 项目明明部署成功了, BUG 怎么还在啊?产品急了

下一篇: 别瞎写工具类了,Spring自带的不香吗?

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top