16. Web ネイティブ コンポーネント インジェクション (サーブレット、フィルター、リスナー)


[Shang Silicon Valley] SpringBoot2 Zero-Basic 入門チュートリアル - 講師: Lei Fengyang
Notes

道はまだ続く 夢はまだ待っている

1. ネイティブ サーブレット API を使用する

この方法でネイティブ サーブレット API を使用することをお勧めします。

1.1、サーブレット

Servlet 3.0 以降で提供されるネイティブ アノテーションを使用します。

@WebServlet(urlPatterns = “/my”)

効果: web.xml に構成を記述する必要はなく、直接応答、Spring インターセプターなし、urlPatterns: アクセス パス。

メイン構成クラスでネイティブ サーブレット コンポーネントをスキャンするパッケージを指定します: @ServletComponentScan(basePackages = “com.atguigu.admin.servlet”)。記述されていない場合、グループ構成クラスにあるすべてのパッケージがデフォルトでスキャンされます。

@WebServlet(urlPatterns = "/my") 
public class MyServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.getWriter().write("6666");
    }
}

1.2、フィルター

Servlet 3.0 以降で提供されるネイティブ アノテーションを使用します。

@WebFilter(urlPatterns={“/css/ “,”/images/ ”})

効果: web.xml に構成を記述する必要はありません。urlPatterns: インターセプト パス。複数のパスをインターセプトできます。

@WebFilter(urlPatterns={
    
    "/my"})
public class MyFilter implements Filter {
    
    

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("MyFilter初始化完成");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    
        System.out.println("MyFilter工作");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    
    
        System.out.println("MyFilter销毁");
    }
}

1.3、リスナー

Servlet 3.0 以降で提供されるネイティブ アノテーションを使用します。

@WebListener

@WebListener
public class MyServletContextListener implements ServletContextListener {
    
    

    @Override
    public void contextInitialized(ServletContextEvent sce) {
    
    
        System.out.println("监听项目初始化完成");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    
    
        System.out.println("监听项目销毁");
    }
}

1.4. ネイティブサーブレットがインターセプターによってインターセプトされない理由

システムには 2 つのサーブレットがあります (スプリング ブート: DispatcherServlet –>/ および MyServlet -->/my)

1.5. 拡張機能: DispatchServlet の登録方法

● DispatcherServlet プロパティはコンテナ内で自動的に設定され、WebMvcProperties にバインドされます。対応する設定ファイルの設定項目は spring.mvc です。
● ServletRegistrationBean を通じて DispatcherServlet を設定します。
● デフォルトのマッピングは / パスです。

ここに画像の説明を挿入
Tomcat サーブレットを開発に使用する前に、複数のサーブレット パスが互いに重なり合い、正確な最適化原則を使用して複数のサーブレットが同じレイヤー パスを処理できます。

例:

2 つのパス
A: /my/
B: /my/1
/my/1 が送信されると B パスが使用され、/my/2 が送信されると A パスが使用されます。

2. RegistrationBean を使用する

ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean を使用してコンポーネントを登録することもできます。

@Configuration
public class MyRegistConfig {
    
    

    // servlet
    @Bean
    public ServletRegistrationBean myServlet() {
    
    
        MyServlet servlet = new MyServlet();
        return new ServletRegistrationBean<MyServlet>(servlet, "/my");
    }

    // filter
    @Bean
    public FilterRegistrationBean myFilter() {
    
    
        MyFilter myFilter = new MyFilter();
        FilterRegistrationBean filter = new FilterRegistrationBean(new MyFilter());
        filter.setUrlPatterns(Arrays.asList("/my"));
        return filter;
    }

    // listener
    @Bean
    public ServletListenerRegistrationBean myListener() {
    
    
        MyServletContextListener listener = new MyServletContextListener();
        return new ServletListenerRegistrationBean(listener);
    }
}

おすすめ

転載: blog.csdn.net/zhao854116434/article/details/130251261