栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot:WebMvcConfigurer介绍

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot:WebMvcConfigurer介绍

目录

简介

依赖

常用接口详解

路径匹配规则:configurePathMatch

异步调用支持:configureAsyncSupport

☆☆☆静态资源处理器:addResourceHandlers

静态资源默认处理器:configureDefaultServletHandling

格式化器和转换器:addFormatters

☆☆☆拦截器:addInterceptors

☆☆☆跨域设置:addCorsMappings

方式一:重写WebMvcConfigurer里的addCorsMappings。

方式二:使用过滤器配置配置跨域

☆☆☆视图控制器:addViewControllers

☆☆☆视图解析器:configureViewResolvers

☆☆☆参数解析器:addArgumentResolvers

☆☆☆返回值处理器:addReturnValueHandlers


简介

        WebMvcConfigurer是一个接口,里面提供了很多web应用常用的拦截方法。通过实现该接口,可以实现web应用 跨域设置、类型转化器、自定义拦截器、页面跳转等功能。

@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    
}

依赖

    org.springframework.boot
    spring-boot-starter
    2.6.7


    org.springframework
    spring-webmvc
    5.3.19

常用接口详解

路径匹配规则:configurePathMatch

设置前端请求url与后端接口url的匹配规则。

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
	// 默认为true,是否使用尾斜杠匹配:如果设置为true,则“/hello”和“/hello/”都能匹配
	configurer.setUseTrailingSlashMatch(false);

	// 为所有RestController接口添加统一前缀api:如果controller的url为“/hello”  -->  "/api/hello"
	configurer.addPathPrefix("api", c -> c.isAnnotationPresent(RestController.class));

	// UrlPathHelper是一个处理url地址的帮助类,里面自带了一些优化url的方法;
	// 比如:getSanitizedPath,就是将// 换成/。所以我们在输入地址栏的时候,//也是没有问题的,
	UrlPathHelper urlPathHelper = new UrlPathHelper();
	configurer.setUrlPathHelper(urlPathHelper);

	// 路径匹配器 PathMatcher是一个接口,springmvc默认使用的是AntPathMatcher
//        configurer.setPathMatcher();
}

异步调用支持:configureAsyncSupport

配置异步请求处理选项,可以设置超时时间和异步调用执行器。

@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
	//核心线程数
	threadPoolTaskExecutor.setCorePoolSize(5);
	threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
	//最大线程数
	threadPoolTaskExecutor.setMaxPoolSize(5);
	//配置队列大小
	threadPoolTaskExecutor.setQueueCapacity(50);
	//配置线程池前缀
	threadPoolTaskExecutor.setThreadNamePrefix("async-service-");
	threadPoolTaskExecutor.initialize();

	// 设置异步调用执行器(线程池)
	configurer.setTaskExecutor(threadPoolTaskExecutor);
	// 设置超时时间
	configurer.setDefaultTimeout(20000);
}

☆☆☆静态资源处理器:addResourceHandlers

自定义静态资源映射目录。

addResourceHandler:对外暴露的访问路径

addResourceLocations:映射内部文件放置的目录,以“/”结尾

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
	// 如果url请求为/resource_test/hello.html,就会去test_file路径下找hello.html文件
	registry.addResourceHandler("/resource_test
@Bean
public InternalResourceViewResolver resourceViewResolver()
{
	InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
	//请求视图文件的前缀地址
	internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
	//请求视图文件的后缀
	internalResourceViewResolver.setSuffix(".jsp");
	return internalResourceViewResolver;
}


@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
	registry.viewResolver(resourceViewResolver());
	
}

☆☆☆参数解析器:addArgumentResolvers

        通常用于在Controller中方法参数传入之前对参数进行处理,然后将处理后的参数传给controller方法中的参数。

// 自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AdminParam {
}

// MyUser实例类
@Data
@ToString
@AllArgsConstructor
public class MyUser {
    private String userName;
    private String age;
}

// 测试controller
@GetMapping("/admin")
public String admin(@AdminParam MyUser myUser) {
    // myUser对象不由前端传入,而是由参数解析器根据请求头中的信息获取。
	return myUser.toString();
}
// 自定义参数解析器,当参数有@AdminParam注解时,返回当前用户给controlller参数 
@Component
public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 判断参数是否需要进行参数解析
        // 可以根据参数类型、是否有指定注解等来决定是否进行参数解析
        return parameter.hasParameterAnnotation(AdminParam.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 这里方便测试,直接构造了一个虚拟User,实际情况可以根据token解析用户信息。
        MyUser myUser = new MyUser("jack", "25");
        return myUser;
    }
}

@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Autowired
    private HandlerMethodArgumentResolver myHandlerMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List resolvers) {
        // 注册参数解析器
	    resolvers.add(myHandlerMethodArgumentResolver);
    }
}

☆☆☆返回值处理器:addReturnValueHandlers

        通常用于对controller的返回对象作统一的封装,处理controller返回的数据后再将数据返回该前端。

@Data
@AllArgsConstructor
public class ResponseResult {
    private int code;
    private Object content;
    private String message;
}

@Component
public class MyHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        // 当controller方法有@AdminParam注解时,执行handlerReturnValue处理逻辑
        return !ObjectUtils.isEmpty(returnType.getAnnotatedElement().getAnnotation(AdminParam.class));
    }

    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        // 构造ResponseResult标准返回对象返回结果
        ResponseResult result = new ResponseResult(200, returnValue, "success");
        response.getWriter().write(JSON.toJSONString(result));
    }
}
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
	@Autowired
	private HandlerMethodReturnValueHandler myHandlerMethodReturnValueHandler;

	@Override
	public void addReturnValueHandlers(List handlers) {
		handlers.add(myHandlerMethodReturnValueHandler);
	}
}

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/952839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号