Spring Boot는 기본적으로 Jar 패키지로 배포되기 때문에 기본적으로 web.xml이 없기 때문에 더 이상 이전과 같이 web.xml 구성을 통해 Servlet, Filter, Listener를 사용할 수 없지만 Spring Boot는 2가지 방법을 제공하여 이러한 기본 웹 구성 요소를 등록합니다.
컴포넌트 스캐닝을 통한 등록
RegistrationBean을 통한 등록
컴포넌트 스캐닝을 통한 등록 Servlet 3.0은 @WebServlet: Servlet을 선언하는 데 사용, @WebFilter: Filter를 선언하는 데 사용, @WebListener: Listener를 선언하는 데 사용하는
세 가지 주석을 제공합니다 .
이러한 주석은 해당 구성 요소에 직접 표시할 수 있으며 web.xml의 구성과 동일한 의미를 갖습니다. 각 주석에는 web.xml에 해당하는 속성이 있으며 직접 구성할 수 있으므로 web.xml의 번거로운 구성이 필요하지 않습니다.
이러한 기본 웹 구성 요소를 SpringBoot에 등록하려면 @WebServlet, @WebFilter 및 @WebListener의 세 가지 주석으로 표시된 구성 요소 클래스를 스캔하고 컨테이너에 등록할 수 있는 @ServletComponentScan 주석을 사용할 수 있습니다.
참고: @ServletComponentScan 주석은 시작 클래스 또는 구성 클래스에만 표시할 수 있습니다.
예
-
@WebServlet 주석을 사용하여 사용자 정의 Servlet을 선언하십시오. 코드는 다음과 같습니다.
패키지 tangyu9880.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet
; import
javax.servlet.http.HttpServletRequest; import java.io.PrintWriter ; //@WebServlet 주석을 사용하여 서블릿 선언 @WebServlet(name = "myServlet", urlPatterns = "/myServlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @재정의
보호된 무효 doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(“text/html;charset=UTF-8”); PrintWriter 작가 = resp.getWriter(); writer.write("스프링 부트 서블릿"); 작가.닫기(); } } -
@WebFilter 주석을 사용하여 사용자 지정 필터를 선언합니다. 코드는 다음과 같습니다.
package tangyu9880.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter 주석을 사용하여 사용자 정의 필터 선언
@WebFilter(urlPatterns = (“/myServlet” ))
public class MyFiler implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFiler initialization"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChange) , ServletException { System.out.println("MyFiler doFilter"); chain.doFilter(요청, 응답); }
@Override
public void destroy() { System.out.println(“MyFiler 销毁”); } } -
@WebListener 어노테이션을 사용하여 커스텀 리스너를 선언합니다. 코드는 다음과 같습니다.
package tangyu9880.Listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//@WebListener 주석을 사용하여 커스텀 리스너 선언
@WebListener
public class MyListener implements ServletContextverListener { @O public void contextInitialized(ServletContextEvent sce) { System.out.println("MyListener가 ServletContext 초기화를 수신합니다"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("MyListener가 ServletContext 파괴를 수신합니다"); } }
-
시작 클래스에 @ServletComponentScan 주석을 사용하여 방금 선언한 Servlet, Filter 및 Listener를 스캔하고 컨테이너에 등록하여 사용합니다.코드는 다음과 같습니다.
패키지 tangyu9880;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
public class SpringBootServlet {String [] args) { SpringApplication.run(SpringBootServletApplication.class, args); } }
-
Spring Boot를 시작하고 콘솔 로그는 다음과 같습니다.
.____ _ _ _ _
/\ / ' __ _ ( ) __ __ _ \ \ \
( ( )_ _ | '_ | ' | | ' / ` | \ \ \
\/ )| | )| | | | | || ( | | ) ) ) )
' | | .__| | | | | _ , | / / / /
=========| |============ ==| /=/ / / /
:: 스프링 부트 :: (v2.5.1)
2021-06-23 14:07:04.202 정보 10200 — [ main] nbwww.SpringBootServletApplication : PID 10200(D:\spring-boot-servlet\target\classes 시작 by 79330)의 LAPTOP-C67MRMAG에서 Java 1.8.0_131을 사용하여 SpringBootServletApplication 시작 in D:\spring-boot-servlet)
2021-06-23 14:07:04.205 INFO 10200 — [ main] nbwww.SpringBootServletApplication : 활성 프로파일 세트 없음, 기본 프로파일로 대체: 기본값
2021-06-23 14:07 :05.169 정보 10200 — [ 주] osbwembedded.tomcat.TomcatWebServer : 포트(들)로 초기화된 Tomcat: 8080 (http)
2021-06-23 14:07:05.180 정보 10200 — [ 주] o.apache.catalina.core. StandardService : 서비스 시작 [Tomcat]
2021-06-23 14:07:05.180 INFO 10200 — [ main] org.apache.catalina.core.StandardEngine : 서블릿 엔진 시작: [Apache Tomcat/9.0.46]
2021-06-23 14:07:05.245 INFO 10200 — [ main] oaccC[Tomcat].[localhost].[/] : Spring 내장 WebApplicationContext 초기화 2021-06-23 14:07:05.245 INFO 10200 — [ main]
wscServletWebServerApplicationContext : Root WebApplicationContext: 984ms 내 초기화 완료
MyListener 监听到 ServletContext 初始化
MyFiler 初始化
2021-06-23 14:07:05.543 INFO 10200 — [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat이 포트에서 시작됨: 8080(http) 컨텍스트 경로 ''
2021-06-23 14:07:05.550 INFO 10200 — [ main] nbwww.SpringBootServletApplication : 1.853초 내에 SpringBootServletApplication 시작(2.764 동안 JVM 실행)
MyFiler doFilter
위의 로그 출력에서 사용자 정의 필터 필터와 리스너 리스너가 적용된 것을 볼 수 있습니다.
- 브라우저는 "http://localhost:8080/myServlet"에 접속하고 결과는 다음과 같다.
스프링 부트 레지스터 서블릿
그림 1: 스프링 부트 레지스터 서블릿
위의 그림에서 알 수 있듯이 Custom Servlet도 적용되었습니다.
RegistrationBean을 사용한 등록
또한 구성 클래스에서 RegistrationBean을 사용하여 기본 웹 구성 요소를 등록할 수 있지만 이 방법은 주석 방법보다 번거롭습니다. 이 방식으로 등록된 기본 웹 구성 요소는 더 이상 @WebServlet, @WebListener 및 @WebListener와 같은 주석을 사용할 필요가 없습니다.
RegistrationBean은 컴포넌트를 Servlet 컨테이너에 등록하는 추상 클래스이며 Spring은 각각 Servlet, Filter 및 Listener를 등록하기 위한 세 가지 구현 클래스를 제공합니다.
ServletRegistrationBean: 서블릿 등록 클래스
FilterRegistrationBean: 필터 등록 클래스
ServletListenerRegistrationBean: 리스너 등록 클래스
@Bean 주석을 사용하여 구성 클래스의 Spring 컨테이너에 ServletRegistrationBean, FilterRegistrationBean 및 ServletListenerRegistrationBean을 추가하고 이를 통해 사용자 지정 Servlet, Filter 및 Listener 구성 요소를 컨테이너에 등록할 수 있습니다.
예 2
-
创建自定义 Servlet,代码如下。
package tangyu9880.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(“text/html;charset=UTF-8”);
PrintWriter 작가 = resp.getWriter();
writer.write("스프링 부트 서블릿");
작가.닫기();
}
} -
사용자 지정 필터를 생성합니다. 코드는 다음과 같습니다.
패키지 tangyu9880.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFiler implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFiler initialization"); } @Override public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain chain) throws IOException, ServletException { System.out.println(“MyFiler doFilter”); chain.doFilter(요청, 응답); } @Override public) void destroy( System .out.println("MyFiler가 파괴되었습니다."); } }
-
커스텀 리스너를 생성합니다. 코드는 다음과 같습니다.
package tangyu9880.Listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//ServletContext의 초기화 및 파괴 프로세스 모니터링
public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContext.printoutEvent) { "MyListener는 다음을 수신합니다. ServletContext 초기화"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("MyListener가 ServletContext 파괴를 수신합니다"); } }
-
구성 클래스 MyConfig를 생성하고 @Bean 주석을 사용하여 ServletRegistrationBean, FilterRegistrationBean 및 ServletListenerRegistrationBean을 Spring 컨테이너에 추가하고 이를 사용하여 각각 사용자 지정 Servlet, Filter 및 Listener를 등록합니다.샘플 코드는 다음과 같습니다.
패키지 tangyu9880.config;
import tangyu9880.Listener.MyListener;
import tangyu9880.filter.MyFiler;
import tangyu9880.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.ServletListenerRegistrationBean;
import org .springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
@Configuration
공개 클래스 MyConfig { /**- 서블릿 등록
- @return
/
@Bean
공개 ServletRegistrationBean servletRegistrationBean() { MyServlet myServlet = new MyServlet(); 새로운 ServletRegistrationBean(myServlet, "/myServlet")을 반환합니다. } /
* - 레지스터 필터
- @return
/
@Bean
public FilterRegistrationBean filterRegistrationBean() { MyFiler myFiler = new MyFiler(); FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFiler); //필터가 필터링해야 하는 URL을 등록 filterRegistrationBean.setUrlPatterns(Arrays.asList("/myServlet ” )); filterRegistrationBean 반환; } /
* - 리스너 등록
- @return
*/
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean() { MyListener myListener = new MyListener(); 새로운 ServletListenerRegistrationBean(myListener)을 반환합니다. } }
-
Spring Boot를 시작하고 콘솔 로그는 다음과 같습니다.
.____ _ _ _ _
/\ / ' __ _ ( ) __ __ _ \ \ \
( ( )_ _ | '_ | ' | | ' / ` | \ \ \
\/ )| | )| | | | | || ( | | ) ) ) )
' | | .__| | | | | _ , | / / / /
=========| |============ ==| /=/ / / /
:: 스프링 부트 :: (v2.5.1)
2021-06-23 14:39:16.338 정보 8684 — [ main] nbwww.SpringBootServletApplication : PID 8684가 있는 LAPTOP-C67MRMAG에서 Java 1.8.0_131을 사용하여 SpringBootServletApplication 시작(D:\spring-boot-servlet\target\classes는 79330으로 시작됨) in D:\spring-boot-servlet)
2021-06-23 14:39:16.340 INFO 8684 — [ main] nbwww.SpringBootServletApplication : 활성 프로파일 세트 없음, 기본 프로파일로 대체: 기본값
2021-06-23 14:39 :17.059 정보 8684 — [ 주] osbwembedded.tomcat.TomcatWebServer: 포트(들)로 초기화된 Tomcat: 8080 (http)
2021-06-23 14:39:17.069 정보 8684 — [ 주] o.apache.catalina.core. StandardService : 서비스 시작 중 [Tomcat]
2021-06-23 14:39:17.070 INFO 8684 — [ main] org.apache.catalina.core.StandardEngine : 서블릿 엔진 시작 중: [Apache Tomcat/9.0.46]
2021-06-23 14:39:17.138 INFO 8684 — [ main] oaccC[Tomcat].[localhost].[/] : Spring 내장 WebApplicationContext 초기화 2021-06-23 14:39:17.138 INFO 8684 — [ main]
wscServletWebServerApplicationContext : Root WebApplicationContext: 766ms 내 초기화 완료
MyListener 监听到 ServletContext 初始化
MyFiler 初始化
2021-06-23 14:39:17.390 INFO 8684 — [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat이 포트에서 시작됨: 8080(http) 컨텍스트 경로 ''
2021-06-23 14:39:17.396 INFO 8684 — [ main] nbwww.SpringBootServletApplication : 1.379초 내에 SpringBootServletApplication 시작됨(2.19 동안 JVM 실행)
위의 로그 출력에서 사용자 정의 필터 필터와 리스너 리스너가 적용된 것을 볼 수 있습니다.
- 브라우저는 "http://localhost:8080/myServlet"에 접속하고 그 결과는 아래 그림과 같다.
스프링 부트 레지스터 서블릿
그림 1: 스프링 부트 레지스터 서블릿
위 그림에서 알 수 있듯이 Custom Servlet도 등록되어 적용됩니다.