스프링 부팅에서 여러 DispatcherServlet 구성 상세 정보
기존 springMVC 프로젝트
전통적인springMVC 프로젝트에서 여러 개의 Dispatcher Servlet을 설정하면 웹에서 쉽게 사용할 수 있습니다.xml에서 여러 개를 직접 설정하면 됩니다.
<servlet>
<servlet-name>restServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ModelRestServlet</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
init-param의 contextConfigLocation을 지정하면 이 Dispatcher Servlet에 상하문을 지정할 수 있습니다.spring boot에 Servlet을 등록하는 두 가지 방법
그러나springboot은tomcat을 모두 숨겼고, 웹은커녕.xml입니다.자, 다른 방식으로 servlet을 설정할 수 있습니다.
1. @WebServlet 메모:
이것은javaee의 주석입니다. servlet 3.0 이후에 제공됩니다.springboot은 이 주석을 스캔하고 이 주석의 클래스를 웹 용기에 servlet으로 등록합니다.
그러나 Dispatcher Servlet은 사용자 정의 servlet이 아니라 프레임워크가 제공하는 servlet이기 때문에 이 방법은 안 됩니다.
2.ServletRegistrationBean:
이 bean은springboot에서 servlet을 등록하는 것을 제공합니다. bean을 등록하는 것처럼 servlet을 설정할 수 있습니다.
@Bean
public ServletRegistrationBean restServlet(){
//
AnnotationConfigWebApplicationContext applicationContext
= new AnnotationConfigWebApplicationContext();
//base package
applicationContext.scan("com.jerryl.rest");
// dispatcherServlet
DispatcherServlet rest_dispatcherServlet
= new DispatcherServlet(applicationContext);
// ServletRegistrationBean servlet
ServletRegistrationBean registrationBean
= new ServletRegistrationBean(rest_dispatcherServlet);
registrationBean.setLoadOnStartup(1);
// urlmapping
registrationBean.addUrlMappings("/rest/*");
// name, dispatcherServlet
registrationBean.setName("rest");
return registrationBean;
}
그중에서 주의해야 할 것은registration이다.setName("rest"), 이 문장은 매우 중요합니다. 왜냐하면name가 같은 Servlet Registration Bean은 하나만 효력이 발생하기 때문입니다. 즉, 나중에 등록한 것이name가 같은 Servlet Registration Bean을 덮어씁니다.지정하지 않으면 기본값은 "dispatcher Servlet"이고 spring boot에서 제공하는 Dispatcher Servlet의name은 "dispatcher Servlet"입니다.spring boot의 DispatcherServletAutoConfiguration 클래스에서 다음을 확인할 수 있습니다.
public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
registration.setName("dispatcherServlet");
registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
if(this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
}
따라서 기본 dispatcher Servlet을 덮어쓰지 않으려면 개별 이름을 지정해야 합니다.또한 사용자 정의 Dispathcer Servlet이 연결된 설정 클래스에서 스캔을 설정하려면 @Enable WebMvc 주석을 추가해야 합니다. 그렇지 않으면 @Contrller 주석을 스캔하지 않습니다.
package com.jerryl.rest;
@Configuration
@ComponentScan("org.activiti.rest.service.api")
@EnableWebMvc
public class Cfg_Rest {
・・・
}
rest 서비스 정적 리소스에 대한 DispatcherServlet 액세스 차단마지막으로 작은 문제가 하나 더 있습니다. 추가적으로 설정된 Dispatcher Servlet은 rest 서비스를 제공하는 데 사용되고 싶지만, 이렇게 설정한 후에localhost/rest/에 접근할 때 페이지 등 정적 자원에 접근할 수 있기 때문에 이상합니다.
스프링부트는 기본적으로 정적 자원에 대해 비추지만, 정적 자원에 접근하지 않으려면 이 비추기를 수정할 수 있습니다.
두 가지 방법:
1. 응용 프로그램에서.yml에서 구성:
spring:
mvc:
# /**
static-path-pattern: /**
resources:
# classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 。 , 。
static-locations:
여기에 설정하면springboot 프로젝트 전체에 영향을 줍니다.그러나 기본 Dispatcher Servlet은 정적 리소스에 액세스해야 하므로 여기서 구성할 수 없습니다.2. WebMvcConfigurerAdapter의 자바 클래스 구성을 상속합니다.
@Configuration
@EnableWebMvc
public class Cfg_View extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**");
}
}
addResourceHandlers 다시 쓰기 방법은resourceHandler만 지정하고resourceLocation은 지정하지 않습니다. 이렇게 하면 정적 자원에 대한 모든 접근을 차단하고 정적 자원을 되돌려 주지 않습니다.이 설정은 지정할 수 있습니다. rest 서비스를 담당하는 Dispatcher Servlet의 상하문에서 이 설정 클래스를 스캔하면 됩니다.기본 DispatcherServlet에는 영향을 주지 않습니다.이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.