Spring Boot 설정 인터페이스 WebMvcConfigurer 구현

WebMvcConfigure 설정 류 는 Spring 내부 의 설정 방식 으로 자바 빈 형식 으로 전통 적 인 xml 설정 파일 형식 을 대체 하여 프레임 워 크 맞 춤 형 제작 을 합 니 다.자바-based 방식 의 spring mvc 설정 을 기반 으로 설정 클래스 를 만 들 고 WebMvcConfigure 를 실현 해 야 합 니 다. 인터페이스,WebMvcConfigurerAdapter 추상 류 는 WebMvcConfigurer 인터페이스 에 대한 간단 한 추상(기본 구현 추가)이지 만,SpringBoot 2.0 및 Spring 5.0 에 서 는 WebMvcConfigurerAdapter 가 폐기 되 었 습 니 다.공식 적 으로 WebMvcConfiguration Support 를 직접 실현 하거나 WebMvcConfiguration Support 를 직접 계승 하 는 것 을 추천 합 니 다.방식 은 WebMvcConfiguration Support 류 를 실현 하 는 것 입 니 다.구체 적 으로 이 글 을 볼 수 있 습 니 다https://www.jb51.net/article/174766.htm

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
 
package org.springframework.web.servlet.config.annotation;
 
import java.util.List;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
 
public interface WebMvcConfigurer {
 void configurePathMatch(PathMatchConfigurer var1);
 
 void configureContentNegotiation(ContentNegotiationConfigurer var1);
 
 void configureAsyncSupport(AsyncSupportConfigurer var1);
 
 void configureDefaultServletHandling(DefaultServletHandlerConfigurer var1);
 
 void addFormatters(FormatterRegistry var1);
 
 void addInterceptors(InterceptorRegistry var1);
 
 void addResourceHandlers(ResourceHandlerRegistry var1);
 
 void addCorsMappings(CorsRegistry var1);
 
 void addViewControllers(ViewControllerRegistry var1);
 
 void configureViewResolvers(ViewResolverRegistry var1);
 
 void addArgumentResolvers(List<HandlerMethodArgumentResolver> var1);
 
 void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> var1);
 
 void configureMessageConverters(List<HttpMessageConverter<?>> var1);
 
 void extendMessageConverters(List<HttpMessageConverter<?>> var1);
 
 void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
 void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
 Validator getValidator();
 
 MessageCodesResolver getMessageCodesResolver();
}
다음 에 우 리 는 몇 가지 방법 을 찾 아 설명 하 는 데 중심 을 두 었 다.

 /*       */
void addInterceptors(InterceptorRegistry var1);
/*         */
void addViewControllers(ViewControllerRegistry registry);
/**
  *      
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/*           */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/**
  *          
 **/
void configureViewResolvers(ViewResolverRegistry registry);
/*            */
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
1、addInterceptors(InterceptorRegistry registry)
이 방법 은 Handler InterceptorAdapter 와 같은 인 터 셉 터 를 전문 적 으로 등록 하 는 데 사 용 됩 니 다.

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer { 
@Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/emp/toLogin","/emp/login","/js/**","/css/**","/images/**");
 }
}
addPathPatterns("/*")는 모든 요청 을 차단 하지만/toLogin 과/login 요청 의 차단 을 제외 합 니 다.
spring boot 버 전이 2.x 로 업그레이드 되면 정적 자원 을 방문 하면 Handler Interceptor 에 의 해 차단 되 고 인터넷 에서 다음 과 같은 처리 방법 이 많 습 니 다.

.excludePathPatterns("/index.html","/","/user/login","/static/**");
안 타 깝 게 도 본인 이 사용 할 때 줄곧 도움 이 되 지 않 았 습 니 다.요청 한 경 로 를 보면/static/그림 과 같 지 않 습 니 다.

그래서 저 는'/js/*','/css/*','/images/*'로 바 꾸 었 습 니 다.그러면 페이지 내용 을 정상적으로 방문 할 수 있 습 니 다.제 프로젝트 구 조 는 다음 과 같 습 니 다.

2.페이지 이동 addViewControllers
예전 에 SpringMVC 를 쓸 때 한 페이지 에 접근 하려 면 Controller 류 를 쓴 다음 에 한 가지 방법 을 써 서 페이지 로 넘 어 가 는 것 이 번 거 로 웠 습 니 다.사실은 WebMvcConfigurer 의 addView Controllers 방법 을 다시 쓰 면 효 과 를 얻 을 수 있 습 니 다.

/**
  *                Controller   ,         
  *                ,    http://localhost:8080/toLogin    login.jsp   
  * @param registry
  */
 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
  registry.addViewController("/toLogin").setViewName("login");
  
 }
값 은 addViewControllers 방법 을 다시 쓰 는 것 입 니 다.WebMvc AutoConfiguration 의 addViewControllers(이 방법 에서 Spring Boot 는"/"를 index.html 에 표시 합 니 다)를 덮어 쓰 지 않 습 니 다.이것 은 우리 자신의 설정 과 Spring Boot 의 자동 설정 이 동시에 유효 하 다 는 것 을 의미 합 니 다.이것 은 우리 가 자신의 MVC 설정 을 추가 하 는 것 을 추천 하 는 방식 입 니 다.
3.사용자 정의 자원 맵 addResource Handlers
예 를 들 어 정적 자원 맵 디 렉 터 리 를 사용자 정의 하려 면 addResource Handlers 방법 을 다시 쓰 면 됩 니 다.
주:WebMvcConfigurationSupport 클래스 를 계승 하여 설정 을 실현 할 때 이 방법 을 다시 써 야 합 니 다.구체 적 으로 다른 글 을 보십시오.

@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
 /**
  *         
  * @param registry
  */
 @Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
  
 }
}
addResource Handler 를 통 해 맵 경 로 를 추가 한 다음 addResource Locations 를 통 해 경 로 를 지정 합 니 다.사용자 정의 my 폴 더 에 있 는 elephant.jpg 그림 의 주 소 는?http://localhost:8080/my/elephant.jpg
외부 디 렉 터 리 를 지정 하 는 것 도 간단 합 니 다.addResource Locations 에서 지정 하면 됩 니 다.코드 는 다음 과 같 습 니 다.

@Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
  
 }
addResourceLocations 는 파일 이 설 치 된 디 렉 터 리 를 말 합 니 다.addResoureHandler 는 대외 적 으로 노출 된 접근 경 로 를 말 합 니 다.
4. configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
사용법:

 @Override
 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  configurer.enable();
  configurer.enable("defaultServletName");
 }
이 때 기본 Handler:Default ServletHttpRequestHandler 를 등록 합 니 다.이 Handler 도 정적 파일 을 처리 하 는 데 사 용 됩 니 다.맵/을 시도 합 니 다.Dispatcher Servelt 맵/시(/와/가 다 름),요청 을 처리 할 적절 한 Handler 를 찾 지 못 하면 Default ServletHttp RequestHandler 에 맡 깁 니 다.메모:웹 루트 디 렉 터 리 대신 정적 자원 을 웹 루트 디 렉 터 리 에 배치 합 니 다.
이 설명 은 잘 모 르 겠 습 니 다.(저도 그렇게 생각 합 니 다)예 를 들 어 웹 루트 디 렉 터 리 에 그림 이 있 습 니 다.1.png 는 Servelt 규범 에서 웹 루트 디 렉 터 리(webroot)의 파일 이 직접 접근 할 수 있다 는 것 을 알 고 있 습 니 다.그러나 Dispatcher Servlet 은 맵 경 로 를 설정 하 였 기 때문에:/,거의 모든 요청 을 차단 하 였 습 니 다.이 로 인해 1.png 가 접근 하지 못 했 습 니 다.이 때 Default ServletHttp RequestHandler 를 등록 하면 이 문 제 를 해결 할 수 있 습 니 다.사실은 Dispatcher Servlet 이 Servlet 의 특성 을 파괴 한 것 으로 이해 할 수 있 습 니 다.(루트 디 렉 터 리 에 있 는 파일 은 직접 접근 할 수 있 습 니 다)Default ServletHttpRequestHandler 는 이 기능 으로 돌아 가 는 데 도움 을 줍 니 다.
5、configureViewResolvers(ViewResolverRegistry registry)
방법 이름 에서 알 수 있 듯 이 이 방법 은 보기 해석 기 를 설정 하 는 데 사 용 됩 니 다.이 방법의 매개 변 수 는 View Resolver Registry 는 사용자 정의 보기 해석 기 등 을 등록 하 는 등록 기 입 니 다.View Resolver Registry 에서 자주 사용 하 는 몇 가지 방법:
1).enableContentNegotiation()

/**            */
public void enableContentNegotiation(View... defaultViews) {
 initContentNegotiatingViewResolver(defaultViews);
}
이 방법 은 콘 텐 츠 해상도 기 ContentNegotiatingViewResolver 를 만 듭 니 다.이 해상도 기 는 구체 적 인 보 기 를 해석 하지 않 고 등 록 된 모든 보기 해상도 기 를 관리 합 니 다.모든 보 기 는 먼저 이 를 통 해 해석 한 다음 에 어떤 해상도 기 를 사용 하여 해석 할 지 결정 합 니 다.구체 적 인 맵 규칙 은 요청 한 media types 에 따라 결 정 됩 니 다.
2).  UrlBasedViewResolverRegistration()

 public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {
  InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  resolver.setPrefix(prefix);
  resolver.setSuffix(suffix);
  this.viewResolvers.add(resolver);
  return new UrlBasedViewResolverRegistration(resolver);
 }
이 방법 은 내부 자원 보기 해상도 기 를 등록 합 니 다.이 방법 은 경로 의 접두사 와 파일 접 두 사 를 지정 하 는 데 사 용 됩 니 다.예 를 들 어:

registry.jsp("/WEB-INF/jsp/", ".jsp");
위 설정 에 대해 서 는 보기 이름 이 example 이면/WEB-INF/jsp/example.jsp 를 전단 으로 되 돌려 주 고 찾 지 못 하면 404 를 보고 합 니 다.  
3).  beanName()

 public void beanName() {
  BeanNameViewResolver resolver = new BeanNameViewResolver();
  this.viewResolvers.add(resolver);
 }
이 방법 은 BeanNameView Resolver 보기 해상 도 를 등록 합 니 다.이 해상 도 는 무엇 입 니까?이것 은 주로 보기 이름 을 대응 하 는 bean 으로 해석 합 니 다.무슨 뜻 이 죠?되 돌아 오 는 보기 이름 이 example 이 라면 spring 용기 에서 example 라 는 bean 을 찾 을 수 있 습 니 다.그리고 이 bean 은 View.class 형식 입 니까?있 으 면 이 bean 으로 돌아 가세 요.  
4).  viewResolver()

 public void viewResolver(ViewResolver viewResolver) {
  if (viewResolver instanceof ContentNegotiatingViewResolver) {
   throw new BeanInitializationException(
     "addViewResolver cannot be used to configure a ContentNegotiatingViewResolver. Please use the method enableContentNegotiation instead.");
  }
  this.viewResolvers.add(viewResolver);
 }
이 방법 은 이름 을 꼭 봐 야 알 수 있 습 니 다.다양한 보기 해석 기 를 등록 하 는 데 사 용 됩 니 다.자신 이 정의 하 는 것 을 포함 합 니 다.
6. configureContentNegotiation(ContentNegotiationConfigurer configurer)
위 에서 configureView Resolvers 방법 을 말씀 드 렸 습 니 다.만약 이 방법 에서 콘 텐 츠 재결 해석 기 를 사용 했다 면 configureContentNegotiation(ContentNegotiationConfigurer configurer)이라는 방법 은 콘 텐 츠 재결 을 설정 하 는 일부 매개 변수 입 니 다.이것 은 비교적 간단 하 다.우 리 는 직접 하나의 예 를 통 해 본다.

 public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
  /*       Url       media type */
  configurer.favorPathExtension(true) 
     /*    Accept    */
    .ignoreAcceptHeader(true)
    .parameterName("mediaType")
     /*      media yype */
    .defaultContentType(MediaType.TEXT_HTML)
     /*    .html       MediaType.TEXT_HTML*/
    .mediaType("html", MediaType.TEXT_HTML)
    /*    .json       MediaType.APPLICATION_JSON*/
    .mediaType("json", MediaType.APPLICATION_JSON);
 }
여기 서 우 리 는 예 를 들 어 우리 가 위 에서 말 한 지식 을 더욱 잘 알 수 있다.만약 에 우리 MVC 의 설정 이 다음 과 같다 면:

@EnableWebMvc
 @Configuration
 public class MyWebMvcConfigurerAdapte extends WebMvcConfigurerAdapter {
 
  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
   registry.jsp("/WEB-INF/jsp/", ".jsp");
   registry.enableContentNegotiation(new MappingJackson2JsonView());
  }
 
  @Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
   configurer.favorPathExtension(true)
     .ignoreAcceptHeader(true)
     .parameterName("mediaType")
     .defaultContentType(MediaType.TEXT_HTML)
     .mediaType("html", MediaType.TEXT_HTML)
     .mediaType("json", MediaType.APPLICATION_JSON);
  }
 }
controller 의 코드 는 다음 과 같 습 니 다:

 @Controller
 public class ExampleController {
   @RequestMapping("/test")
   public ModelAndView test() {
   Map<String, String> map = new HashMap();
   map.put("  ", "    ");
   map.put("  ", "    ");
   return new ModelAndView("test", map);
  }
 }
WEB-INF/jsp 디 렉 터 리 에 test.jsp 파일 을 만 들 고 내용 이 자 유 롭 습 니 다.현재 tomcat 를 시작 합 니 다.브 라 우 저 에 다음 링크 를 입력 하 십시오.http://localhost:8080/test.json,브 라 우 저 내용 은 다음 과 같 습 니 다:

{
 "  ":"    ",
 "  ":"    "
}
브 라 우 저 입력http://localhost:8080/test 혹은http://localhost:8080/test.html,내용 반환 은 다음 과 같 습 니 다:

this is test.jsp
분명히 두 번 이나 서로 다른 보기 해석 기 를 사 용 했 는데,밑바닥 에 도대체 무슨 일이 일 어 났 을 까?설정 에 두 개의 보기 해석 기 를 등 록 했 습 니 다.
ContentNegotiatingViewResolver 와 Internal ResourceViewResolver,그리고 기본 보기:MappingJackson 2JSonView.controller 가 실 행 된 후에 Model AndView 를 되 돌려 줍 니 다.보기 의 이름 은 example 1 입 니 다.
1.돌아 오 면 먼저 ContentNegotiatingViewResolver 에 게 보 기 를 처리 하고 ContentNegotiatingViewResolver 는 가지 고 있 는 모든 ViewResolver 에 게 보기 이름 example 1 을 건 네 주 고 해석 을 시도 합 니 다(이 인 스 턴 스 에는 Internal ResourceViewResolver 만 있 습 니 다).
2.요청 한 mediaType 에 따라 example 1.mediaType(여 기 는 example 1.json 과 example 1.html)을 보기 이름 으로 모든 보기 해석 기 를 한 번 해석 합 니 다.두 단계 해석 이 끝나 면 후보 목록에 기본 MappingJackson 2JSonView 를 추가 합 니 다.
3.요청 한 media type 에 따라 후보 목록에서 가장 좋 은 반환 을 선택 하여 보기 해석 이 완료 되 었 습 니 다.
상례 에서 왜 링크 를 요 청 했 는 지 이해 할 수 있 습 니 다.제 이 슨 을 추가 할 때 요청 한 media type 은 MediaType.APPLICATION 입 니 다.JSON,Internal ResourceView Resolver 가 해석 한 보기 의 ContentType 은 맞지 않 고 MappingJackson 2JSonView 의 ContentType 과 일치 하기 때문에 MappingJackson 2JSonView 를 보기 로 되 돌려 주 었 습 니 다..json 요청 을 추가 하지 않 을 때 기본 media type 은 MediaType.TEXT 입 니 다.HTML,그래서 Internal ResourceView Resolver 가 분석 한 보 기 를 반환 값 으로 사 용 했 습 니 다.나 는 이곳 을 보고 싶다.너 는 이미 대체적으로 보 기 를 사용자 정의 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기