SpringBoot學習筆記(6)----SpringBoot中使用Servlet,Filter,Listener的三種方式


  在一般的運用開發中Controller已經大部分都能夠實現了,但是也不排除需要自己實現Servlet,Filter,Listener的方式,SpringBoot提供了三種實現方式。

1. 使用Bean的實現方式

首先創建一個Servlet,一個Filter,一個Listener,

DemoServlet.java

 

package com.wangx.boot.util.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get method");
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post method");
        resp.getWriter().write("hello world");
    }
}

  DemoFilter.java

package com.wangx.boot.util.filter;


import javax.servlet.*;
import java.io.IOException;

public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("開始攔截了....");
    }

    @Override
    public void destroy() {

    }
}

DemoListener.java

package com.wangx.boot.util.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class DemoListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed");
    }
}

然后直接在SpringBoot的啟動類中將上面幾個方法注冊為Bean,

SpringBootDemo01Application.java
package com.wangx.boot;

import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener;
import com.wangx.boot.util.servlet.DemoServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringBootDemo01Application {

    /**
     * 注冊Servlet
     * @return
     */
    @Bean
    public ServletRegistrationBean createServlet () {
        //第二個參數為urlPartern
        return new ServletRegistrationBean(new DemoServlet(), "/demoServlet");
    }

    /**
     * 注冊Filter
     * @return
     */
    @Bean
    public FilterRegistrationBean createFilter() {
        //第二個參數為需要攔截的路徑,不傳則攔截所有
        return new FilterRegistrationBean(new DemoFilter(), createServlet());
    }

    /**
     * 注冊Listener
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean createrListener() {
        //自定義個Listener.監聽整個Context的Servlet
        return new ServletListenerRegistrationBean(new DemoListener());
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemo01Application.class, args);
    }
}

  啟動項目時會Listener會打印contextInitialized,關閉時會打印contextDestroyed,訪問時攔截器打印"開始攔截了....",並成功訪問到Servlet,並輸入hello world到瀏覽器上。

2. 實現ServletContextInitializer接口

  直接在SpringBoot的啟動類中實現ServletContextInitializer,重寫onStartup()方法也可以使用Servlet.Filter,Listener,以上面三個Demo類為例,使用ServletContextInitializer的方式的代碼:

package com.wangx.boot;

import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener;
import com.wangx.boot.util.servlet.DemoServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletContextInitializer;

import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.EnumSet;


@SpringBootApplication
public class SpringBootDemo01Application implements ServletContextInitializer {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemo01Application.class, args);
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //創建Servlet,並映射訪問路徑為demoServlet
        servletContext.addServlet("demoServlet", new DemoServlet()).addMapping("/demoServlet");
        //創建Filter,攔截的Servlet
        servletContext.addFilter("demoFilter", new DemoFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.FORWARD), true, "demoServlet"); //創建Listener servletContext.addListener(new DemoListener()); } }

  運行結果與1相同

3. 使用注解的方式

  這是一個SpringBoot官方推薦的方式,也是三種方式中最簡單的方式,只需要在SpringBoot的啟動類上添加@ServletComponentScan注解,在DemoServlet類上添加@WebServlet(name = "demoServlet", urlPatterns = "/demoServlet")注解,DemoFilter類上添加@WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)(攔截所有請求),DemoListener類上添加@WebListener即可,運行結果與1相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM