Spring Boot 설정 인터페이스 WebMvcConfigurer 구현
                                            
 14216 단어  SpringBootWebMvcConfigurer
                    
//
// 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);이 방법 은 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/**");
 }
}
spring boot 버 전이 2.x 로 업그레이드 되면 정적 자원 을 방문 하면 Handler Interceptor 에 의 해 차단 되 고 인터넷 에서 다음 과 같은 처리 방법 이 많 습 니 다.
.excludePathPatterns("/index.html","/","/user/login","/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");
  
 }
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 Locations 에서 지정 하면 됩 니 다.코드 는 다음 과 같 습 니 다.
@Override
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
  
 }
4. configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
사용법:
 @Override
 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  configurer.enable();
  configurer.enable("defaultServletName");
 }
이 설명 은 잘 모 르 겠 습 니 다.(저도 그렇게 생각 합 니 다)예 를 들 어 웹 루트 디 렉 터 리 에 그림 이 있 습 니 다.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);
}
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");3). beanName()
 public void beanName() {
  BeanNameViewResolver resolver = new BeanNameViewResolver();
  this.viewResolvers.add(resolver);
 }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);
 }
@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
 public class ExampleController {
   @RequestMapping("/test")
   public ModelAndView test() {
   Map<String, String> map = new HashMap();
   map.put("  ", "    ");
   map.put("  ", "    ");
   return new ModelAndView("test", map);
  }
 }
{
 "  ":"    ",
 "  ":"    "
}
this is test.jspContentNegotiatingViewResolver 와 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)을 보기 이름 으로 모든 보기 해석 기 를 한 번 해석 합 니 다.두 단계 해석 이 끝나 면 후보 목록
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 가 분석 한 보 기 를 반환 값 으로 사 용 했 습 니 다.나 는 이곳 을 보고 싶다.너 는 이미 대체적으로 보 기 를 사용자 정의 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.