Spring Boot는 웹 네이티브 구성 요소(Servlet, Filter, Listener)를 등록합니다.

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 주석은 시작 클래스 또는 구성 클래스에만 표시할 수 있습니다.

  1. @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("스프링 부트 서블릿"); 작가.닫기(); } }





  2. @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 销毁”); } }


  3. @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 파괴를 수신합니다"); } }








  4. 시작 클래스에 @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); } }



  5. 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

위의 로그 출력에서 ​​사용자 정의 필터 필터와 리스너 리스너가 적용된 것을 볼 수 있습니다.

  1. 브라우저는 "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

  1. 创建自定义 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("스프링 부트 서블릿");
    작가.닫기();
    }
    }

  2. 사용자 지정 필터를 생성합니다. 코드는 다음과 같습니다.
    패키지 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가 파괴되었습니다."); } }













  3. 커스텀 리스너를 생성합니다. 코드는 다음과 같습니다.
    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 파괴를 수신합니다"); } }








  4. 구성 클래스 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)을 반환합니다. } }



  5. 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 실행)

위의 로그 출력에서 ​​사용자 정의 필터 필터와 리스너 리스너가 적용된 것을 볼 수 있습니다.

  1. 브라우저는 "http://localhost:8080/myServlet"에 접속하고 그 결과는 아래 그림과 같다.

여기에 이미지 설명 삽입

스프링 부트 레지스터 서블릿
그림 1: 스프링 부트 레지스터 서블릿

위 그림에서 알 수 있듯이 Custom Servlet도 등록되어 적용됩니다.

추천

출처blog.csdn.net/weixin_64842782/article/details/125106934