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);
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)을 보기 이름 으로 모든 보기 해석 기 를 한 번 해석 합 니 다.두 단계 해석 이 끝나 면 후보 목록
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에 따라 라이센스가 부여됩니다.