1. 程式人生 > >Servlet 和Filter的生命週期(springboot測試servlet和filter)

Servlet 和Filter的生命週期(springboot測試servlet和filter)

servlet生命週期:

  1. 通過建構函式例項化Servlet物件;
  2. 當第一次瀏覽器向伺服器傳送請求,訪問servlet;
  3. 呼叫init方法進行初始化 (servlet物件一般只有一個,會常駐記憶體)  init方法只會呼叫一次;
  4. 開啟一個執行緒,去呼叫service方法,以後在訪問這個servlet都會開啟一個執行緒來呼叫service方法去處理請求操作;
  5. 當伺服器關閉時,會呼叫servlet的destroy方法將servlet例項銷燬。

filter生命週期:(其實filter可以看作是一種特殊的servlet,所以生命週期和servlet大致相同)

  1. 通過建構函式例項化;
  2. 初始化init();
  3. 業務邏輯處理:doFilter();
  4. 銷燬:destory()

如何建立servlet:(我建立的是springboot專案)

1.pom.xml

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.建立了一個名為OneServlet的Servlet:

@WebServlet(name = "oneServlet",urlPatterns = "/one");只要在類上加@WebServlet註解就代表這是servlet不用在web.xml中配置servlet了,name屬性,就是以前web.xml中servletname標籤,隨便起就行,urlPatterns = "/one"這個屬性是訪問servlet的路徑
package com.example.demo6.web.servlet;

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

@WebServlet(name = "oneServlet",urlPatterns = "/one")
public class OneServlet extends HttpServlet {
    //構造方法
    public OneServlet() {
        System.out.println("1.OneServlet之構造");
    }
    //doGet方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3.OneServlet之doGet");
    }
    //doPost方法
    @Override
    protected void doPost(HttpServletRequest req, 
HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("3.OneServlet之doPost");
    }
    //銷燬方法
    @Override
    public void destroy() {
        System.out.println("4.OneServlet之destroy");
    }
    //初始化方法
    @Override
    public void init() throws ServletException {
        System.out.println("2.OneServlet之init");
    }
}

3.建立一個名為OneFilter的過濾器:

只要在類上加@WebFilter(filterName = "oneFilter",urlPatterns = "/*")註解就代表這是Filter不用在web.xml中配置Filter了,name屬性,就是以前web.xml中Filtername標籤,隨便起就行,urlPatterns = "/*"這個屬性是攔截servlet的路徑
 

package com.example.demo6.web.servlet;

import com.example.demo6.exception.NotLoginException;
import com.example.demo6.pojo.ManagerUser;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter(filterName = "oneFilter",urlPatterns = "/demo1/*")
public class OneFilter implements Filter {
    public OneFilter() {
        System.out.println("1.過濾器的構造器");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("2.過濾器的init()");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, 
ServletResponse servletResponse,
 FilterChain filterChain) throws IOException, ServletException {
        
        System.out.println("3.過濾器的doFilter()");
    }

    @Override
    public void destroy() {
        System.out.println("4.過濾器的init()");
    }
}

4.然後在啟動類上加@ServletComponentScan(basePackages = "com")這個註解:

表示掃描@webservlet的一系列註解,basePackages = "com"這個屬性表示掃描哪個包下的servlet註解,如果不寫的話,servlet必須建立到啟動類同包或者子包下

5.測試:

啟動專案就會載入如下圖:

訪問路徑:

點選:

over!順序就這樣!