Servlet 和Filter的生命週期(springboot測試servlet和filter)
阿新 • • 發佈:2019-01-14
servlet生命週期:
- 通過建構函式例項化Servlet物件;
- 當第一次瀏覽器向伺服器傳送請求,訪問servlet;
- 呼叫init方法進行初始化 (servlet物件一般只有一個,會常駐記憶體) init方法只會呼叫一次;
- 開啟一個執行緒,去呼叫service方法,以後在訪問這個servlet都會開啟一個執行緒來呼叫service方法去處理請求操作;
- 當伺服器關閉時,會呼叫servlet的destroy方法將servlet例項銷燬。
filter生命週期:(其實filter可以看作是一種特殊的servlet,所以生命週期和servlet大致相同)
- 通過建構函式例項化;
- 初始化init();
- 業務邏輯處理:doFilter();
- 銷燬: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!順序就這樣!